14#include "flint/flint.h"
15#if __FLINT_RELEASE >= 20503
23#define TRANSEXT_PRIVATES
28typedef fmpq_rat_struct *fmpq_rat_ptr;
29typedef fmpq_mpoly_struct *fmpq_mpoly_ptr;
30typedef fmpq_mpoly_ctx_struct *fmpq_ctx_ptr;
32typedef fmpq_rat_data_struct *data_ptr;
43 const char * start =
s;
45 while (*
s >=
'0' && *
s <=
'9')
s++;
48 fmpz_set_str(
i, start, 10);
54 fmpz_set_str(
i, start, 10);
60static void fmpq_rat_init(fmpq_rat_ptr a,
const coeffs r)
62 fmpq_mpoly_init(a->num, ((data_ptr)r->data)->ctx);
63 fmpq_mpoly_init(a->den, ((data_ptr)r->data)->ctx);
66static void fmpq_rat_clear(fmpq_rat_ptr a,
const coeffs r)
68 fmpq_mpoly_clear(a->num, ((data_ptr)r->data)->ctx);
69 fmpq_mpoly_clear(a->den, ((data_ptr)r->data)->ctx);
72static void fmpq_rat_canonicalise(fmpq_rat_ptr a,
const coeffs )
77 fmpz_gcd(n, fmpq_numref(a->num->content), fmpq_numref(a->den->content));
78 fmpz_lcm(d, fmpq_denref(a->num->content), fmpq_denref(a->den->content));
81 fmpq_mul_fmpz(a->num->content, a->num->content, d);
82 fmpq_mul_fmpz(a->den->content, a->den->content, d);
86 fmpq_div_fmpz(a->num->content, a->num->content, n);
87 fmpq_div_fmpz(a->den->content, a->den->content, n);
101 const QaInfo *par=(QaInfo*)parameter;
102 if (par->N != c->iNumberOfParameters)
return FALSE;
104 for(
int i=0;
i<par->N;
i++)
106 if (strcmp(par->names[
i],c->pParameterNames[
i])!=0)
return FALSE;
113static number
Mult(number a, number
b,
const coeffs c)
117 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
118 fmpq_rat_init(
res, c);
119 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
120 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
121 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
122 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
124 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
125 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
127 else if (fmpq_mpoly_is_one(
x->den, ctx))
130 fmpq_mpoly_init(
gd, ctx);
131 fmpq_mpoly_gcd(
gd,
x->num,
y->den, ctx);
132 if (fmpq_mpoly_is_one(
gd, ctx))
134 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
135 fmpq_mpoly_set(
res->den,
y->den, ctx);
139 fmpq_mpoly_div(
res->num,
x->num,
gd, ctx);
140 fmpq_mpoly_mul(
res->num,
res->num,
y->num, ctx);
141 fmpq_mpoly_div(
res->den,
y->den,
gd, ctx);
143 fmpq_mpoly_clear(
gd, ctx);
145 else if (fmpq_mpoly_is_one(
y->den, ctx))
148 fmpq_mpoly_init(
gd, ctx);
149 fmpq_mpoly_gcd(
gd,
y->num,
x->den, ctx);
150 if (fmpq_mpoly_is_one(
gd, ctx))
152 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
153 fmpq_mpoly_set(
res->den,
x->den, ctx);
157 fmpq_mpoly_div(
res->num,
y->num,
gd, ctx);
158 fmpq_mpoly_mul(
res->num,
res->num,
x->num, ctx);
159 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
161 fmpq_mpoly_clear(
gd, ctx);
166 fmpq_mpoly_ptr n1, n2, d1, d2;
167 fmpq_mpoly_init(g1, ctx);
168 fmpq_mpoly_init(g2, ctx);
169 fmpq_mpoly_gcd(g1,
x->num,
y->den, ctx);
170 fmpq_mpoly_gcd(g2,
y->num,
x->den, ctx);
171 n1 =
x->num; d2 =
y->den;
172 d1 =
x->den; n2 =
y->num;
173 if (!fmpq_mpoly_is_one(g1, ctx))
175 fmpq_mpoly_div(
res->num,
x->num, g1, ctx);
176 fmpq_mpoly_div(g1,
y->den, g1, ctx);
177 n1 =
res->num; d2 = g1;
179 if (!fmpq_mpoly_is_one(g2, ctx))
181 fmpq_mpoly_div(
res->den,
y->num, g2, ctx);
182 fmpq_mpoly_div(g2,
x->den, g2, ctx);
183 n2 =
res->den; d1 = g2;
185 fmpq_mpoly_mul(
res->num, n1, n2, ctx);
186 fmpq_mpoly_mul(
res->den, d1, d2, ctx);
187 fmpq_mpoly_clear(g1, ctx);
188 fmpq_mpoly_clear(g2, ctx);
190 fmpq_rat_canonicalise(
res, c);
198static number
Sub(number a, number
b,
const coeffs c)
200 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
201 fmpq_rat_init(
res, c);
202 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
203 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
204 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
205 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
207 fmpq_mpoly_sub(
res->num,
x->num,
y->num, ctx);
208 if (fmpq_mpoly_is_zero(
res->num, ctx))
210 fmpq_mpoly_one(
res->den, ctx);
215 if (fmpq_mpoly_is_one(
x->den, ctx))
217 fmpq_mpoly_set(
res->den,
x->den, ctx);
224 fmpq_mpoly_init(
gd, ctx);
225 fmpq_mpoly_gcd(
gd,
res->num,
x->den, ctx);
226 if (fmpq_mpoly_is_one(
gd, ctx))
228 fmpq_mpoly_set(
res->den,
x->den, ctx);
232 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
233 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
235 fmpq_mpoly_clear(
gd, ctx);
238 else if (fmpq_mpoly_is_one(
x->den, ctx))
240 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
241 fmpq_mpoly_sub(
res->num,
res->num,
y->num, ctx);
242 if (fmpq_mpoly_is_zero(
res->num, ctx))
244 fmpq_mpoly_one(
res->den, ctx);
250 fmpq_mpoly_set(
res->den,
y->den, ctx);
253 else if (fmpq_mpoly_is_one(
y->den, ctx))
255 fmpq_mpoly_mul(
res->num,
y->num,
x->den, ctx);
256 fmpq_mpoly_sub(
res->num,
x->num,
res->num, ctx);
257 if (fmpq_mpoly_is_zero(
res->num,ctx))
259 fmpq_mpoly_one(
res->den, ctx);
265 fmpq_mpoly_set(
res->den,
x->den, ctx);
271 fmpq_mpoly_init(
gd, ctx);
272 fmpq_mpoly_gcd(
gd,
x->den,
y->den, ctx);
273 if (fmpq_mpoly_is_one(
gd, ctx))
275 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
276 fmpq_mpoly_mul(
gd,
y->num,
x->den, ctx);
277 fmpq_mpoly_sub(
res->num,
res->num,
gd, ctx);
278 if (fmpq_mpoly_is_zero(
res->num,ctx))
280 fmpq_mpoly_one(
res->den, ctx);
286 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
292 fmpq_mpoly_init(q2, ctx);
293 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
294 fmpq_mpoly_div(q2,
y->den,
gd, ctx);
295 fmpq_mpoly_mul(
res->num, q2,
x->num, ctx);
296 fmpq_mpoly_mul(
res->den,
res->den,
y->num, ctx);
297 fmpq_mpoly_sub(
res->num,
res->num,
res->den, ctx);
298 fmpq_mpoly_gcd(
res->den,
res->num,
gd, ctx);
299 if (fmpq_mpoly_is_one(
res->den, ctx))
301 fmpq_mpoly_mul(
res->den, q2,
x->den, ctx);
305 fmpq_mpoly_div(
res->num,
res->num,
res->den, ctx);
306 fmpq_mpoly_div(
gd,
x->den,
res->den, ctx);
307 fmpq_mpoly_mul(
res->den,
gd, q2, ctx);
309 fmpq_mpoly_clear(q2, ctx);
311 fmpq_mpoly_clear(
gd, ctx);
314 res->p=
n_Sub(
x->p,
y->p, ((data_ptr)c->data)->C);
320static number
Add(number a, number
b,
const coeffs c)
322 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
323 fmpq_rat_init(
res, c);
324 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
325 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
326 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
327 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
329 fmpq_mpoly_add(
res->num,
x->num,
y->num, ctx);
330 if (fmpq_mpoly_is_zero(
res->num, ctx))
332 fmpq_mpoly_one(
res->den, ctx);
337 if (fmpq_mpoly_is_one(
x->den, ctx))
339 fmpq_mpoly_set(
res->den,
x->den, ctx);
346 fmpq_mpoly_init(
gd, ctx);
347 fmpq_mpoly_gcd(
gd,
res->num,
x->den, ctx);
348 if (fmpq_mpoly_is_one(
gd, ctx))
350 fmpq_mpoly_set(
res->den,
x->den, ctx);
354 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
355 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
357 fmpq_mpoly_clear(
gd, ctx);
360 else if (fmpq_mpoly_is_one(
x->den, ctx))
362 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
363 fmpq_mpoly_add(
res->num,
res->num,
y->num, ctx);
364 if (fmpq_mpoly_is_zero(
res->num, ctx))
366 fmpq_mpoly_one(
res->den, ctx);
372 fmpq_mpoly_set(
res->den,
y->den, ctx);
375 else if (fmpq_mpoly_is_one(
y->den, ctx))
377 fmpq_mpoly_mul(
res->num,
y->num,
x->den, ctx);
378 fmpq_mpoly_add(
res->num,
x->num,
res->num, ctx);
379 if (fmpq_mpoly_is_zero(
res->num, ctx))
381 fmpq_mpoly_one(
res->den, ctx);
387 fmpq_mpoly_set(
res->den,
x->den, ctx);
393 fmpq_mpoly_init(
gd, ctx);
394 fmpq_mpoly_gcd(
gd,
x->den,
y->den, ctx);
395 if (fmpq_mpoly_is_one(
gd, ctx))
397 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
398 fmpq_mpoly_mul(
gd,
y->num,
x->den, ctx);
399 fmpq_mpoly_add(
res->num,
res->num,
gd, ctx);
400 if (fmpq_mpoly_is_zero(
res->num,ctx))
402 fmpq_mpoly_one(
res->den, ctx);
408 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
414 fmpq_mpoly_init(q2, ctx);
415 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
416 fmpq_mpoly_div(q2,
y->den,
gd, ctx);
417 fmpq_mpoly_mul(
res->num, q2,
x->num, ctx);
418 fmpq_mpoly_mul(
res->den,
res->den,
y->num, ctx);
419 fmpq_mpoly_add(
res->num,
res->num,
res->den, ctx);
420 fmpq_mpoly_gcd(
res->den,
res->num,
gd, ctx);
421 if (fmpq_mpoly_is_one(
res->den, ctx))
423 fmpq_mpoly_mul(
res->den, q2,
x->den, ctx);
427 fmpq_mpoly_div(
res->num,
res->num,
res->den, ctx);
428 fmpq_mpoly_div(
gd,
x->den,
res->den, ctx);
429 fmpq_mpoly_mul(
res->den,
gd, q2, ctx);
431 fmpq_mpoly_clear(q2, ctx);
433 fmpq_mpoly_clear(
gd, ctx);
436 res->p=
n_Add(
x->p,
y->p, ((data_ptr)c->data)->C);
442static number
Div(number a, number
b,
const coeffs c)
444 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
445 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
446 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
447 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
448 fmpq_rat_init(
res, c);
449 if (fmpq_mpoly_is_zero(
y->num, ctx))
454 if (fmpq_mpoly_equal(
x->den,
y->num, ctx))
456 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
457 fmpq_mpoly_mul(
res->den,
x->den,
y->num, ctx);
459 else if (fmpq_mpoly_is_one(
x->den, ctx))
462 fmpq_mpoly_init(
gd, ctx);
463 fmpq_mpoly_gcd(
gd,
x->num,
y->num, ctx);
464 if (fmpq_mpoly_is_one(
gd, ctx))
466 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
467 fmpq_mpoly_set(
res->den,
y->num, ctx);
471 fmpq_mpoly_div(
res->num,
x->num,
gd, ctx);
472 fmpq_mpoly_mul(
res->num,
res->num,
y->den, ctx);
473 fmpq_mpoly_div(
res->den,
y->num,
gd, ctx);
475 fmpq_mpoly_clear(
gd, ctx);
477 else if (fmpq_mpoly_is_one(
y->num, ctx))
480 fmpq_mpoly_init(
gd, ctx);
481 fmpq_mpoly_gcd(
gd,
y->den,
x->den, ctx);
482 if (fmpq_mpoly_is_one(
gd, ctx))
484 fmpq_mpoly_mul(
res->num,
y->den,
x->num, ctx);
485 fmpq_mpoly_set(
res->den,
x->den, ctx);
489 fmpq_mpoly_div(
res->num,
y->den,
gd, ctx);
490 fmpq_mpoly_mul(
res->num,
res->num,
x->num, ctx);
491 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
493 fmpq_mpoly_clear(
gd, ctx);
498 fmpq_mpoly_ptr n1, n2, d1, d2;
499 fmpq_mpoly_init(g1, ctx);
500 fmpq_mpoly_init(g2, ctx);
501 fmpq_mpoly_gcd(g1,
x->num,
y->num, ctx);
502 fmpq_mpoly_gcd(g2,
y->den,
x->den, ctx);
503 n1 =
x->num; d2 =
y->num;
504 d1 =
x->den; n2 =
y->den;
505 if (!fmpq_mpoly_is_one(g1, ctx))
507 fmpq_mpoly_div(
res->num,
x->num, g1, ctx);
508 fmpq_mpoly_div(g1,
y->num, g1, ctx);
509 n1 =
res->num; d2 = g1;
511 if (!fmpq_mpoly_is_one(g2, ctx))
513 fmpq_mpoly_div(
res->den,
y->den, g2, ctx);
514 fmpq_mpoly_div(g2,
x->den, g2, ctx);
515 n2 =
res->den; d1 = g2;
517 fmpq_mpoly_mul(
res->num, n1, n2, ctx);
518 fmpq_mpoly_mul(
res->den, d1, d2, ctx);
519 fmpq_mpoly_clear(g1, ctx);
520 fmpq_mpoly_clear(g2, ctx);
522 fmpq_rat_canonicalise(
res, c);
524 res->p=
n_Div(
x->p,
y->p, ((data_ptr)c->data)->C);
532 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
533 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
534 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
535 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
536 fmpq_rat_init(
res, c);
537 if (fmpq_mpoly_is_zero(
y->num, ctx))
542 fmpq_mpoly_div(
res->num,
x->num,
y->num, ctx);
543 assume(fmpq_mpoly_is_one(
x->den, ctx));
544 assume(fmpq_mpoly_is_one(
y->den, ctx));
558 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
559 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
560 fmpq_rat_init(
res, c);
561 fmpq_mpoly_set_si(
res->num, (
slong)
i, ctx);
562 fmpq_mpoly_set_si(
res->den, (
slong) 1, ctx);
572 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
573 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
577 fmpq_rat_init(
res, c);
578 fmpq_mpoly_set_fmpz(
res->num, t, ctx);
579 fmpq_mpoly_set_si(
res->den, (
slong) 1, ctx);
590 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
591 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
592 if (fmpq_mpoly_is_zero(
x->num, ctx))
594 unsigned long len=fmpq_mpoly_length(
x->num, ctx) +
595 fmpq_mpoly_length(
x->den, ctx)-fmpq_mpoly_is_one(
x->den, ctx);
596 unsigned long numDegree=fmpq_mpoly_total_degree_si(
x->num, ctx);
597 unsigned long denDegree=fmpq_mpoly_total_degree_si(
x->den, ctx);
598 unsigned long t= ((numDegree + denDegree)*(numDegree + denDegree) + 1) * len;
599 if (t>INT_MAX)
return INT_MAX;
603static long Int(number &n,
const coeffs c)
605 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
606 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
607 if (fmpq_mpoly_is_fmpq(
x->den, ctx) && fmpq_mpoly_is_fmpq(
x->num, ctx))
612 fmpq_div(r,
x->num->content,
x->den->content);
613 if (fmpz_is_one(fmpq_denref(r)))
615 if (fmpz_fits_si(fmpq_numref(r)))
616 nl = fmpz_get_si(fmpq_numref(r));
627 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
628 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
629 if (fmpq_mpoly_is_fmpq(
x->den, ctx) && fmpq_mpoly_is_fmpq(
x->num, ctx))
633 fmpq_div(r,
x->num->content,
x->den->content);
634 if (fmpz_is_one(fmpq_denref(r)))
636 fmpz_get_mpz(
result, fmpq_numref(r));
642static number
Neg(number a,
const coeffs c)
644 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
645 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
646 fmpq_mpoly_neg(
x->num,
x->num, ctx);
656 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
657 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
658 if (fmpq_mpoly_is_zero(
x->num, ctx))
665 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
666 fmpq_rat_init(
res, c);
667 fmpq_mpoly_set(
res->num,
x->den, ctx);
668 fmpq_mpoly_set(
res->den,
x->num, ctx);
679 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
680 fmpq_rat_init(
res, c);
681 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
682 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
683 fmpq_mpoly_set(
res->num,
x->num, ctx);
684 fmpq_mpoly_set(
res->den,
x->den, ctx);
703 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
704 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
705 if (!fmpq_mpoly_is_fmpq(
x->num, ctx))
707 if (!fmpq_mpoly_is_fmpq(
x->den, ctx))
709 return fmpq_equal(
x->num->content,
x->den->content);
714 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
715 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
716 return fmpq_mpoly_is_zero(
x->num, ctx);
719static void WriteLong(number a,
const coeffs c)
727 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
728 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
729 if (fmpq_mpoly_is_zero(
x->den, ctx))
735 long int i,
j,
k, nmax_i, dmax_i, max_digits;
736 fmpq_rat_canonicalise(
x, c);
737 if (fmpq_mpoly_is_zero(
x->num, ctx))
741 BOOLEAN num_is_const = fmpq_mpoly_is_fmpq(
x->num, ctx);
742 BOOLEAN den_is_const = fmpq_mpoly_is_fmpq(
x->den, ctx);
744 fmpq_mpoly_struct * znum =
x->num;
745 fmpq_mpoly_struct * zden =
x->den;
746 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
750 for (
i = 1;
i < fmpq_mpoly_length(znum, ctx);
i++)
752 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
753 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx)) > 0)
758 for (
i = 1;
i < fmpq_mpoly_length(zden, ctx);
i++)
760 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
761 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
766 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx),
767 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
769 fmpz_mul(t, fmpq_numref(
x->num->content),
770 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx));
771 max_digits = fmpz_sizeinbase(t, 10);
775 fmpz_mul(t, fmpq_numref(
x->den->content),
776 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx));
777 max_digits =fmpz_sizeinbase(t, 10);
779 char *
s = (
char*)
omAlloc(max_digits + 5);
782 if (fmpq_mpoly_is_one(
x->num, ctx))
786 for (
i = 0;
i < fmpq_mpoly_length(
x->num, ctx);
i++)
789 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
790 fmpq_numref(
x->num->content));
791 if (
i != 0 && fmpz_sgn(t) > 0)
796 fmpz_get_str(
s, 10, t);
799 while((
l>0)&&(!isdigit(
s[
l])))
l--;
802 if (strcmp(
s,
"-1")==0)
816 for (
j = 0;
j < c->iNumberOfParameters;
j++)
818 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
836 if (!fmpq_mpoly_is_one(
x->den, ctx))
843 closing_paren =
TRUE;
845 for (
i = 0;
i < fmpq_mpoly_length(
x->den, ctx);
i++)
848 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
849 fmpq_numref(
x->den->content));
852 if ((fmpz_sgn(t) < 0) && den_is_const)
855 closing_paren =
TRUE;
858 else if (fmpz_sgn(t) > 0)
862 fmpz_get_str(
s, 10, t);
865 while((
l>0)&&(!isdigit(
s[
l])))
l--;
874 for (
j = 0;
j < nvars;
j++)
876 k = fmpq_mpoly_get_term_var_exp_ui(
x->den,
i,
j, ctx);
899 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
900 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
903 long int i,
j,
k, nmax_i, dmax_i, max_digits;
904 fmpq_rat_canonicalise(
x, c);
905 if (fmpq_mpoly_is_zero(
x->num, ctx))
909 BOOLEAN num_is_const = fmpq_mpoly_is_fmpq(
x->num, ctx);
910 BOOLEAN den_is_const = fmpq_mpoly_is_fmpq(
x->den, ctx);
911 fmpq_mpoly_struct * znum =
x->num;
912 fmpq_mpoly_struct * zden =
x->den;
913 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
917 for (
i = 1;
i < fmpq_mpoly_length(znum, ctx);
i++)
919 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
920 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx)) > 0)
925 for (
i = 1;
i < fmpq_mpoly_length(zden, ctx);
i++)
927 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
928 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
933 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx),
934 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
936 fmpz_mul(t, fmpq_numref(
x->num->content),
937 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx));
938 max_digits = fmpz_sizeinbase(t, 10);
941 fmpz_mul(t, fmpq_numref(
x->den->content),
942 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx));
943 max_digits = fmpz_sizeinbase(t, 10);
945 s = (
char*)
omAlloc(max_digits + 2);
948 if (fmpq_mpoly_is_one(
x->num, ctx))
952 for (
i = 0;
i < fmpq_mpoly_length(
x->num, ctx);
i++)
954 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
955 fmpq_numref(
x->num->content));
956 if (
i != 0 && fmpz_sgn(t) > 0)
960 fmpz_get_str(
s, 10, t);
963 for (
j = 0;
j < nvars;
j++)
965 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
978 if (!fmpq_mpoly_is_one(
x->den, ctx))
983 for (
i = 0;
i < fmpq_mpoly_length(
x->den, ctx);
i++)
985 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
986 fmpq_numref(
x->den->content));
987 if (
i != 0 && fmpz_sgn(t) > 0)
991 fmpz_get_str(
s, 10, t);
994 for (
j = 0;
j < nvars;
j++)
996 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
1013static const char*
Read(
const char * st, number * a,
const coeffs c)
1018 char *
s = (
char *) st;
1019 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1020 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
1021 *a = (number)
omAlloc(
sizeof(fmpq_rat_struct));
1022 fmpq_rat_init((fmpq_rat_ptr)(*a), c);
1034 fmpq_mpoly_set_fmpz(((fmpq_rat_ptr)(*a))->
num, z, ctx);
1035 fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
den, ctx);
1040 fmpq_mpoly_scalar_div_fmpz(((fmpq_rat_ptr)(*a))->
num,
1041 ((fmpq_rat_ptr)(*a))->
num, z, ctx);
1048 for (
j = 0;
j < nvars;
j++)
1050 if (strncmp(
s, c->pParameterNames[
j],
1051 strlen(c->pParameterNames[
j])) == 0)
1054 fmpq_mpoly_gen(((fmpq_rat_ptr)(*a))->
num,
j, ctx);
1055 s += strlen(c->pParameterNames[
j]);
1062 fmpq_mpoly_pow_ui(((fmpq_rat_ptr)(*a))->
num,
1063 ((fmpq_rat_ptr)(*a))->
num, (
long int)
i, ctx);
1068 if (!
found) fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
num, ctx);
1069 fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
den, ctx);
1072 fmpq_mpoly_neg(((fmpq_rat_ptr)(*a))->
num, ((fmpq_rat_ptr)(*a))->
num, ctx);
1074 poly
pp=convFlintMPSingP(((fmpq_rat_ptr)(*a))->
num,ctx,((data_ptr)c->data)->C->extRing);
1075 fraction
f=(fraction)
n_Init(1,((data_ptr)c->data)->C);
1077 ((fmpq_rat_ptr)(*a))->
p=(number)
f;
1092 const fmpq_rat_ptr
x = (fmpq_rat_ptr) *a;
1093 fmpq_rat_clear(
x, c);
1095 n_Delete(&(
x->p),((data_ptr)c->data)->C);
1104 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1105 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1106 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1107 if (!fmpz_mpoly_equal(
x->num->zpoly,
y->num->zpoly, ctx->zctx))
1111 if (!fmpz_mpoly_equal(
x->den->zpoly,
y->den->zpoly, ctx->zctx))
1118 fmpz_mul(t1, fmpq_numref(
x->num->content), fmpq_denref(
x->den->content));
1119 fmpz_mul(t1, t1, fmpq_denref(
y->num->content));
1120 fmpz_mul(t1, t1, fmpq_numref(
y->den->content));
1121 fmpz_mul(t2, fmpq_numref(
y->num->content), fmpq_denref(
y->den->content));
1122 fmpz_mul(t2, t2, fmpq_denref(
x->num->content));
1123 fmpz_mul(t2, t2, fmpq_numref(
x->den->content));
1124 int eq = fmpz_equal(t1, t2);
1134 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1135 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1136 if (!fmpq_mpoly_is_fmpq(
x->num, ctx))
1138 if (!fmpq_mpoly_is_fmpq(
x->den, ctx))
1141 fmpq_neg(
content,
x->num->content);
1142 int eq = fmpq_equal(
content,
x->den->content);
1155 fmpq_rat_init((fmpq_rat_ptr) (*
result), c);
1156 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1157 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1164 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
1165 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1166 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1167 fmpq_rat_init(
res, c);
1168 fmpq_mpoly_set(
res->num,
x->den, ctx);
1169 fmpq_mpoly_one(
res->den, ctx);
1170 return (number)
res;
1175 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
1176 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1177 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1178 fmpq_rat_init(
res, c);
1179 fmpq_mpoly_set(
res->num,
x->num, ctx);
1180 fmpq_mpoly_one(
res->den, ctx);
1181 return (number)
res;
1184static number
ExtGcd(number , number , number* , number* ,
const coeffs )
1186 WerrorS(
"not a Euclidean ring: ExtGcd");
1190static number
Lcm(number , number ,
const coeffs )
1196static number Q2Frac(number a,
const coeffs ,
const coeffs dst)
1222static number Z2Frac(number a,
const coeffs ,
const coeffs dst)
1224 return InitMPZ((mpz_ptr)a,dst);
1227static number Zp2Frac(number a,
const coeffs src,
const coeffs dst)
1256 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)(dst->data))->ctx;
1257 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1259 fmpq_rat_init(
res, dst);
1267 fmpz_set_mpz(
f,
i->z);
1268 fmpq_mpoly_set_fmpz(
res->num,
f, ctx);
1271 fmpq_mpoly_set_si(
res->den, 1, ctx);
1272 return (number)
res;
1288 WerrorS(
"not yet: ChineseRemainder");
1295 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1296 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1297 return (
int) (fmpq_mpoly_total_degree_si(
x->num, ctx) -
1298 fmpq_mpoly_total_degree_si(
x->den, ctx));
1303 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1304 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1305 fmpq_rat_init(
res, c);
1306 fmpq_mpoly_gen(
res->num, (
slong)
i, ctx);
1307 fmpq_mpoly_one(
res->den, ctx);
1308 return (number)
res;
1311static number SubringGcd(number a, number
b,
const coeffs c)
1313 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1314 fmpq_rat_init(
res, c);
1315 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1316 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1317 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1318 fmpq_mpoly_gcd(
res->num,
x->num,
y->num, ctx);
1322 fmpz_gcd(cont, fmpq_numref(
x->num->content), fmpq_numref(
y->num->content));
1323 if (!fmpz_is_one(cont))
1325 fmpq_mul_fmpz(
res->num->content,
res->num->content, cont);
1327 fmpz_gcd(cont, fmpq_denref(
x->num->content), fmpq_denref(
y->num->content));
1328 if (!fmpz_is_one(cont))
1330 fmpq_div_fmpz(
res->num->content,
res->num->content, cont);
1333 fmpq_mpoly_one(
res->den, ctx);
1334 fmpq_rat_canonicalise(
res, c);
1339 return (number)
res;
1342static number NormalizeHelper(number a, number
b,
const coeffs c)
1344 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1345 fmpq_rat_init(
res, c);
1346 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1347 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1348 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1350 fmpq_mpoly_init(
gd,ctx);
1351 fmpq_mpoly_one(
gd,ctx);
1352 fmpq_mpoly_gcd(
gd,
x->num,
y->den, ctx);
1353 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
1354 if (!fmpq_mpoly_is_one(
gd, ctx))
1355 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
1356 fmpq_mpoly_one(
res->den, ctx);
1361 return (number)
res;
1430 WerrorS(
"not yet: ConvFactoryNSingN");
1438 WerrorS(
"not yet: ConvSingNFactoryN");
1443char * QratCoeffName(
const coeffs c)
1446 sprintf(CoeffName_flint_Qrat,
"flintQQ(%s",c->pParameterNames[0]);
1447 for(
int i=1;
i<c->iNumberOfParameters;
i++)
1449 strcat(CoeffName_flint_Qrat,
",");
1450 strcat(CoeffName_flint_Qrat,c->pParameterNames[
i]);
1452 strcat(CoeffName_flint_Qrat,
")");
1453 return (
char*) CoeffName_flint_Qrat;
1459 const char start[] =
"flintQ(";
1460 const int start_len = strlen(start);
1461 if (strncmp(
s, start, start_len) == 0)
1469 while((*
p!=
',')&&(*
p!=
')')&&(*
p!=
'\0'))
p++;
1470 if (*
p==
',') {
p++;
N++;}
1471 else if (*
p==
')') {
p++;
N++;
break;}
1472 else if (*
p==
'\0') {
break;}
1480 while((*
p!=
',')&&(*
p!=
')')&&(*
p!=
'\0'))
p++;
1481 if ((*
p==
',')||(*
p=
')'))
1492 if (*
p==
'\0')
break;
1507 const fmpq_rat_ptr
x = (fmpq_rat_ptr) c;
1510 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)
cf->data)->ctx;
1511 fmpq_mpoly_assert_canonical(
x->num,ctx);
1512 fmpq_mpoly_assert_canonical(
x->den,ctx);
1513 if (fmpq_mpoly_is_zero(
x->den, ctx))
1521 fmpz_gcd(n, fmpq_numref(
x->num->content), fmpq_numref(
x->den->content));
1522 fmpz_lcm(d, fmpq_denref(
x->num->content), fmpq_denref(
x->den->content));
1523 if (!fmpz_is_one(d))
1528 if (!fmpz_is_one(n))
1536 poly
pp=convFlintMPSingP(
x->num,ctx,((data_ptr)
cf->data)->C->extRing);
1537 fraction
f=(fraction)
x->p;
1555 pp=convFlintMPSingP(
x->den,ctx,((data_ptr)
cf->data)->C->extRing);
1574 for(
int i=0;
i<
cf->iNumberOfParameters;
i++)
1577 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)
cf->data)->ctx;
1578 fmpq_mpoly_ctx_clear(ctx);
1584 QaInfo *
pp=(QaInfo*)infoStruct;
1585 cf->cfCoeffName = QratCoeffName;
1593 cf->cfExactDiv =
Div;
1604 cf->cfWriteLong = WriteLong;
1605 cf->cfWriteShort = WriteLong;
1625 cf->cfSubringGcd = SubringGcd;
1626 cf->cfNormalizeHelper= NormalizeHelper;
1646 cf->iNumberOfParameters =
pp->N;
1647 char **pn = (
char**)
omAlloc0(
pp->N*
sizeof(
char*));
1648 for(
int i=0;
i<
pp->N;
i++)
1652 cf->pParameterNames = (
const char **) pn;
1653 cf->has_simple_Inverse =
FALSE;
1658 fmpq_rat_data_struct *ps=(fmpq_rat_data_struct*)
omAlloc(
sizeof(fmpq_rat_data_struct));
1659 ps->ctx=(fmpq_mpoly_ctx_struct*)
omAlloc(
sizeof(fmpq_mpoly_ctx_struct));
1663 fmpq_mpoly_ctx_init(ps->ctx,
pp->N,ORD_LEX);
const CanonicalForm CFMap CFMap & N
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
static FORCE_INLINE long n_Int(number &n, const coeffs r)
conversion of n to an int; 0 if not possible in Z/pZ: the representing int lying in (-p/2 ....
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
static FORCE_INLINE number n_NormalizeHelper(number a, number b, const coeffs r)
assume that r is a quotient field (otherwise, return 1) for arguments (a1/a2,b1/b2) return (lcm(a1,...
static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
return the sum of 'a' and 'b', i.e., a+b
number ndCopyMap(number a, const coeffs src, const coeffs dst)
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
static FORCE_INLINE number n_Invers(number a, const coeffs r)
return the multiplicative inverse of 'a'; raise an error if 'a' is not invertible
static FORCE_INLINE number n_ExactDiv(number a, number b, const coeffs r)
assume that there is a canonical subring in cf and we know that division is possible for these a and ...
static FORCE_INLINE number n_InpNeg(number n, const coeffs r)
in-place negation of n MUST BE USED: n = n_InpNeg(n) (no copy is returned)
static FORCE_INLINE number n_Div(number a, number b, const coeffs r)
return the quotient of 'a' and 'b', i.e., a/b; raises an error if 'b' is not invertible in r exceptio...
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
static FORCE_INLINE number n_Sub(number a, number b, const coeffs r)
return the difference of 'a' and 'b', i.e., a-b
static FORCE_INLINE BOOLEAN nCoeff_is_Q_or_BI(const coeffs r)
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
static FORCE_INLINE number n_InitMPZ(mpz_t n, const coeffs r)
conversion of a GMP integer to number
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
@ n_rep_gap_rat
(number), see longrat.h
@ n_rep_gap_gmp
(), see rinteger.h, new impl.
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
static BOOLEAN gd(leftv res, leftv args)
const CanonicalForm int s
const CanonicalForm int const CFList const Variable & y
‘factory.h’ is the user interface to Factory.
void WerrorS(const char *s)
static number ExtGcd(number a, number b, number *s, number *t, const coeffs)
static void WriteShort(number a, const coeffs r)
static number Copy(number a, const coeffs)
static number ChineseRemainder(number *, number *, int, BOOLEAN, CFArray &, const coeffs)
static nMapFunc SetMap(const coeffs, const coeffs)
static number Farey(number, number, const coeffs)
static number GetDenom(number &n, const coeffs)
static const char * Read(const char *st, number *a, const coeffs r)
static BOOLEAN IsOne(number a, const coeffs)
static number ConvFactoryNSingN(const CanonicalForm, const coeffs)
static number InitMPZ(mpz_t i, const coeffs)
static int Size(number n, const coeffs)
static number Add(number a, number b, const coeffs)
static number Div(number a, number b, const coeffs)
static void WriteFd(number a, const ssiInfo *d, const coeffs)
static void Delete(number *a, const coeffs)
static number Parameter(const int, const coeffs)
static BOOLEAN DBTest(number, const char *, const int, const coeffs)
static void KillChar(coeffs cf)
static CanonicalForm ConvSingNFactoryN(number, BOOLEAN, const coeffs)
static number Init(long i, const coeffs)
static void MPZ(mpz_t result, number &n, const coeffs)
static number ReadFd(const ssiInfo *d, const coeffs)
static number ExactDiv(number a, number b, const coeffs)
static void Power(number a, int i, number *result, const coeffs)
static BOOLEAN IsMOne(number k, const coeffs)
static number Sub(number a, number b, const coeffs)
static number GetNumerator(number &n, const coeffs)
static BOOLEAN GreaterZero(number, const coeffs)
static BOOLEAN CoeffIsEqual(const coeffs r, n_coeffType n, void *)
static number Mult(number a, number b, const coeffs)
static number Invers(number a, const coeffs)
static number Lcm(number, number, const coeffs)
static int ParDeg(number x, const coeffs)
static BOOLEAN IsZero(number a, const coeffs)
static number Neg(number a, const coeffs)
static BOOLEAN Equal(number a, number b, const coeffs)
static long Int(number &n, const coeffs)
static char * nlEatLong(char *s, mpz_ptr i)
BOOLEAN flintQrat_InitChar(coeffs cf, void *infoStruct)
coeffs flintQratInitCfByName(char *s, n_coeffType n)
static number Init_bigint(number i, const coeffs dummy, const coeffs dst)
static bool Greater(mono_type m1, mono_type m2)
int dReportError(const char *fmt,...)
The main handler for Singular numbers which are suitable for Singular polynomials.
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
const char *const nDivBy0
#define omFreeSize(addr, size)
BOOLEAN p_EqualPolys(poly p1, poly p2, const ring r)
void p_Write(poly p, ring lmRing, ring tailRing)
void StringAppendS(const char *st)
void PrintS(const char *s)