15#include "flint/flint.h"
16#if __FLINT_RELEASE >= 20503
24#define TRANSEXT_PRIVATES
29typedef fmpq_rat_struct *fmpq_rat_ptr;
30typedef fmpq_mpoly_struct *fmpq_mpoly_ptr;
31typedef fmpq_mpoly_ctx_struct *fmpq_ctx_ptr;
33typedef fmpq_rat_data_struct *data_ptr;
44 const char * start =
s;
46 while (*
s >=
'0' && *
s <=
'9')
s++;
49 fmpz_set_str(
i, start, 10);
55 fmpz_set_str(
i, start, 10);
61static void fmpq_rat_init(fmpq_rat_ptr a,
const coeffs r)
63 fmpq_mpoly_init(a->num, ((data_ptr)r->data)->ctx);
64 fmpq_mpoly_init(a->den, ((data_ptr)r->data)->ctx);
67static void fmpq_rat_clear(fmpq_rat_ptr a,
const coeffs r)
69 fmpq_mpoly_clear(a->num, ((data_ptr)r->data)->ctx);
70 fmpq_mpoly_clear(a->den, ((data_ptr)r->data)->ctx);
73static void fmpq_rat_canonicalise(fmpq_rat_ptr a,
const coeffs )
78 fmpz_gcd(n, fmpq_numref(a->num->content), fmpq_numref(a->den->content));
79 fmpz_lcm(d, fmpq_denref(a->num->content), fmpq_denref(a->den->content));
82 fmpq_mul_fmpz(a->num->content, a->num->content, d);
83 fmpq_mul_fmpz(a->den->content, a->den->content, d);
87 fmpq_div_fmpz(a->num->content, a->num->content, n);
88 fmpq_div_fmpz(a->den->content, a->den->content, n);
102 const QaInfo *par=(QaInfo*)parameter;
103 if (par->N != c->iNumberOfParameters)
return FALSE;
105 for(
int i=0;
i<par->N;
i++)
107 if (strcmp(par->names[
i],c->pParameterNames[
i])!=0)
return FALSE;
114static number
Mult(number a, number
b,
const coeffs c)
118 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
119 fmpq_rat_init(
res, c);
120 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
121 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
122 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
123 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
125 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
126 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
128 else if (fmpq_mpoly_is_one(
x->den, ctx))
131 fmpq_mpoly_init(
gd, ctx);
132 fmpq_mpoly_gcd(
gd,
x->num,
y->den, ctx);
133 if (fmpq_mpoly_is_one(
gd, ctx))
135 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
136 fmpq_mpoly_set(
res->den,
y->den, ctx);
140 fmpq_mpoly_div(
res->num,
x->num,
gd, ctx);
141 fmpq_mpoly_mul(
res->num,
res->num,
y->num, ctx);
142 fmpq_mpoly_div(
res->den,
y->den,
gd, ctx);
144 fmpq_mpoly_clear(
gd, ctx);
146 else if (fmpq_mpoly_is_one(
y->den, ctx))
149 fmpq_mpoly_init(
gd, ctx);
150 fmpq_mpoly_gcd(
gd,
y->num,
x->den, ctx);
151 if (fmpq_mpoly_is_one(
gd, ctx))
153 fmpq_mpoly_mul(
res->num,
x->num,
y->num, ctx);
154 fmpq_mpoly_set(
res->den,
x->den, ctx);
158 fmpq_mpoly_div(
res->num,
y->num,
gd, ctx);
159 fmpq_mpoly_mul(
res->num,
res->num,
x->num, ctx);
160 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
162 fmpq_mpoly_clear(
gd, ctx);
167 fmpq_mpoly_ptr n1, n2, d1, d2;
168 fmpq_mpoly_init(g1, ctx);
169 fmpq_mpoly_init(g2, ctx);
170 fmpq_mpoly_gcd(g1,
x->num,
y->den, ctx);
171 fmpq_mpoly_gcd(g2,
y->num,
x->den, ctx);
172 n1 =
x->num; d2 =
y->den;
173 d1 =
x->den; n2 =
y->num;
174 if (!fmpq_mpoly_is_one(g1, ctx))
176 fmpq_mpoly_div(
res->num,
x->num, g1, ctx);
177 fmpq_mpoly_div(g1,
y->den, g1, ctx);
178 n1 =
res->num; d2 = g1;
180 if (!fmpq_mpoly_is_one(g2, ctx))
182 fmpq_mpoly_div(
res->den,
y->num, g2, ctx);
183 fmpq_mpoly_div(g2,
x->den, g2, ctx);
184 n2 =
res->den; d1 = g2;
186 fmpq_mpoly_mul(
res->num, n1, n2, ctx);
187 fmpq_mpoly_mul(
res->den, d1, d2, ctx);
188 fmpq_mpoly_clear(g1, ctx);
189 fmpq_mpoly_clear(g2, ctx);
191 fmpq_rat_canonicalise(
res, c);
199static number
Sub(number a, number
b,
const coeffs c)
201 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
202 fmpq_rat_init(
res, c);
203 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
204 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
205 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
206 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
208 fmpq_mpoly_sub(
res->num,
x->num,
y->num, ctx);
209 if (fmpq_mpoly_is_zero(
res->num, ctx))
211 fmpq_mpoly_one(
res->den, ctx);
216 if (fmpq_mpoly_is_one(
x->den, ctx))
218 fmpq_mpoly_set(
res->den,
x->den, ctx);
225 fmpq_mpoly_init(
gd, ctx);
226 fmpq_mpoly_gcd(
gd,
res->num,
x->den, ctx);
227 if (fmpq_mpoly_is_one(
gd, ctx))
229 fmpq_mpoly_set(
res->den,
x->den, ctx);
233 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
234 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
236 fmpq_mpoly_clear(
gd, ctx);
239 else if (fmpq_mpoly_is_one(
x->den, ctx))
241 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
242 fmpq_mpoly_sub(
res->num,
res->num,
y->num, ctx);
243 if (fmpq_mpoly_is_zero(
res->num, ctx))
245 fmpq_mpoly_one(
res->den, ctx);
251 fmpq_mpoly_set(
res->den,
y->den, ctx);
254 else if (fmpq_mpoly_is_one(
y->den, ctx))
256 fmpq_mpoly_mul(
res->num,
y->num,
x->den, ctx);
257 fmpq_mpoly_sub(
res->num,
x->num,
res->num, ctx);
258 if (fmpq_mpoly_is_zero(
res->num,ctx))
260 fmpq_mpoly_one(
res->den, ctx);
266 fmpq_mpoly_set(
res->den,
x->den, ctx);
272 fmpq_mpoly_init(
gd, ctx);
273 fmpq_mpoly_gcd(
gd,
x->den,
y->den, ctx);
274 if (fmpq_mpoly_is_one(
gd, ctx))
276 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
277 fmpq_mpoly_mul(
gd,
y->num,
x->den, ctx);
278 fmpq_mpoly_sub(
res->num,
res->num,
gd, ctx);
279 if (fmpq_mpoly_is_zero(
res->num,ctx))
281 fmpq_mpoly_one(
res->den, ctx);
287 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
293 fmpq_mpoly_init(q2, ctx);
294 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
295 fmpq_mpoly_div(q2,
y->den,
gd, ctx);
296 fmpq_mpoly_mul(
res->num, q2,
x->num, ctx);
297 fmpq_mpoly_mul(
res->den,
res->den,
y->num, ctx);
298 fmpq_mpoly_sub(
res->num,
res->num,
res->den, ctx);
299 fmpq_mpoly_gcd(
res->den,
res->num,
gd, ctx);
300 if (fmpq_mpoly_is_one(
res->den, ctx))
302 fmpq_mpoly_mul(
res->den, q2,
x->den, ctx);
306 fmpq_mpoly_div(
res->num,
res->num,
res->den, ctx);
307 fmpq_mpoly_div(
gd,
x->den,
res->den, ctx);
308 fmpq_mpoly_mul(
res->den,
gd, q2, ctx);
310 fmpq_mpoly_clear(q2, ctx);
312 fmpq_mpoly_clear(
gd, ctx);
315 res->p=
n_Sub(
x->p,
y->p, ((data_ptr)c->data)->C);
321static number
Add(number a, number
b,
const coeffs c)
323 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
324 fmpq_rat_init(
res, c);
325 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
326 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
327 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
328 if (fmpq_mpoly_equal(
x->den,
y->den, ctx))
330 fmpq_mpoly_add(
res->num,
x->num,
y->num, ctx);
331 if (fmpq_mpoly_is_zero(
res->num, ctx))
333 fmpq_mpoly_one(
res->den, ctx);
338 if (fmpq_mpoly_is_one(
x->den, ctx))
340 fmpq_mpoly_set(
res->den,
x->den, ctx);
347 fmpq_mpoly_init(
gd, ctx);
348 fmpq_mpoly_gcd(
gd,
res->num,
x->den, ctx);
349 if (fmpq_mpoly_is_one(
gd, ctx))
351 fmpq_mpoly_set(
res->den,
x->den, ctx);
355 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
356 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
358 fmpq_mpoly_clear(
gd, ctx);
361 else if (fmpq_mpoly_is_one(
x->den, ctx))
363 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
364 fmpq_mpoly_add(
res->num,
res->num,
y->num, ctx);
365 if (fmpq_mpoly_is_zero(
res->num, ctx))
367 fmpq_mpoly_one(
res->den, ctx);
373 fmpq_mpoly_set(
res->den,
y->den, ctx);
376 else if (fmpq_mpoly_is_one(
y->den, ctx))
378 fmpq_mpoly_mul(
res->num,
y->num,
x->den, ctx);
379 fmpq_mpoly_add(
res->num,
x->num,
res->num, ctx);
380 if (fmpq_mpoly_is_zero(
res->num, ctx))
382 fmpq_mpoly_one(
res->den, ctx);
388 fmpq_mpoly_set(
res->den,
x->den, ctx);
394 fmpq_mpoly_init(
gd, ctx);
395 fmpq_mpoly_gcd(
gd,
x->den,
y->den, ctx);
396 if (fmpq_mpoly_is_one(
gd, ctx))
398 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
399 fmpq_mpoly_mul(
gd,
y->num,
x->den, ctx);
400 fmpq_mpoly_add(
res->num,
res->num,
gd, ctx);
401 if (fmpq_mpoly_is_zero(
res->num,ctx))
403 fmpq_mpoly_one(
res->den, ctx);
409 fmpq_mpoly_mul(
res->den,
x->den,
y->den, ctx);
415 fmpq_mpoly_init(q2, ctx);
416 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
417 fmpq_mpoly_div(q2,
y->den,
gd, ctx);
418 fmpq_mpoly_mul(
res->num, q2,
x->num, ctx);
419 fmpq_mpoly_mul(
res->den,
res->den,
y->num, ctx);
420 fmpq_mpoly_add(
res->num,
res->num,
res->den, ctx);
421 fmpq_mpoly_gcd(
res->den,
res->num,
gd, ctx);
422 if (fmpq_mpoly_is_one(
res->den, ctx))
424 fmpq_mpoly_mul(
res->den, q2,
x->den, ctx);
428 fmpq_mpoly_div(
res->num,
res->num,
res->den, ctx);
429 fmpq_mpoly_div(
gd,
x->den,
res->den, ctx);
430 fmpq_mpoly_mul(
res->den,
gd, q2, ctx);
432 fmpq_mpoly_clear(q2, ctx);
434 fmpq_mpoly_clear(
gd, ctx);
437 res->p=
n_Add(
x->p,
y->p, ((data_ptr)c->data)->C);
443static number
Div(number a, number
b,
const coeffs c)
445 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
446 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
447 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
448 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
449 fmpq_rat_init(
res, c);
450 if (fmpq_mpoly_is_zero(
y->num, ctx))
455 if (fmpq_mpoly_equal(
x->den,
y->num, ctx))
457 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
458 fmpq_mpoly_mul(
res->den,
x->den,
y->num, ctx);
460 else if (fmpq_mpoly_is_one(
x->den, ctx))
463 fmpq_mpoly_init(
gd, ctx);
464 fmpq_mpoly_gcd(
gd,
x->num,
y->num, ctx);
465 if (fmpq_mpoly_is_one(
gd, ctx))
467 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
468 fmpq_mpoly_set(
res->den,
y->num, ctx);
472 fmpq_mpoly_div(
res->num,
x->num,
gd, ctx);
473 fmpq_mpoly_mul(
res->num,
res->num,
y->den, ctx);
474 fmpq_mpoly_div(
res->den,
y->num,
gd, ctx);
476 fmpq_mpoly_clear(
gd, ctx);
478 else if (fmpq_mpoly_is_one(
y->num, ctx))
481 fmpq_mpoly_init(
gd, ctx);
482 fmpq_mpoly_gcd(
gd,
y->den,
x->den, ctx);
483 if (fmpq_mpoly_is_one(
gd, ctx))
485 fmpq_mpoly_mul(
res->num,
y->den,
x->num, ctx);
486 fmpq_mpoly_set(
res->den,
x->den, ctx);
490 fmpq_mpoly_div(
res->num,
y->den,
gd, ctx);
491 fmpq_mpoly_mul(
res->num,
res->num,
x->num, ctx);
492 fmpq_mpoly_div(
res->den,
x->den,
gd, ctx);
494 fmpq_mpoly_clear(
gd, ctx);
499 fmpq_mpoly_ptr n1, n2, d1, d2;
500 fmpq_mpoly_init(g1, ctx);
501 fmpq_mpoly_init(g2, ctx);
502 fmpq_mpoly_gcd(g1,
x->num,
y->num, ctx);
503 fmpq_mpoly_gcd(g2,
y->den,
x->den, ctx);
504 n1 =
x->num; d2 =
y->num;
505 d1 =
x->den; n2 =
y->den;
506 if (!fmpq_mpoly_is_one(g1, ctx))
508 fmpq_mpoly_div(
res->num,
x->num, g1, ctx);
509 fmpq_mpoly_div(g1,
y->num, g1, ctx);
510 n1 =
res->num; d2 = g1;
512 if (!fmpq_mpoly_is_one(g2, ctx))
514 fmpq_mpoly_div(
res->den,
y->den, g2, ctx);
515 fmpq_mpoly_div(g2,
x->den, g2, ctx);
516 n2 =
res->den; d1 = g2;
518 fmpq_mpoly_mul(
res->num, n1, n2, ctx);
519 fmpq_mpoly_mul(
res->den, d1, d2, ctx);
520 fmpq_mpoly_clear(g1, ctx);
521 fmpq_mpoly_clear(g2, ctx);
523 fmpq_rat_canonicalise(
res, c);
525 res->p=
n_Div(
x->p,
y->p, ((data_ptr)c->data)->C);
533 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
534 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
535 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
536 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
537 fmpq_rat_init(
res, c);
538 if (fmpq_mpoly_is_zero(
y->num, ctx))
543 fmpq_mpoly_div(
res->num,
x->num,
y->num, ctx);
544 assume(fmpq_mpoly_is_one(
x->den, ctx));
545 assume(fmpq_mpoly_is_one(
y->den, ctx));
559 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
560 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
561 fmpq_rat_init(
res, c);
562 fmpq_mpoly_set_si(
res->num, (
slong)
i, ctx);
563 fmpq_mpoly_set_si(
res->den, (
slong) 1, ctx);
573 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
574 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
578 fmpq_rat_init(
res, c);
579 fmpq_mpoly_set_fmpz(
res->num, t, ctx);
580 fmpq_mpoly_set_si(
res->den, (
slong) 1, ctx);
591 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
592 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
593 if (fmpq_mpoly_is_zero(
x->num, ctx))
595 unsigned long len=fmpq_mpoly_length(
x->num, ctx) +
596 fmpq_mpoly_length(
x->den, ctx)-fmpq_mpoly_is_one(
x->den, ctx);
597 unsigned long numDegree=fmpq_mpoly_total_degree_si(
x->num, ctx);
598 unsigned long denDegree=fmpq_mpoly_total_degree_si(
x->den, ctx);
599 unsigned long t= ((numDegree + denDegree)*(numDegree + denDegree) + 1) * len;
600 if (t>INT_MAX)
return INT_MAX;
604static long Int(number &n,
const coeffs c)
606 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
607 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
608 if (fmpq_mpoly_is_fmpq(
x->den, ctx) && fmpq_mpoly_is_fmpq(
x->num, ctx))
613 fmpq_div(r,
x->num->content,
x->den->content);
614 if (fmpz_is_one(fmpq_denref(r)))
616 if (fmpz_fits_si(fmpq_numref(r)))
617 nl = fmpz_get_si(fmpq_numref(r));
628 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
629 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
630 if (fmpq_mpoly_is_fmpq(
x->den, ctx) && fmpq_mpoly_is_fmpq(
x->num, ctx))
634 fmpq_div(r,
x->num->content,
x->den->content);
635 if (fmpz_is_one(fmpq_denref(r)))
637 fmpz_get_mpz(
result, fmpq_numref(r));
643static number
Neg(number a,
const coeffs c)
645 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
646 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
647 fmpq_mpoly_neg(
x->num,
x->num, ctx);
657 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
658 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
659 if (fmpq_mpoly_is_zero(
x->num, ctx))
666 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
667 fmpq_rat_init(
res, c);
668 fmpq_mpoly_set(
res->num,
x->den, ctx);
669 fmpq_mpoly_set(
res->den,
x->num, ctx);
680 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
681 fmpq_rat_init(
res, c);
682 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
683 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
684 fmpq_mpoly_set(
res->num,
x->num, ctx);
685 fmpq_mpoly_set(
res->den,
x->den, ctx);
704 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
705 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
706 if (!fmpq_mpoly_is_fmpq(
x->num, ctx))
708 if (!fmpq_mpoly_is_fmpq(
x->den, ctx))
710 return fmpq_equal(
x->num->content,
x->den->content);
715 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
716 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
717 return fmpq_mpoly_is_zero(
x->num, ctx);
720static void WriteLong(number a,
const coeffs c)
728 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
729 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
730 if (fmpq_mpoly_is_zero(
x->den, ctx))
736 long int i,
j,
k, nmax_i, dmax_i, max_digits;
737 fmpq_rat_canonicalise(
x, c);
738 if (fmpq_mpoly_is_zero(
x->num, ctx))
742 BOOLEAN num_is_const = fmpq_mpoly_is_fmpq(
x->num, ctx);
743 BOOLEAN den_is_const = fmpq_mpoly_is_fmpq(
x->den, ctx);
745 fmpq_mpoly_struct * znum =
x->num;
746 fmpq_mpoly_struct * zden =
x->den;
747 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
751 for (
i = 1;
i < fmpq_mpoly_length(znum, ctx);
i++)
753 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
754 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx)) > 0)
759 for (
i = 1;
i < fmpq_mpoly_length(zden, ctx);
i++)
761 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
762 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
767 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx),
768 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
770 fmpz_mul(t, fmpq_numref(
x->num->content),
771 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx));
772 max_digits = fmpz_sizeinbase(t, 10);
776 fmpz_mul(t, fmpq_numref(
x->den->content),
777 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx));
778 max_digits =fmpz_sizeinbase(t, 10);
780 char *
s = (
char*)
omAlloc(max_digits + 5);
783 if (fmpq_mpoly_is_one(
x->num, ctx))
787 for (
i = 0;
i < fmpq_mpoly_length(
x->num, ctx);
i++)
790 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
791 fmpq_numref(
x->num->content));
792 if (
i != 0 && fmpz_sgn(t) > 0)
797 fmpz_get_str(
s, 10, t);
800 while((
l>0)&&(!isdigit(
s[
l])))
l--;
803 if (strcmp(
s,
"-1")==0)
817 for (
j = 0;
j < c->iNumberOfParameters;
j++)
819 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
837 if (!fmpq_mpoly_is_one(
x->den, ctx))
844 closing_paren =
TRUE;
846 for (
i = 0;
i < fmpq_mpoly_length(
x->den, ctx);
i++)
849 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
850 fmpq_numref(
x->den->content));
853 if ((fmpz_sgn(t) < 0) && den_is_const)
856 closing_paren =
TRUE;
859 else if (fmpz_sgn(t) > 0)
863 fmpz_get_str(
s, 10, t);
866 while((
l>0)&&(!isdigit(
s[
l])))
l--;
875 for (
j = 0;
j < nvars;
j++)
877 k = fmpq_mpoly_get_term_var_exp_ui(
x->den,
i,
j, ctx);
900 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
901 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
904 long int i,
j,
k, nmax_i, dmax_i, max_digits;
905 fmpq_rat_canonicalise(
x, c);
906 if (fmpq_mpoly_is_zero(
x->num, ctx))
910 BOOLEAN num_is_const = fmpq_mpoly_is_fmpq(
x->num, ctx);
911 BOOLEAN den_is_const = fmpq_mpoly_is_fmpq(
x->den, ctx);
912 fmpq_mpoly_struct * znum =
x->num;
913 fmpq_mpoly_struct * zden =
x->den;
914 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
918 for (
i = 1;
i < fmpq_mpoly_length(znum, ctx);
i++)
920 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
921 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx)) > 0)
926 for (
i = 1;
i < fmpq_mpoly_length(zden, ctx);
i++)
928 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
929 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
934 if (fmpz_cmpabs(fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx),
935 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx)) > 0)
937 fmpz_mul(t, fmpq_numref(
x->num->content),
938 fmpq_mpoly_zpoly_term_coeff_ref(znum, nmax_i, ctx));
939 max_digits = fmpz_sizeinbase(t, 10);
942 fmpz_mul(t, fmpq_numref(
x->den->content),
943 fmpq_mpoly_zpoly_term_coeff_ref(zden, dmax_i, ctx));
944 max_digits = fmpz_sizeinbase(t, 10);
946 s = (
char*)
omAlloc(max_digits + 2);
949 if (fmpq_mpoly_is_one(
x->num, ctx))
953 for (
i = 0;
i < fmpq_mpoly_length(
x->num, ctx);
i++)
955 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(znum,
i, ctx),
956 fmpq_numref(
x->num->content));
957 if (
i != 0 && fmpz_sgn(t) > 0)
961 fmpz_get_str(
s, 10, t);
964 for (
j = 0;
j < nvars;
j++)
966 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
979 if (!fmpq_mpoly_is_one(
x->den, ctx))
984 for (
i = 0;
i < fmpq_mpoly_length(
x->den, ctx);
i++)
986 fmpz_mul(t, fmpq_mpoly_zpoly_term_coeff_ref(zden,
i, ctx),
987 fmpq_numref(
x->den->content));
988 if (
i != 0 && fmpz_sgn(t) > 0)
992 fmpz_get_str(
s, 10, t);
995 for (
j = 0;
j < nvars;
j++)
997 k = fmpq_mpoly_get_term_var_exp_ui(
x->num,
i,
j, ctx);
1014static const char*
Read(
const char * st, number * a,
const coeffs c)
1019 char *
s = (
char *) st;
1020 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1021 slong nvars = fmpq_mpoly_ctx_nvars(ctx);
1022 *a = (number)
omAlloc(
sizeof(fmpq_rat_struct));
1023 fmpq_rat_init((fmpq_rat_ptr)(*a), c);
1035 fmpq_mpoly_set_fmpz(((fmpq_rat_ptr)(*a))->
num, z, ctx);
1036 fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
den, ctx);
1041 fmpq_mpoly_scalar_div_fmpz(((fmpq_rat_ptr)(*a))->
num,
1042 ((fmpq_rat_ptr)(*a))->
num, z, ctx);
1049 for (
j = 0;
j < nvars;
j++)
1051 if (strncmp(
s, c->pParameterNames[
j],
1052 strlen(c->pParameterNames[
j])) == 0)
1055 fmpq_mpoly_gen(((fmpq_rat_ptr)(*a))->
num,
j, ctx);
1056 s += strlen(c->pParameterNames[
j]);
1063 fmpq_mpoly_pow_ui(((fmpq_rat_ptr)(*a))->
num,
1064 ((fmpq_rat_ptr)(*a))->
num, (
long int)
i, ctx);
1069 if (!
found) fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
num, ctx);
1070 fmpq_mpoly_one(((fmpq_rat_ptr)(*a))->
den, ctx);
1073 fmpq_mpoly_neg(((fmpq_rat_ptr)(*a))->
num, ((fmpq_rat_ptr)(*a))->
num, ctx);
1075 poly
pp=convFlintMPSingP(((fmpq_rat_ptr)(*a))->
num,ctx,((data_ptr)c->data)->C->extRing);
1076 fraction
f=(fraction)
n_Init(1,((data_ptr)c->data)->C);
1078 ((fmpq_rat_ptr)(*a))->
p=(number)
f;
1093 const fmpq_rat_ptr
x = (fmpq_rat_ptr) *a;
1094 fmpq_rat_clear(
x, c);
1096 n_Delete(&(
x->p),((data_ptr)c->data)->C);
1105 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1106 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1107 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1108 if (!fmpz_mpoly_equal(
x->num->zpoly,
y->num->zpoly, ctx->zctx))
1112 if (!fmpz_mpoly_equal(
x->den->zpoly,
y->den->zpoly, ctx->zctx))
1119 fmpz_mul(t1, fmpq_numref(
x->num->content), fmpq_denref(
x->den->content));
1120 fmpz_mul(t1, t1, fmpq_denref(
y->num->content));
1121 fmpz_mul(t1, t1, fmpq_numref(
y->den->content));
1122 fmpz_mul(t2, fmpq_numref(
y->num->content), fmpq_denref(
y->den->content));
1123 fmpz_mul(t2, t2, fmpq_denref(
x->num->content));
1124 fmpz_mul(t2, t2, fmpq_numref(
x->den->content));
1125 int eq = fmpz_equal(t1, t2);
1135 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1136 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1137 if (!fmpq_mpoly_is_fmpq(
x->num, ctx))
1139 if (!fmpq_mpoly_is_fmpq(
x->den, ctx))
1142 fmpq_neg(
content,
x->num->content);
1143 int eq = fmpq_equal(
content,
x->den->content);
1156 fmpq_rat_init((fmpq_rat_ptr) (*
result), c);
1157 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1158 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1165 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
1166 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1167 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1168 fmpq_rat_init(
res, c);
1169 fmpq_mpoly_set(
res->num,
x->den, ctx);
1170 fmpq_mpoly_one(
res->den, ctx);
1171 return (number)
res;
1176 const fmpq_rat_ptr
x = (fmpq_rat_ptr) n;
1177 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1178 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1179 fmpq_rat_init(
res, c);
1180 fmpq_mpoly_set(
res->num,
x->num, ctx);
1181 fmpq_mpoly_one(
res->den, ctx);
1182 return (number)
res;
1185static number
ExtGcd(number , number , number* , number* ,
const coeffs )
1187 WerrorS(
"not a Euclidean ring: ExtGcd");
1191static number
Lcm(number , number ,
const coeffs )
1197static number Q2Frac(number a,
const coeffs ,
const coeffs dst)
1223static number Z2Frac(number a,
const coeffs ,
const coeffs dst)
1225 return InitMPZ((mpz_ptr)a,dst);
1228static number Zp2Frac(number a,
const coeffs src,
const coeffs dst)
1257 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)(dst->data))->ctx;
1258 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1260 fmpq_rat_init(
res, dst);
1268 fmpz_set_mpz(
f,
i->z);
1269 fmpq_mpoly_set_fmpz(
res->num,
f, ctx);
1272 fmpq_mpoly_set_si(
res->den, 1, ctx);
1273 return (number)
res;
1289 WerrorS(
"not yet: ChineseRemainder");
1296 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1297 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1298 return (
int) (fmpq_mpoly_total_degree_si(
x->num, ctx) -
1299 fmpq_mpoly_total_degree_si(
x->den, ctx));
1304 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1305 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1306 fmpq_rat_init(
res, c);
1307 fmpq_mpoly_gen(
res->num, (
slong)
i, ctx);
1308 fmpq_mpoly_one(
res->den, ctx);
1309 return (number)
res;
1312static number SubringGcd(number a, number
b,
const coeffs c)
1314 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1315 fmpq_rat_init(
res, c);
1316 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1317 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1318 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1319 fmpq_mpoly_gcd(
res->num,
x->num,
y->num, ctx);
1323 fmpz_gcd(cont, fmpq_numref(
x->num->content), fmpq_numref(
y->num->content));
1324 if (!fmpz_is_one(cont))
1326 fmpq_mul_fmpz(
res->num->content,
res->num->content, cont);
1328 fmpz_gcd(cont, fmpq_denref(
x->num->content), fmpq_denref(
y->num->content));
1329 if (!fmpz_is_one(cont))
1331 fmpq_div_fmpz(
res->num->content,
res->num->content, cont);
1334 fmpq_mpoly_one(
res->den, ctx);
1335 fmpq_rat_canonicalise(
res, c);
1340 return (number)
res;
1343static number NormalizeHelper(number a, number
b,
const coeffs c)
1345 fmpq_rat_ptr
res = (fmpq_rat_ptr)
omAlloc(
sizeof(fmpq_rat_struct));
1346 fmpq_rat_init(
res, c);
1347 const fmpq_rat_ptr
x = (fmpq_rat_ptr) a;
1348 const fmpq_rat_ptr
y = (fmpq_rat_ptr)
b;
1349 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)c->data)->ctx;
1351 fmpq_mpoly_init(
gd,ctx);
1352 fmpq_mpoly_one(
gd,ctx);
1353 fmpq_mpoly_gcd(
gd,
x->num,
y->den, ctx);
1354 fmpq_mpoly_mul(
res->num,
x->num,
y->den, ctx);
1355 if (!fmpq_mpoly_is_one(
gd, ctx))
1356 fmpq_mpoly_div(
res->num,
res->num,
gd, ctx);
1357 fmpq_mpoly_one(
res->den, ctx);
1362 return (number)
res;
1431 WerrorS(
"not yet: ConvFactoryNSingN");
1439 WerrorS(
"not yet: ConvSingNFactoryN");
1444char * QratCoeffName(
const coeffs c)
1447 snprintf(CoeffName_flint_Qrat,200,
"flintQQ(%s",c->pParameterNames[0]);
1448 for(
int i=1;
i<c->iNumberOfParameters;
i++)
1450 strncat(CoeffName_flint_Qrat,
",",200-strlen(CoeffName_flint_Qrat));
1451 strncat(CoeffName_flint_Qrat,c->pParameterNames[
i],200-strlen(CoeffName_flint_Qrat));
1453 strncat(CoeffName_flint_Qrat,
")",200-strlen(CoeffName_flint_Qrat));
1454 return (
char*) CoeffName_flint_Qrat;
1460 const char start[] =
"flintQ(";
1461 const int start_len = strlen(start);
1462 if (strncmp(
s, start, start_len) == 0)
1470 while((*
p!=
',')&&(*
p!=
')')&&(*
p!=
'\0'))
p++;
1471 if (*
p==
',') {
p++;
N++;}
1472 else if (*
p==
')') {
p++;
N++;
break;}
1473 else if (*
p==
'\0') {
break;}
1481 while((*
p!=
',')&&(*
p!=
')')&&(*
p!=
'\0'))
p++;
1482 if ((*
p==
',')||(*
p=
')'))
1493 if (*
p==
'\0')
break;
1508 const fmpq_rat_ptr
x = (fmpq_rat_ptr) c;
1511 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)
cf->data)->ctx;
1512 fmpq_mpoly_assert_canonical(
x->num,ctx);
1513 fmpq_mpoly_assert_canonical(
x->den,ctx);
1514 if (fmpq_mpoly_is_zero(
x->den, ctx))
1522 fmpz_gcd(n, fmpq_numref(
x->num->content), fmpq_numref(
x->den->content));
1523 fmpz_lcm(d, fmpq_denref(
x->num->content), fmpq_denref(
x->den->content));
1524 if (!fmpz_is_one(d))
1529 if (!fmpz_is_one(n))
1537 poly
pp=convFlintMPSingP(
x->num,ctx,((data_ptr)
cf->data)->C->extRing);
1538 fraction
f=(fraction)
x->p;
1556 pp=convFlintMPSingP(
x->den,ctx,((data_ptr)
cf->data)->C->extRing);
1575 for(
int i=0;
i<
cf->iNumberOfParameters;
i++)
1578 const fmpq_ctx_ptr ctx = (fmpq_ctx_ptr) ((data_ptr)
cf->data)->ctx;
1579 fmpq_mpoly_ctx_clear(ctx);
1585 QaInfo *
pp=(QaInfo*)infoStruct;
1586 cf->cfCoeffName = QratCoeffName;
1594 cf->cfExactDiv =
Div;
1605 cf->cfWriteLong = WriteLong;
1606 cf->cfWriteShort = WriteLong;
1626 cf->cfSubringGcd = SubringGcd;
1627 cf->cfNormalizeHelper= NormalizeHelper;
1647 cf->iNumberOfParameters =
pp->N;
1648 char **pn = (
char**)
omAlloc0(
pp->N*
sizeof(
char*));
1649 for(
int i=0;
i<
pp->N;
i++)
1653 cf->pParameterNames = (
const char **) pn;
1654 cf->has_simple_Inverse =
FALSE;
1659 fmpq_rat_data_struct *ps=(fmpq_rat_data_struct*)
omAlloc(
sizeof(fmpq_rat_data_struct));
1660 ps->ctx=(fmpq_mpoly_ctx_struct*)
omAlloc(
sizeof(fmpq_mpoly_ctx_struct));
1664 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)