My Project
Loading...
Searching...
No Matches
flintcf_Q.cc
Go to the documentation of this file.
1/****************************************
2* Computer Algebra System SINGULAR *
3****************************************/
4/*
5* ABSTRACT: flint: fmpq_poly
6*/
7#include <ctype.h> /* isdigit*/
8
9#include "misc/auxiliary.h"
10
11#ifdef HAVE_FLINT
12
13#include <flint/flint.h>
14#include <flint/fmpz.h>
15#include <flint/fmpq.h>
16#include <flint/fmpq_poly.h>
17#include "factory/factory.h"
18
19#include "coeffs/coeffs.h"
20
21#include "coeffs/numbers.h"
22#include "coeffs/longrat.h"
23
25typedef fmpz *fmpz_ptr;
26/*2
27* extracts a long integer from s, returns the rest
28*/
29static char * nlEatLong(char *s, mpz_ptr i)
30{
31 const char * start=s;
32
33 while (*s >= '0' && *s <= '9') s++;
34 if (*s=='\0')
35 {
36 mpz_set_str(i,start,10);
37 }
38 else
39 {
40 char c=*s;
41 *s='\0';
42 mpz_set_str(i,start,10);
43 *s=c;
44 }
45 return s;
46}
47
48static BOOLEAN CoeffIsEqual(const coeffs r, n_coeffType n, void *)
49{
50 return (r->type==n);
51}
52static void SetChar(const coeffs)
53{
54 // dummy
55}
100{
104 {
106 }
107 else
109 return (number)res;
110}
111#if 0
112static number IntMod(number a, number b, const coeffs)
113{
117 return (number)res;
118}
119#endif
120static number Init (long i, const coeffs)
121{
125 return (number)res;
126}
138static int Size (number n, const coeffs)
139{
141}
142static long Int (number &n, const coeffs)
143{
145 {
146 fmpq_t m;
147 fmpq_init(m);
150 if (fmpz_cmp_si(fmpq_numref(m),nl)!=0) nl=0;
152 if ((dl!=1)||(fmpz_cmp_si(fmpq_denref(m),dl)!=0)) nl=0;
153 fmpq_clear(m);
154 return nl;
155 }
156 return 0;
157}
158static void MPZ(mpz_t result, number &n, const coeffs)
159{
162 {
163#if __FLINT_RELEASE >= 20503
164 fmpq_t m;
165 fmpq_init(m);
167 mpz_t den;
168 mpz_init(den);
170 int dl=(int)mpz_get_si(den);
171 if ((dl!=1)||(mpz_cmp_si(den,(long)dl)!=0)) mpz_set_ui(result,0);
172 mpz_clear(den);
173 fmpq_clear(m);
174#else
175 mpq_t m;
176 mpq_init(m);
178 mpz_t den;
179 mpz_init(den);
182 int dl=(int)mpz_get_si(den);
183 if ((dl!=1)||(mpz_cmp_si(den,(long)dl)!=0)) mpz_set_ui(result,0);
184 mpz_clear(den);
185 mpq_clear(m);
186#endif
187 }
188}
189static number Neg(number a, const coeffs)
190{
192 return a;
193}
194static number Invers(number a, const coeffs)
195{
197 {
199 return NULL;
200 }
202 {
206 return (number)res;
207 }
208 else
209 {
210 WerrorS("not invertable");
211 return NULL;
212 }
213}
214static number Copy(number a, const coeffs)
215{
219 return (number)res;
220}
221//static number RePart(number a, const coeffs)
222//{
223//}
224//static number ImPart(number a, const coeffs)
225//{
226//}
227static BOOLEAN IsOne (number a, const coeffs);
228static BOOLEAN IsZero (number a, const coeffs);
229//static void WriteLong(number &a, const coeffs)
230//{
231//}
232static void WriteShort(number a, const coeffs r)
233{
234 //fmpq_poly_print_pretty((fmpq_poly_ptr)a,r->pParameterNames[0]);
235 if (IsOne(a,r)) StringAppendS("1");
236 else if (IsZero(a,r)) StringAppendS("0");
237 else
238 {
239 StringAppendS("(");
240#if __FLINT_RELEASE >= 20503
241 fmpq_t m;
242 fmpq_init(m);
244 for(int i=fmpq_poly_length((fmpq_poly_ptr)a);i>=0;i--)
245 {
247 if (!fmpq_is_zero(m))
248 {
249 if (need_plus && (fmpq_cmp_ui(m,0)>0))
250 StringAppendS("+");
254 l+=2;
255 char *s=(char*)omAlloc(l);
256 char *z=fmpz_get_str(s,10,fmpq_numref(m));
257 if ((i==0)
258 ||(fmpz_cmp_si(fmpq_numref(m),1)!=0)
259 ||(fmpz_cmp_si(fmpq_denref(m),1)!=0))
260 {
261 StringAppendS(z);
262 if (fmpz_cmp_si(fmpq_denref(m),1)!=0)
263 {
264 StringAppendS("/");
266 StringAppendS(z);
267 }
268 if (i!=0) StringAppendS("*");
269 }
270 if (i>1)
271 StringAppend("%s^%d",r->pParameterNames[0],i);
272 else if (i==1)
273 StringAppend("%s",r->pParameterNames[0]);
274 }
275 }
276 fmpq_clear(m);
277#else
278 mpq_t m;
279 mpq_init(m);
280 mpz_t num,den;
281 mpz_init(num);
282 mpz_init(den);
284 for(int i=fmpq_poly_length((fmpq_poly_ptr)a);i>=0;i--)
285 {
289 if (mpz_sgn1(num)!=0)
290 {
291 if (need_plus && (mpz_sgn1(num)>0))
292 StringAppendS("+");
294 int l=mpz_sizeinbase(num,10);
295 l=si_max(l,(int)mpz_sizeinbase(den,10));
296 l+=2;
297 char *s=(char*)omAlloc(l);
298 char *z=mpz_get_str(s,10,num);
299 if ((i==0)
300 ||(mpz_cmp_si(num,1)!=0)
301 ||(mpz_cmp_si(den,1)!=0))
302 {
303 StringAppendS(z);
304 if (mpz_cmp_si(den,1)!=0)
305 {
306 StringAppendS("/");
307 z=mpz_get_str(s,10,den);
308 StringAppendS(z);
309 }
310 if (i!=0) StringAppendS("*");
311 }
312 if (i>1)
313 StringAppend("%s^%d",r->pParameterNames[0],i);
314 else if (i==1)
315 StringAppend("%s",r->pParameterNames[0]);
316 }
317 }
318 mpz_clear(den);
319 mpz_clear(num);
320 mpq_clear(m);
321#endif
322 StringAppendS(")");
323 }
324}
325static const char* Read(const char * st, number * a, const coeffs r)
326{
327// we only read "monomials" (i.e. [-][digits][parameter]),
328// everythings else (+,*,^,()) is left to the singular interpreter
329 char *s=(char *)st;
330 *a=(number)omAlloc(sizeof(fmpq_poly_t));
332 BOOLEAN neg=FALSE;
333 if (*s=='-') { neg=TRUE; s++;}
334 if (isdigit(*s))
335 {
336 mpz_t z;
337 mpz_init(z);
338 fmpz_t z1;
339 fmpz_init(z1);
340 s=nlEatLong((char *)s, z);
341 fmpz_set_mpz(z1,z);
343 if (*s == '/')
344 {
345 s++;
346 s=nlEatLong((char *)s, z);
347 fmpz_set_mpz(z1,z);
349 }
350 fmpz_clear(z1);
351 mpz_clear(z);
352 }
353 else if(strncmp(s,r->pParameterNames[0],strlen(r->pParameterNames[0]))==0)
354 {
356 s+=strlen(r->pParameterNames[0]);
357 if(isdigit(*s))
358 {
359 int i=1;
360 s=nEati(s,&i,0);
361 if (i!=1)
362 {
365 }
366 }
367 }
368 if (neg)
370 return s;
371}
372static void Normalize(number &a, const coeffs)
373{
375}
377{
379}
380static BOOLEAN Equal (number a, number b, const coeffs)
381{
383}
384static BOOLEAN IsZero (number a, const coeffs)
385{
387}
388static BOOLEAN IsOne (number a, const coeffs)
389{
391}
392static BOOLEAN IsMOne (number k, const coeffs)
393{
394 if (fmpq_poly_length((fmpq_poly_ptr)k)>0) return FALSE;
396 fmpq_t m;
397 fmpq_init(m);
400 if (fmpz_cmp_si(fmpq_numref(m),(long)-1)!=0) result=FALSE;
401 else
402 {
404 if ((dl!=1)||(fmpz_cmp_si(fmpq_denref(m),(long)dl)!=0)) result=FALSE;
405 }
406 fmpq_clear(m);
407 return (result);
408}
410{
411 // does it have a leading sign?
412 // no: 0 and 1 do not have, everything else is in (...)
413 return TRUE;
414}
456{
457 WerrorS("not yet: Lcm");
458 return NULL;
459}
460static void Delete(number * a, const coeffs)
461{
462 if ((*a)!=NULL)
463 {
465 omFree(*a);
466 *a=NULL;
467 }
468}
469static nMapFunc SetMap(const coeffs, const coeffs)
470{
471 WerrorS("not yet: SetMap");
472 return NULL;
473}
474//static void InpMult(number &a, number b, const coeffs)
475//{
476//}
477//static void InpAdd(number &a, number b, const coeffs)
478//{
479//}
480#if 0
481static number Init_bigint(number i, const coeffs, const coeffs)
482{
485 if (SR_HDL(i) & SR_INT)
486 {
488 }
489 else
491 return (number)res;
492}
493#endif
495{
496 WerrorS("not yet: Farey");
497 return NULL;
498}
500{
501 WerrorS("not yet: ChineseRemainder");
502 return NULL;
503}
504static int ParDeg(number x,const coeffs)
505{
507}
508static number Parameter(const int, const coeffs)
509{
513 return (number)res;
514}
515static void WriteFd(number a, const ssiInfo *d, const coeffs)
516{
517 // format: len a_len(num den) .. a_0
519 int l=fmpq_poly_length(aa);
520 fprintf(d->f_write,"%d ",l);
521#if __FLINT_RELEASE >= 20503
522 fmpq_t m;
523 fmpq_init(m);
524 mpz_t num,den;
525 mpz_init(num);
526 mpz_init(den);
527 for(int i=l; i>=0; i--)
528 {
532 fputc(' ',d->f_write);
534 fputc(' ',d->f_write);
535 }
536 mpz_clear(den);
537 mpz_clear(num);
538 fmpq_clear(m);
539#else
540 mpq_t m;
541 mpq_init(m);
542 mpz_t num,den;
543 mpz_init(num);
544 mpz_init(den);
545 for(int i=l; i>=0; i--)
546 {
551 fputc(' ',d->f_write);
553 fputc(' ',d->f_write);
554 }
555 mpz_clear(den);
556 mpz_clear(num);
557 mpq_clear(m);
558#endif
559}
560static number ReadFd(const ssiInfo *d, const coeffs)
561{
562 // format: len a_len .. a_0
565 int l=s_readint(d->f_read);
566 mpz_t tmp;
567 mpz_init(tmp);
568 fmpq_t m;
569 fmpq_init(m);
570 fmpz_t num,den;
571 fmpz_init(num);
572 fmpz_init(den);
573 for (int i=l;i>=0;i--)
574 {
581 }
582 mpz_clear(tmp);
585 fmpq_clear(m);
586 return (number)aa;
587}
588// cfClearContent
589// cfClearDenominators
591{
592 WerrorS("not yet: ConvFactoryNSingN");
593 return NULL;
594}
596{
597 WerrorS("not yet: ConvSingNFactoryN");
598 return CanonicalForm(0);
599}
600char * CoeffName(const coeffs r)
601{
603 sprintf(CoeffName_flint_Q,"flintQp[%s]",r->pParameterNames[0]);
604 return (char*)CoeffName_flint_Q;
605
606}
608{
609 const char start[]="flintQp[";
610 const int start_len=strlen(start);
611 if (strncmp(s,start,start_len)==0)
612 {
613 s+=start_len;
614 char st[10];
615 int l=sscanf(s,"%s",st);
616 if (l==1)
617 {
618 while (st[strlen(st)-1]==']') st[strlen(st)-1]='\0';
619 return nInitChar(n,(void*)st);
620 }
621 }
622 return NULL;
623}
624#ifdef LDEBUG
625static BOOLEAN DBTest(number, const char *, const int, const coeffs)
626{
627 return TRUE;
628}
629#endif
630static void KillChar(coeffs cf)
631{
632 omFree((ADDRESS)(cf->pParameterNames[0]));
633 omFreeSize(cf->pParameterNames,sizeof(char*));
634}
636{
637 char *pp=(char*)infoStruct;
638 cf->cfCoeffName = CoeffName;
639 cf->nCoeffIsEqual = CoeffIsEqual;
640 cf->cfKillChar = KillChar;
641 cf->cfSetChar = SetChar;
642 cf->ch=0; //char 0
643 cf->cfMult = Mult;
644 cf->cfSub = Sub;
645 cf->cfAdd = Add;
646 cf->cfDiv = Div;
647 cf->cfExactDiv = ExactDiv; // ???
648 cf->cfInit =Init;
649 cf->cfInitMPZ =InitMPZ;
650 cf->cfSize = Size;
651 cf->cfInt = Int;
652 cf->cfMPZ = MPZ;
653 cf->cfInpNeg = Neg;
654 cf->cfInvers = Invers;
655 cf->cfCopy = Copy;
656 cf->cfRePart = Copy;
657 // default: cf->cfImPart = ndReturn0;
658 cf->cfWriteLong = WriteShort; //WriteLong;
659 cf->cfWriteShort = WriteShort;
660 cf->cfRead = Read;
661 cf->cfNormalize = Normalize;
662
663 //cf->cfDivComp=
664 //cf->cfIsUnit=
665 //cf->cfGetUnit=
666 //cf->cfDivBy=
667
668 cf->cfGreater=Greater;
669 cf->cfEqual =Equal;
670 cf->cfIsZero =IsZero;
671 cf->cfIsOne =IsOne;
672 cf->cfIsMOne =IsMOne;
673 cf->cfGreaterZero=GreaterZero;
674
675 cf->cfPower = Power;
676 cf->cfGetDenom = GetDenom;
677 cf->cfGetNumerator = GetNumerator;
678 cf->cfGcd = Gcd;
679 cf->cfExtGcd = ExtGcd;
680 cf->cfLcm = Lcm;
681 cf->cfDelete = Delete;
682 cf->cfSetMap = SetMap;
683 // default: cf->cfInpMult
684 // default: cf->cfInpAdd
685 cf->cfFarey =Farey;
686 cf->cfChineseRemainder=ChineseRemainder;
687 cf->cfParDeg = ParDeg;
688 cf->cfParameter = Parameter;
689 // cf->cfClearContent = ClearContent;
690 // cf->cfClearDenominators = ClearDenominators;
691 cf->convFactoryNSingN=ConvFactoryNSingN;
692 cf->convSingNFactoryN=ConvSingNFactoryN;
693 cf->cfWriteFd = WriteFd;
694 cf->cfReadFd = ReadFd;
695#ifdef LDEBUG
696 cf->cfDBTest = DBTest;
697#endif
698
699 cf->iNumberOfParameters = 1;
700 char **pn=(char**)omAlloc0(sizeof(char*));
701 pn[0]=omStrDup(pp);
702 cf->pParameterNames = (const char **)pn;
703 cf->has_simple_Inverse= FALSE;
704 cf->has_simple_Alloc= FALSE;
705 cf->is_field=FALSE;
706
707 return FALSE;
708}
709#endif
All the auxiliary stuff.
#define SSI_BASE
Definition auxiliary.h:135
static int si_max(const int a, const int b)
Definition auxiliary.h:124
int BOOLEAN
Definition auxiliary.h:87
#define TRUE
Definition auxiliary.h:100
#define FALSE
Definition auxiliary.h:96
CF_NO_INLINE FACTORY_PUBLIC CanonicalForm mod(const CanonicalForm &, const CanonicalForm &)
CanonicalForm FACTORY_PUBLIC pp(const CanonicalForm &)
CanonicalForm pp ( const CanonicalForm & f )
Definition cf_gcd.cc:676
CanonicalForm num(const CanonicalForm &f)
CanonicalForm den(const CanonicalForm &f)
int l
Definition cfEzgcd.cc:100
int m
Definition cfEzgcd.cc:128
int i
Definition cfEzgcd.cc:132
int k
Definition cfEzgcd.cc:99
Variable x
Definition cfModGcd.cc:4090
CanonicalForm cf
Definition cfModGcd.cc:4091
CanonicalForm b
Definition cfModGcd.cc:4111
factory's main class
CanonicalForm den() const
den() returns the denominator of CO if CO is a rational number, 1 (from the current domain!...
Coefficient rings, fields and other domains suitable for Singular polynomials.
n_coeffType
Definition coeffs.h:27
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition numbers.cc:419
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
Definition coeffs.h:80
#define StringAppend
Definition emacs.cc:79
return result
const CanonicalForm int s
Definition facAbsFact.cc:51
CanonicalForm res
Definition facAbsFact.cc:60
void WerrorS(const char *s)
Definition feFopen.cc:24
static number ExtGcd(number a, number b, number *s, number *t, const coeffs)
Definition flintcf_Q.cc:446
static void WriteShort(number a, const coeffs r)
Definition flintcf_Q.cc:232
static number Copy(number a, const coeffs)
Definition flintcf_Q.cc:214
static number ChineseRemainder(number *, number *, int, BOOLEAN, CFArray &, const coeffs)
Definition flintcf_Q.cc:499
static void Normalize(number &a, const coeffs)
Definition flintcf_Q.cc:372
static void SetChar(const coeffs)
Definition flintcf_Q.cc:52
static nMapFunc SetMap(const coeffs, const coeffs)
Definition flintcf_Q.cc:469
static number Farey(number, number, const coeffs)
Definition flintcf_Q.cc:494
static number GetDenom(number &n, const coeffs)
Definition flintcf_Q.cc:422
static const char * Read(const char *st, number *a, const coeffs r)
Definition flintcf_Q.cc:325
static BOOLEAN IsOne(number a, const coeffs)
Definition flintcf_Q.cc:388
char * CoeffName(const coeffs r)
Definition flintcf_Q.cc:600
static number ConvFactoryNSingN(const CanonicalForm, const coeffs)
Definition flintcf_Q.cc:590
BOOLEAN flintQ_InitChar(coeffs cf, void *infoStruct)
Definition flintcf_Q.cc:635
fmpq_poly_struct * fmpq_poly_ptr
Definition flintcf_Q.cc:24
static number InitMPZ(mpz_t i, const coeffs)
Definition flintcf_Q.cc:127
static int Size(number n, const coeffs)
Definition flintcf_Q.cc:138
static number Add(number a, number b, const coeffs)
Definition flintcf_Q.cc:70
static number Div(number a, number b, const coeffs)
Definition flintcf_Q.cc:77
static void WriteFd(number a, const ssiInfo *d, const coeffs)
Definition flintcf_Q.cc:515
fmpz * fmpz_ptr
Definition flintcf_Q.cc:25
coeffs flintQInitCfByName(char *s, n_coeffType n)
Definition flintcf_Q.cc:607
static void Delete(number *a, const coeffs)
Definition flintcf_Q.cc:460
static number Parameter(const int, const coeffs)
Definition flintcf_Q.cc:508
static BOOLEAN DBTest(number, const char *, const int, const coeffs)
Definition flintcf_Q.cc:625
static void KillChar(coeffs cf)
Definition flintcf_Q.cc:630
static CanonicalForm ConvSingNFactoryN(number, BOOLEAN, const coeffs)
Definition flintcf_Q.cc:595
static number Init(long i, const coeffs)
Definition flintcf_Q.cc:120
static void MPZ(mpz_t result, number &n, const coeffs)
Definition flintcf_Q.cc:158
static number ReadFd(const ssiInfo *d, const coeffs)
Definition flintcf_Q.cc:560
static number ExactDiv(number a, number b, const coeffs)
Definition flintcf_Q.cc:99
static void Power(number a, int i, number *result, const coeffs)
Definition flintcf_Q.cc:415
static BOOLEAN IsMOne(number k, const coeffs)
Definition flintcf_Q.cc:392
static number Sub(number a, number b, const coeffs)
Definition flintcf_Q.cc:63
static number GetNumerator(number &n, const coeffs)
Definition flintcf_Q.cc:430
static BOOLEAN GreaterZero(number, const coeffs)
Definition flintcf_Q.cc:409
static number Gcd(number a, number b, const coeffs)
Definition flintcf_Q.cc:439
static BOOLEAN CoeffIsEqual(const coeffs r, n_coeffType n, void *)
Definition flintcf_Q.cc:48
static number Mult(number a, number b, const coeffs)
Definition flintcf_Q.cc:56
static number Invers(number a, const coeffs)
Definition flintcf_Q.cc:194
static number Lcm(number, number, const coeffs)
Definition flintcf_Q.cc:455
static int ParDeg(number x, const coeffs)
Definition flintcf_Q.cc:504
static BOOLEAN IsZero(number a, const coeffs)
Definition flintcf_Q.cc:384
static number Neg(number a, const coeffs)
Definition flintcf_Q.cc:189
static BOOLEAN Equal(number a, number b, const coeffs)
Definition flintcf_Q.cc:380
static BOOLEAN Greater(number a, number b, const coeffs)
Definition flintcf_Q.cc:376
static long Int(number &n, const coeffs)
Definition flintcf_Q.cc:142
static char * nlEatLong(char *s, mpz_ptr i)
Definition flintcf_Q.cc:29
static number Init_bigint(number i, const coeffs dummy, const coeffs dst)
static number IntMod(number a, number b, const coeffs c)
#define STATIC_VAR
Definition globaldefs.h:7
#define SR_INT
Definition longrat.h:67
#define SR_TO_INT(SR)
Definition longrat.h:69
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
Definition numbers.cc:683
const char *const nDivBy0
Definition numbers.h:89
#define omStrDup(s)
#define omFreeSize(addr, size)
#define omAlloc(size)
#define omFree(addr)
#define omAlloc0(size)
#define NULL
Definition omList.c:12
void StringAppendS(const char *st)
Definition reporter.cc:107
void s_readmpz_base(s_buff F, mpz_ptr a, int base)
Definition s_buff.cc:209
int s_readint(s_buff F)
Definition s_buff.cc:112
s_buff f_read
Definition s_buff.h:22
FILE * f_write
Definition s_buff.h:23
#define mpz_sgn1(A)
Definition si_gmp.h:18
#define SR_HDL(A)
Definition tgb.cc:35