My Project
numbers.cc
Go to the documentation of this file.
1 /*****************************************
2 * Computer Algebra System SINGULAR *
3 *****************************************/
4 
5 /*
6 * ABSTRACT: interface to coefficient aritmetics
7 */
8 
9 #include <string.h>
10 #include <stdlib.h>
11 
12 #include "misc/auxiliary.h"
13 #include "misc/mylimits.h"
14 #include "factory/factory.h"
15 
16 #include "reporter/reporter.h"
17 
18 #include "coeffs/coeffs.h"
19 #include "coeffs/numbers.h"
20 
21 #include "coeffs/longrat.h"
22 #include "coeffs/modulop.h"
23 #include "coeffs/gnumpfl.h"
24 #include "coeffs/gnumpc.h"
25 #include "coeffs/ffields.h"
26 #include "coeffs/shortfl.h"
27 #include "coeffs/ntupel.h"
28 #include "coeffs/flintcf_Qrat.h"
29 
30 #ifdef HAVE_RINGS
31 #include "coeffs/rmodulo2m.h"
32 #include "coeffs/rmodulon.h"
33 #include "coeffs/rintegers.h"
34 #endif
35 
36 #ifdef HAVE_POLYEXTENSIONS
39 #endif
40 
41 
42 #ifdef HAVE_NUMSTATS
43 VAR struct SNumberStatistic number_stats;
44 #endif /* HAVE_NUMSTATS */
45 
46 //static int characteristic = 0;
47 //extern int IsPrime(int p);
48 
50 
51 void nNew(number* d) { *d=NULL; }
52 
53 
54 static void ndDelete(number* d, const coeffs) { *d=NULL; }
55 static number ndAnn(number, const coeffs) { return NULL;}
56 static char* ndCoeffString(const coeffs r)
57 {
58  return omStrDup(r->cfCoeffName(r));
59 }
60 static void ndCoeffWrite(const coeffs r,BOOLEAN)
61 {
62  PrintS(r->cfCoeffName(r));
63 }
64 static char* ndCoeffName(const coeffs r)
65 {
66  STATIC_VAR char s[20];
67  snprintf(s,11,"Coeffs(%d)",r->type);
68  return s;
69 }
70 static void ndInpMult(number &a, number b, const coeffs r)
71 {
72  number n=r->cfMult(a,b,r);
73  r->cfDelete(&a,r);
74  a=n;
75 }
76 static void ndInpAdd(number &a, number b, const coeffs r)
77 {
78  number n=r->cfAdd(a,b,r);
79  r->cfDelete(&a,r);
80  a=n;
81 }
82 
83 static void ndPower(number a, int i, number * res, const coeffs r)
84 {
85  if (i==0)
86  {
87  *res = r->cfInit(1, r);
88  }
89  else if (i==1)
90  {
91  *res = r->cfCopy(a, r);
92  }
93  else if (i==2)
94  {
95  *res = r->cfMult(a, a, r);
96  }
97  else if (i<0)
98  {
99  number b = r->cfInvers(a, r);
100  ndPower(b, -i, res, r);
101  r->cfDelete(&b, r);
102  }
103  else
104  {
105  ndPower(a, i/2, res, r);
106  r->cfInpMult(*res, *res, r);
107  if (i&1)
108  {
109  r->cfInpMult(*res, a, r);
110  }
111  }
112 }
113 static number ndInvers(number a, const coeffs r)
114 {
115  number one=r->cfInit(1,r);
116  number res=r->cfDiv(one,a,r);
117  r->cfDelete(&one,r);
118  return res;
119 }
120 
121 static BOOLEAN ndIsUnit(number a, const coeffs r) { return !r->cfIsZero(a,r); }
122 #ifdef LDEBUG
123 // static void nDBDummy1(number* d,char *, int) { *d=NULL; }
124 static BOOLEAN ndDBTest(number, const char *, const int, const coeffs){ return TRUE; }
125 #endif
126 
127 static number ndFarey(number,number,const coeffs r)
128 {
129  Werror("farey not implemented for %s (c=%d)",r->cfCoeffName(r),getCoeffType(r));
130  return NULL;
131 }
132 static number ndChineseRemainder(number *,number *,int,BOOLEAN,CFArray&,const coeffs r)
133 {
134  Werror("ChineseRemainder not implemented for %s (c=%d)",r->cfCoeffName(r),getCoeffType(r));
135  return r->cfInit(0,r);
136 }
137 
138 static int ndParDeg(number n, const coeffs r)
139 {
140  return (-r->cfIsZero(n,r));
141 }
142 
143 static number ndParameter(const int, const coeffs r)
144 {
145  return r->cfInit(1,r);
146 }
147 
148 BOOLEAN n_IsZeroDivisor( number a, const coeffs r)
149 {
150  BOOLEAN ret = n_IsZero(a, r);
151  int c = n_GetChar(r);
152  if (ret || (c==0) || (r->is_field))
153  return ret; /*n_IsZero(a, r)*/
154  number ch = n_Init( c, r );
155  number g = n_Gcd( ch, a, r );
156  ret = !n_IsOne (g, r);
157  n_Delete(&ch, r);
158  n_Delete(&g, r);
159  return ret;
160 }
161 
162 static void ndNormalize(number&, const coeffs) { }
163 static number ndReturn0(number, const coeffs r) { return r->cfInit(0,r); }
164 number ndGcd(number, number, const coeffs r) { return r->cfInit(1,r); }
165 static number ndIntMod(number, number, const coeffs r) { return r->cfInit(0,r); }
166 static number ndGetDenom(number &, const coeffs r) { return r->cfInit(1,r); }
167 static number ndGetNumerator(number &a,const coeffs r) { return r->cfCopy(a,r); }
168 static int ndSize(number a, const coeffs r) { return (int)r->cfIsZero(a,r)==FALSE; }
169 
170 static void ndClearContent(ICoeffsEnumerator& numberCollectionEnumerator, number& c, const coeffs r)
171 {
172  assume(r != NULL);
173 
174  // no fractions
175  assume(!( nCoeff_is_Q(r) ));
176  // all coeffs are given by integers!!!
177 
178  numberCollectionEnumerator.Reset();
179 
180  if( !numberCollectionEnumerator.MoveNext() ) // empty zero polynomial?
181  {
182  c = n_Init(1, r);
183  return;
184  }
185 
186  number &curr = numberCollectionEnumerator.Current();
187 
188 #ifdef HAVE_RINGS
189  /// TODO: move to a separate implementation
190  if (nCoeff_is_Ring(r))
191  {
192  if (nCoeff_has_Units(r))
193  {
194  c = n_GetUnit(curr, r);
195 
196  if (!n_IsOne(c, r))
197  {
198  number inv = n_Invers(c, r);
199 
200  n_InpMult(curr, inv, r);
201 
202  while( numberCollectionEnumerator.MoveNext() )
203  {
204  number &n = numberCollectionEnumerator.Current();
205  n_Normalize(n, r); // ?
206  n_InpMult(n, inv, r); // TODO: either this or directly divide!!!?
207  }
208 
209  n_Delete(&inv, r);
210  }
211  } else c = n_Init(1, r);
212 
213  return;
214  }
215 #endif
216 
217  assume(!nCoeff_is_Ring(r));
219 
220  n_Normalize(curr, r); // Q: good/bad/ugly??
221 
222  if (!n_IsOne(curr, r))
223  {
224  number t = curr; // takes over the curr! note: not a reference!!!
225 
226  curr = n_Init(1, r); // ???
227 
228  number inv = n_Invers(t, r);
229 
230  while( numberCollectionEnumerator.MoveNext() )
231  {
232  number &n = numberCollectionEnumerator.Current();
233  n_InpMult(n, inv, r); // TODO: either this or directly divide!!!?
234 // n_Normalize(n, r); // ?
235  }
236 
237  n_Delete(&inv, r);
238 
239  c = t;
240  } else
241  c = n_Copy(curr, r); // c == 1 and nothing else to do...
242 }
243 
244 static void ndClearDenominators(ICoeffsEnumerator& /*numberCollectionEnumerator*/, number& d, const coeffs r)
245 {
246  assume( r != NULL );
249 
250  d = n_Init(1, r);
251 }
252 
253 static number ndCopy(number a, const coeffs) { return a; }
254 number ndCopyMap(number a, const coeffs aRing, const coeffs r)
255 {
256  // aRing and r need not be the same, but must be the same representation
257  assume(aRing->rep==r->rep);
259  return a;
260  else
261  return r->cfCopy(a, r);
262 }
263 
264 static void ndKillChar(coeffs) {}
265 static void ndSetChar(const coeffs) {}
266 
267 number nd_Copy(number a, const coeffs r) { return r->cfCopy(a, r); }
268 
269 #ifdef HAVE_RINGS
270 static BOOLEAN ndDivBy(number, number, const coeffs) { return TRUE; } // assume a,b !=0
271 static int ndDivComp(number, number, const coeffs) { return 2; }
272 static number ndExtGcd (number, number, number *, number *, const coeffs r) { return r->cfInit(1,r); }
273 #endif
274 
275 CanonicalForm ndConvSingNFactoryN( number, BOOLEAN /*setChar*/, const coeffs)
276 {
277  CanonicalForm term(0);
278  WerrorS("no conversion to factory");
279  return term;
280 }
281 
282 static number ndConvFactoryNSingN( const CanonicalForm, const coeffs)
283 {
284  WerrorS("no conversion from factory");
285  return NULL;
286 }
287 
288 /**< [in, out] a bigint number >= 0 */
289 /**< [out] the GMP equivalent */
290 /// Converts a non-negative bigint number into a GMP number.
291 static void ndMPZ(mpz_t result, number &n, const coeffs r)
292 {
293  mpz_init_set_si( result, r->cfInt(n, r) );
294 }
295 
296 static number ndInitMPZ(mpz_t m, const coeffs r)
297 {
298  return r->cfInit( mpz_get_si(m), r);
299 }
300 
301 
302 static BOOLEAN ndCoeffIsEqual(const coeffs r, n_coeffType n, void *)
303 {
304  /* test, if r is an instance of nInitCoeffs(n,parameter) */
305  /* if parameter is not needed */
306  return (n==r->type);
307 }
308 
309 static number ndQuotRem (number a, number b, number * r, const coeffs R)
310 {
311  // implementation for a field: r: 0, result: n_Div
312  assume(R->is_field);
313  *r=n_Init(0,R);
314  return n_Div(a,b,R);
315 }
318 { NULL, /*n_unknown */
319  npInitChar, /* n_Zp */
320  nlInitChar, /* n_Q */
321  nrInitChar, /* n_R */
322  nfInitChar, /* n_GF */
323  ngfInitChar, /* n_long_R */
324  #ifdef HAVE_POLYEXTENSIONS
325  n2pInitChar, /* n_polyExt */
326  naInitChar, /* n_algExt */
327  ntInitChar, /* n_transExt */
328  #else
329  NULL, /* n_polyExt */
330  NULL, /* n_algExt */
331  NULL, /* n_transExt */
332  #endif
333  ngcInitChar, /* n_long_C */
334  nnInitChar, /* n_nTupel */
335  #ifdef HAVE_RINGS
336  nrzInitChar, /* n_Z */
337  nrnInitChar, /* n_Zn */
338  nrnInitChar, /* n_Znm */
339  nr2mInitChar, /* n_Z2m */
340  #else
341  NULL, /* n_Z */
342  NULL, /* n_Zn */
343  NULL, /* n_Znm */
344  NULL, /* n_Z2m */
345  #endif
346  flintQrat_InitChar, /* n_FlintQrat */
347  NULL /* n_CF */
348 };
349 
351 /*2
352 * init operations for coeffs r
353 */
354 coeffs nInitChar(n_coeffType t, void * parameter)
355 {
356  n_Procs_s *n=cf_root;
357 
358  while((n!=NULL) && (n->nCoeffIsEqual!=NULL) && (!n->nCoeffIsEqual(n,t,parameter)))
359  n=n->next;
360 
361  if (n==NULL)
362  {
363  n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
364  n->next=cf_root;
365  n->ref=1;
366  n->type=t;
367 
368  // default entries (different from NULL) for some routines:
370  n->cfSize = ndSize;
373  n->cfImPart=ndReturn0;
374  n->cfDelete= ndDelete;
375  n->cfAnn = ndAnn;
378  n->cfCoeffName = ndCoeffName; // should alway be changed!
379  n->cfInpMult=ndInpMult;
380  n->cfInpAdd=ndInpAdd;
381  n->cfCopy = ndCopy;
382  n->cfIntMod=ndIntMod; /* dummy !! */
384  n->cfGcd = ndGcd;
385  n->cfNormalizeHelper = ndGcd; /* tricky, isn't it ?*/
386  n->cfLcm = ndGcd; /* tricky, isn't it ?*/
387  n->cfInitMPZ = ndInitMPZ;
388  n->cfMPZ = ndMPZ;
389  n->cfPower = ndPower;
390  n->cfQuotRem = ndQuotRem;
391  n->cfInvers = ndInvers;
392 
393  n->cfKillChar = ndKillChar; /* dummy */
394  n->cfSetChar = ndSetChar; /* dummy */
395  // temp. removed to catch all the coeffs which miss to implement this!
396 
398  n->cfFarey = ndFarey;
399  n->cfParDeg = ndParDeg;
400 
402 
405 
406  n->cfIsUnit = ndIsUnit;
407 #ifdef HAVE_RINGS
408  n->cfDivComp = ndDivComp;
409  n->cfDivBy = ndDivBy;
410  n->cfExtGcd = ndExtGcd;
411  //n->cfGetUnit = (nMapFunc)NULL;
412 #endif
413 
414 #ifdef LDEBUG
415  n->cfDBTest=ndDBTest;
416 #endif
417 
420 
421  BOOLEAN nOK=TRUE;
422  // init
423  if ((t<=nLastCoeffs) && (nInitCharTable[t]!=NULL))
424  nOK = (nInitCharTable[t])(n,parameter);
425  else
426  Werror("Sorry: the coeff type [%d] was not registered: it is missing in nInitCharTable", (int)t);
427  if (nOK)
428  {
429  omFreeSize(n,sizeof(*n));
430  return NULL;
431  }
432  cf_root=n;
433  // post init settings:
434  if (n->cfRePart==NULL) n->cfRePart=n->cfCopy;
435  if (n->cfExactDiv==NULL) n->cfExactDiv=n->cfDiv;
436  if (n->cfSubringGcd==NULL) n->cfSubringGcd=n->cfGcd;
437 
438 #ifdef HAVE_RINGS
439  if (n->cfGetUnit==NULL) n->cfGetUnit=n->cfCopy;
440 #endif
441 
442  if(n->cfWriteShort==NULL)
443  n->cfWriteShort = n->cfWriteLong;
444 
446  assume(n->cfSetChar!=NULL);
448  assume(n->cfMult!=NULL);
449  assume(n->cfSub!=NULL);
450  assume(n->cfAdd!=NULL);
451  assume(n->cfDiv!=NULL);
452  assume(n->cfIntMod!=NULL);
453  assume(n->cfExactDiv!=NULL);
454  assume(n->cfInit!=NULL);
455  assume(n->cfInitMPZ!=NULL);
456  assume(n->cfSize!=NULL);
457  assume(n->cfInt!=NULL);
458  assume(n->cfMPZ!=NULL);
459  //assume(n->n->cfDivComp!=NULL);
460  //assume(n->cfIsUnit!=NULL);
461  //assume(n->cfGetUnit!=NULL);
462  //assume(n->cfExtGcd!=NULL);
463  assume(n->cfInpNeg!=NULL);
464  assume(n->cfCopy!=NULL);
465 
466  assume(n->cfWriteLong!=NULL);
467  assume(n->cfWriteShort!=NULL);
468 
469  assume(n->iNumberOfParameters>= 0);
470 
471  assume( (n->iNumberOfParameters == 0 && n->pParameterNames == NULL) ||
472  (n->iNumberOfParameters > 0 && n->pParameterNames != NULL) );
473 
474  assume(n->cfParameter!=NULL);
475  assume(n->cfParDeg!=NULL);
476 
477  assume(n->cfRead!=NULL);
478  assume(n->cfNormalize!=NULL);
479  assume(n->cfGreater!=NULL);
480  //assume(n->cfDivBy!=NULL);
481  assume(n->cfEqual!=NULL);
482  assume(n->cfIsZero!=NULL);
483  assume(n->cfIsOne!=NULL);
484  assume(n->cfIsMOne!=NULL);
486  assume(n->cfGetDenom!=NULL);
488  assume(n->cfGcd!=NULL);
490  assume(n->cfDelete!=NULL);
491  assume(n->cfSetMap!=NULL);
492  assume(n->cfInpMult!=NULL);
493 // assume(n->cfInit_bigint!=NULL);
494  assume(n->cfCoeffWrite != NULL);
495 
496  assume(n->cfClearContent != NULL);
498 
499  assume(n->type==t);
500 
501 #ifndef SING_NDEBUG
502  if(n->cfKillChar==NULL) Warn("cfKillChar is NULL for coeff %d",t);
503  if(n->cfWriteLong==NULL) Warn("cfWrite is NULL for coeff %d",t);
504  if(n->cfWriteShort==NULL) Warn("cfWriteShort is NULL for coeff %d",t);
505 #endif
506  }
507  else
508  {
509  n->ref++;
510  }
511  return n;
512 }
513 
514 void nKillChar(coeffs r)
515 {
517  if (r!=NULL)
518  {
519  r->ref--;
520  if (r->ref<=0)
521  {
522  n_Procs_s tmp;
523  n_Procs_s* n=&tmp;
524  tmp.next=cf_root;
525  while((n->next!=NULL) && (n->next!=r)) n=n->next;
526  if (n->next==r)
527  {
528  n->next=n->next->next;
529  if (cf_root==r) cf_root=n->next;
530  assume (r->cfKillChar!=NULL); r->cfKillChar(r); // STATISTIC(nKillChar);
531  omFreeSize((void *)r, sizeof(n_Procs_s));
532  r=NULL;
533  }
534  else
535  {
536  WarnS("cf_root list destroyed");
537  }
538  }
539  }
540 }
541 
543 {
544  if (n==n_unknown)
545  {
548  {
550  ((int)nLastCoeffs+1)*sizeof(cfInitCharProc));
552  ((int)nLastCoeffs)*sizeof(cfInitCharProc));
553  }
554  else
555  {
557  ((int)nLastCoeffs)*sizeof(cfInitCharProc),
558  (((int)nLastCoeffs)+1)*sizeof(cfInitCharProc));
559  }
560 
562  return nLastCoeffs;
563  }
564  else
565  {
566  if (nInitCharTable[n]!=NULL) Print("coeff %d already initialized\n",n);
567  nInitCharTable[n]=p;
568  return n;
569  }
570 }
571 
572 struct nFindCoeffByName_s;
573 typedef struct nFindCoeffByName_s* nFindCoeffByName_p;
574 
575 struct nFindCoeffByName_s
576 {
579  nFindCoeffByName_p next;
580 };
581 
582 VAR nFindCoeffByName_p nFindCoeffByName_Root=NULL;
584 {
585  nFindCoeffByName_p h=(nFindCoeffByName_p)omAlloc0(sizeof(*h));
586  h->p=p;
587  h->n=n;
588  h->next=nFindCoeffByName_Root;
590 }
591 
592 coeffs nFindCoeffByName(char *cf_name)
593 {
594  n_Procs_s* n=cf_root;
595  // try existings coeffs:
596  while(n!=NULL)
597  {
598  if ((n->cfCoeffName!=NULL)
599  && (strcmp(cf_name,n->cfCoeffName(n))==0)) return n;
600  n=n->next;
601  }
602  // TODO: parametrized cf, e.g. flint:Z/26[a]
603  // try existing types:
604  nFindCoeffByName_p p=nFindCoeffByName_Root;
605  while(p!=NULL)
606  {
607  coeffs cf=p->p(cf_name,p->n);
608  if (cf!=NULL) return cf;
609  p=p->next;
610  }
611  return NULL;
612 }
613 
614 void n_Print(number& a, const coeffs r)
615 {
616  assume(r != NULL);
617  n_Test(a,r);
618 
619  StringSetS("");
620  n_Write(a, r);
621  { char* s = StringEndS(); Print("%s", s); omFree(s); }
622 }
623 
624 
625 number n_convFactoryNSingN( const CanonicalForm n, const coeffs r)
626 { STATISTIC(n_convFactoryNSingN); assume(r != NULL); assume(r->convFactoryNSingN != NULL); return r->convFactoryNSingN(n, r); }
627 
628 
629 
630 CanonicalForm n_convSingNFactoryN( number n, BOOLEAN setChar, const coeffs r )
631 { STATISTIC(n_convSingNFactoryN); assume(r != NULL); assume(r->convSingNFactoryN != NULL); return r->convSingNFactoryN(n, setChar, r); }
632 
633 
634 char* nEati(char *s, int *i, int m)
635 {
636 
637  if (((*s) >= '0') && ((*s) <= '9'))
638  {
639  unsigned long ii=0L;
640  do
641  {
642  ii *= 10;
643  ii += *s++ - '0';
644  if ((m!=0) && (ii > (MAX_INT_VAL / 10))) ii = ii % m;
645  }
646  while (((*s) >= '0') && ((*s) <= '9'));
647  if ((m!=0) && (ii>=(unsigned)m)) ii=ii%m;
648  *i=(int)ii;
649  }
650  else (*i) = 1;
651  return s;
652 }
653 
654 /// extracts a long integer from s, returns the rest
655 char * nEatLong(char *s, mpz_ptr i)
656 {
657  const char * start=s;
658 
659  while (*s >= '0' && *s <= '9') s++;
660  if (*s=='\0')
661  {
662  mpz_set_str(i,start,10);
663  }
664  else
665  {
666  char c=*s;
667  *s='\0';
668  mpz_set_str(i,start,10);
669  *s=c;
670  }
671  return s;
672 }
673 
BOOLEAN naInitChar(coeffs cf, void *infoStruct)
Initialize the coeffs object.
Definition: algext.cc:1373
BOOLEAN n2pInitChar(coeffs cf, void *infoStruct)
Definition: algext.cc:1627
All the auxiliary stuff.
int BOOLEAN
Definition: auxiliary.h:87
#define TRUE
Definition: auxiliary.h:100
#define FALSE
Definition: auxiliary.h:96
int m
Definition: cfEzgcd.cc:128
int i
Definition: cfEzgcd.cc:132
int p
Definition: cfModGcd.cc:4080
g
Definition: cfModGcd.cc:4092
CanonicalForm cf
Definition: cfModGcd.cc:4085
CanonicalForm b
Definition: cfModGcd.cc:4105
factory's main class
Definition: canonicalform.h:86
virtual reference Current()=0
Gets the current element in the collection (read and write).
virtual void Reset()=0
Sets the enumerator to its initial position: -1, which is before the first element in the collection.
virtual bool MoveNext()=0
Advances the enumerator to the next element of the collection. returns true if the enumerator was suc...
Templated enumerator interface for simple iteration over a generic collection of T's.
Definition: Enumerator.h:125
Definition: int_poly.h:33
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition: coeffs.h:452
static FORCE_INLINE BOOLEAN nCoeff_has_Units(const coeffs r)
returns TRUE, if r is not a field and r has non-trivial units
Definition: coeffs.h:821
static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
Definition: coeffs.h:863
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
Definition: coeffs.h:736
n_coeffType
Definition: coeffs.h:28
@ n_CF
?
Definition: coeffs.h:49
@ n_unknown
Definition: coeffs.h:29
static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
in Z: return the gcd of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ,...
Definition: coeffs.h:687
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
Definition: coeffs.h:565
static FORCE_INLINE BOOLEAN nCoeff_is_numeric(const coeffs r)
Definition: coeffs.h:856
static FORCE_INLINE BOOLEAN nCoeff_is_Zp_a(const coeffs r)
Definition: coeffs.h:883
static FORCE_INLINE BOOLEAN nCoeff_is_Q_algext(const coeffs r)
is it an alg. ext. of Q?
Definition: coeffs.h:938
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...
Definition: coeffs.h:616
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
Definition: coeffs.h:830
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
Definition: coeffs.h:465
static FORCE_INLINE number n_GetUnit(number n, const coeffs r)
in Z: 1 in Z/kZ (where k is not a prime): largest divisor of n (taken in Z) that is co-prime with k i...
Definition: coeffs.h:533
static FORCE_INLINE BOOLEAN nCoeff_has_simple_Alloc(const coeffs r)
TRUE if n_Delete/n_New are empty operations.
Definition: coeffs.h:930
static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
Definition: coeffs.h:754
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:422
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
Definition: coeffs.h:445
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:456
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:592
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:824
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
Definition: coeffs.h:539
static FORCE_INLINE BOOLEAN nCoeff_is_algExt(const coeffs r)
TRUE iff r represents an algebraic extension field.
Definition: coeffs.h:934
static FORCE_INLINE void n_InpMult(number &a, number b, const coeffs r)
multiplication of 'a' and 'b'; replacement of 'a' by the product a*b
Definition: coeffs.h:642
static FORCE_INLINE void n_Normalize(number &n, const coeffs r)
inplace-normalization of n; produces some canonical representation of n;
Definition: coeffs.h:579
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:469
static FORCE_INLINE BOOLEAN nCoeff_is_transExt(const coeffs r)
TRUE iff r represents a transcendental extension field.
Definition: coeffs.h:942
#define Print
Definition: emacs.cc:80
#define Warn
Definition: emacs.cc:77
#define WarnS
Definition: emacs.cc:78
return result
Definition: facAbsBiFact.cc:75
const CanonicalForm int s
Definition: facAbsFact.cc:51
CanonicalForm res
Definition: facAbsFact.cc:60
void WerrorS(const char *s)
Definition: feFopen.cc:24
BOOLEAN nfInitChar(coeffs r, void *parameter)
Definition: ffields.cc:858
BOOLEAN flintQrat_InitChar(coeffs cf, void *infoStruct)
#define STATIC_VAR
Definition: globaldefs.h:7
#define VAR
Definition: globaldefs.h:5
BOOLEAN ngcInitChar(coeffs n, void *parameter)
Initialize r (n_long_C)
Definition: gnumpc.cc:554
BOOLEAN ngfInitChar(coeffs n, void *parameter)
Initialize r.
Definition: gnumpfl.cc:506
STATIC_VAR Poly * h
Definition: janet.cc:971
BOOLEAN nlInitChar(coeffs r, void *p)
Definition: longrat.cc:3433
#define assume(x)
Definition: mod2.h:387
BOOLEAN npInitChar(coeffs r, void *p)
Definition: modulop.cc:340
const int MAX_INT_VAL
Definition: mylimits.h:12
The main handler for Singular numbers which are suitable for Singular polynomials.
BOOLEAN nnInitChar(coeffs n, void *p)
Initialize r.
Definition: ntupel.cc:588
static void ndPower(number a, int i, number *res, const coeffs r)
Definition: numbers.cc:83
void nRegisterCfByName(cfInitCfByNameProc p, n_coeffType n)
Definition: numbers.cc:582
CanonicalForm ndConvSingNFactoryN(number, BOOLEAN, const coeffs)
Definition: numbers.cc:275
static int ndDivComp(number, number, const coeffs)
Definition: numbers.cc:271
VAR nFindCoeffByName_p nFindCoeffByName_Root
Definition: numbers.cc:581
static BOOLEAN ndDBTest(number, const char *, const int, const coeffs)
Definition: numbers.cc:124
number ndGcd(number, number, const coeffs r)
Definition: numbers.cc:164
static void ndKillChar(coeffs)
Definition: numbers.cc:264
static number ndConvFactoryNSingN(const CanonicalForm, const coeffs)
[in, out] a bigint number >= 0
Definition: numbers.cc:282
static void ndClearDenominators(ICoeffsEnumerator &, number &d, const coeffs r)
Definition: numbers.cc:244
static void ndClearContent(ICoeffsEnumerator &numberCollectionEnumerator, number &c, const coeffs r)
Definition: numbers.cc:170
static int ndParDeg(number n, const coeffs r)
Definition: numbers.cc:138
static BOOLEAN ndCoeffIsEqual(const coeffs r, n_coeffType n, void *)
Definition: numbers.cc:301
static char * ndCoeffString(const coeffs r)
Definition: numbers.cc:56
CanonicalForm n_convSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
Definition: numbers.cc:629
VAR n_Procs_s * cf_root
Definition: numbers.cc:49
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
Definition: numbers.cc:254
static char * ndCoeffName(const coeffs r)
Definition: numbers.cc:64
void n_Print(number &a, const coeffs r)
print a number (BEWARE of string buffers!) mostly for debugging
Definition: numbers.cc:613
static void ndNormalize(number &, const coeffs)
Definition: numbers.cc:162
nFindCoeffByName_p next
Definition: numbers.cc:578
static int ndSize(number a, const coeffs r)
Definition: numbers.cc:168
static number ndIntMod(number, number, const coeffs r)
Definition: numbers.cc:165
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition: numbers.cc:353
static number ndFarey(number, number, const coeffs r)
Definition: numbers.cc:127
void nNew(number *d)
Definition: numbers.cc:51
number n_convFactoryNSingN(const CanonicalForm n, const coeffs r)
Definition: numbers.cc:624
static void ndMPZ(mpz_t result, number &n, const coeffs r)
Converts a non-negative bigint number into a GMP number.
Definition: numbers.cc:290
STATIC_VAR n_coeffType nLastCoeffs
Definition: numbers.cc:315
static number ndAnn(number, const coeffs)
Definition: numbers.cc:55
static number ndGetDenom(number &, const coeffs r)
Definition: numbers.cc:166
static void ndDelete(number *d, const coeffs)
Definition: numbers.cc:54
STATIC_VAR cfInitCharProc * nInitCharTable
Definition: numbers.cc:349
n_coeffType n
Definition: numbers.cc:576
static number ndParameter(const int, const coeffs r)
Definition: numbers.cc:143
static number ndCopy(number a, const coeffs)
Definition: numbers.cc:253
static void ndInpMult(number &a, number b, const coeffs r)
Definition: numbers.cc:70
VAR cfInitCharProc nInitCharTableDefault[]
Definition: numbers.cc:316
static number ndChineseRemainder(number *, number *, int, BOOLEAN, CFArray &, const coeffs r)
Definition: numbers.cc:132
coeffs nFindCoeffByName(char *cf_name)
find an existing coeff by its "CoeffName"
Definition: numbers.cc:591
static number ndGetNumerator(number &a, const coeffs r)
Definition: numbers.cc:167
static BOOLEAN ndDivBy(number, number, const coeffs)
Definition: numbers.cc:270
static BOOLEAN ndIsUnit(number a, const coeffs r)
Definition: numbers.cc:121
static number ndInitMPZ(mpz_t m, const coeffs r)
Definition: numbers.cc:295
cfInitCfByNameProc p
Definition: numbers.cc:577
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
Definition: numbers.cc:654
static void ndInpAdd(number &a, number b, const coeffs r)
Definition: numbers.cc:76
number nd_Copy(number a, const coeffs r)
Definition: numbers.cc:267
static number ndInvers(number a, const coeffs r)
Definition: numbers.cc:113
BOOLEAN n_IsZeroDivisor(number a, const coeffs r)
Test whether a is a zero divisor in r i.e. not coprime with char. of r very inefficient implementatio...
Definition: numbers.cc:148
static void ndCoeffWrite(const coeffs r, BOOLEAN)
Definition: numbers.cc:60
n_coeffType nRegister(n_coeffType n, cfInitCharProc p)
Definition: numbers.cc:541
static number ndReturn0(number, const coeffs r)
Definition: numbers.cc:163
static number ndExtGcd(number, number, number *, number *, const coeffs r)
Definition: numbers.cc:272
static number ndQuotRem(number a, number b, number *r, const coeffs R)
Definition: numbers.cc:308
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
Definition: numbers.cc:633
static void ndSetChar(const coeffs)
Definition: numbers.cc:265
void nKillChar(coeffs r)
undo all initialisations
Definition: numbers.cc:513
coeffs(* cfInitCfByNameProc)(char *s, n_coeffType n)
initialize an object of type coeffs by its name, return NULL otherwise
Definition: numbers.h:97
BOOLEAN(* cfInitCharProc)(coeffs, void *)
initialize an object of type coeff, return FALSE in case of success
Definition: numbers.h:93
#define STATISTIC(f)
Definition: numstats.h:16
#define omStrDup(s)
Definition: omAllocDecl.h:263
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
#define omReallocSize(addr, o_size, size)
Definition: omAllocDecl.h:220
#define omFree(addr)
Definition: omAllocDecl.h:261
#define omAlloc0(size)
Definition: omAllocDecl.h:211
#define NULL
Definition: omList.c:12
void StringSetS(const char *st)
Definition: reporter.cc:128
void PrintS(const char *s)
Definition: reporter.cc:284
char * StringEndS()
Definition: reporter.cc:151
void Werror(const char *fmt,...)
Definition: reporter.cc:189
BOOLEAN nrzInitChar(coeffs r, void *parameter)
BOOLEAN nr2mInitChar(coeffs r, void *p)
Definition: rmodulo2m.cc:769
BOOLEAN nrnInitChar(coeffs r, void *p)
Definition: rmodulon.cc:987
BOOLEAN nrInitChar(coeffs n, void *p)
Initialize r.
Definition: shortfl.cc:666
#define R
Definition: sirandom.c:27
BOOLEAN(* cfIsUnit)(number a, const coeffs r)
Definition: coeffs.h:379
number(* cfChineseRemainder)(number *x, number *q, int rl, BOOLEAN sym, CFArray &inv_cache, const coeffs)
chinese remainder returns X with X mod q[i]=x[i], i=0..rl-1
Definition: coeffs.h:298
number(* cfNormalizeHelper)(number a, number b, const coeffs r)
Definition: coeffs.h:272
int(* cfDivComp)(number a, number b, const coeffs r)
Definition: coeffs.h:378
BOOLEAN(*)(*)(*)(*)(*)(*) cfGreaterZero(number a, const coeffs r)
Definition: coeffs.h:238
number(* cfExtGcd)(number a, number b, number *s, number *t, const coeffs r)
Definition: coeffs.h:249
number(* cfGetUnit)(number a, const coeffs r)
Definition: coeffs.h:380
number(* cfLcm)(number a, number b, const coeffs r)
Definition: coeffs.h:271
number(* cfGetNumerator)(number &n, const coeffs r)
Definition: coeffs.h:242
number(* cfInvers)(number a, const coeffs r)
return 1/a
Definition: coeffs.h:198
number(* cfInit)(long i, const coeffs r)
init with an integer
Definition: coeffs.h:179
int iNumberOfParameters
Number of Parameters in the coeffs (default 0)
Definition: coeffs.h:320
number(* cfInpNeg)(number a, const coeffs r)
changes argument inline: a:= -a return -a! (no copy is returned) the result should be assigned to the...
Definition: coeffs.h:196
number(* cfInitMPZ)(mpz_t i, const coeffs r)
init with a GMP integer
Definition: coeffs.h:182
char *(* cfCoeffName)(const coeffs r)
default name of cf, should substitue cfCoeffWrite, cfCoeffString
Definition: coeffs.h:155
nMapFunc(* cfSetMap)(const coeffs src, const coeffs dst)
Definition: coeffs.h:276
number(* cfParameter)(const int i, const coeffs r)
create i^th parameter or NULL if not possible
Definition: coeffs.h:304
void(* cfSetChar)(const coeffs r)
Definition: coeffs.h:162
number(* convFactoryNSingN)(const CanonicalForm n, const coeffs r)
conversion to CanonicalForm(factory) to number
Definition: coeffs.h:316
number(* cfGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:247
number(* cfImPart)(number a, const coeffs r)
Definition: coeffs.h:202
number(* cfFarey)(number p, number n, const coeffs)
rational reconstruction: "best" rational a/b with a/b = p mod n
Definition: coeffs.h:292
coeffs next
Definition: coeffs.h:126
number(* cfCopy)(number a, const coeffs r)
return a copy of a
Definition: coeffs.h:200
int ref
Definition: coeffs.h:127
BOOLEAN(*)(*)(*) cfIsZero(number a, const coeffs r)
Definition: coeffs.h:229
void(* cfKillChar)(coeffs r)
Definition: coeffs.h:160
BOOLEAN(*)(*) cfEqual(number a, number b, const coeffs r)
tests
Definition: coeffs.h:228
numberfunc cfIntMod
Definition: coeffs.h:176
numberfunc cfExactDiv
Definition: coeffs.h:176
void(* cfMPZ)(mpz_t result, number &n, const coeffs r)
Converts a (integer) number n into a GMP number, 0 if impossible.
Definition: coeffs.h:191
BOOLEAN(* nCoeffIsEqual)(const coeffs r, n_coeffType n, void *parameter)
Definition: coeffs.h:146
void(* cfWriteShort)(number a, const coeffs r)
print a given number in a shorter way, if possible e.g. in K(a): a2 instead of a^2
Definition: coeffs.h:209
number(* cfRePart)(number a, const coeffs r)
Definition: coeffs.h:201
void(* cfNormalize)(number &a, const coeffs r)
Definition: coeffs.h:224
numberfunc cfMult
Definition: coeffs.h:176
char *(* cfCoeffString)(const coeffs r)
string output of coeff description
Definition: coeffs.h:152
number(* cfGetDenom)(number &n, const coeffs r)
Definition: coeffs.h:241
void(* cfWriteLong)(number a, const coeffs r)
print a given number (long format)
Definition: coeffs.h:205
number(* cfSubringGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:248
BOOLEAN(*)(*)(*)(*) cfIsOne(number a, const coeffs r)
Definition: coeffs.h:230
number(* cfAnn)(number a, const coeffs r)
Definition: coeffs.h:262
void(* cfPower)(number a, int i, number *result, const coeffs r)
Definition: coeffs.h:240
CanonicalForm(* convSingNFactoryN)(number n, BOOLEAN setChar, const coeffs r)
Definition: coeffs.h:317
long(* cfInt)(number &n, const coeffs r)
convertion to long, 0 if impossible
Definition: coeffs.h:188
BOOLEAN(* cfGreater)(number a, number b, const coeffs r)
Definition: coeffs.h:226
number(* cfQuotRem)(number a, number b, number *rem, const coeffs r)
Definition: coeffs.h:270
void(* cfCoeffWrite)(const coeffs r, BOOLEAN details)
output of coeff description via Print
Definition: coeffs.h:149
void(* cfDelete)(number *a, const coeffs r)
Definition: coeffs.h:273
numberfunc cfSub
Definition: coeffs.h:176
BOOLEAN(* cfDBTest)(number a, const char *f, const int l, const coeffs r)
Test: is "a" a correct number?
Definition: coeffs.h:416
n_coeffType type
Definition: coeffs.h:129
numberfunc cfAdd
Definition: coeffs.h:176
BOOLEAN(*)(*)(*)(*)(*) cfIsMOne(number a, const coeffs r)
Definition: coeffs.h:233
numberfunc cfDiv
Definition: coeffs.h:176
char const ** pParameterNames
array containing the names of Parameters (default NULL)
Definition: coeffs.h:323
int(* cfParDeg)(number x, const coeffs r)
degree for coeffcients: -1 for 0, 0 for "constants", ...
Definition: coeffs.h:301
void(* cfInpMult)(number &a, number b, const coeffs r)
Inplace: a *= b.
Definition: coeffs.h:282
int(* cfSize)(number n, const coeffs r)
how complicated, (0) => 0, or positive
Definition: coeffs.h:185
const char *(* cfRead)(const char *s, number *a, const coeffs r)
Definition: coeffs.h:222
void(* cfInpAdd)(number &a, number b, const coeffs r)
Inplace: a += b.
Definition: coeffs.h:285
BOOLEAN(* cfDivBy)(number a, number b, const coeffs r)
Definition: coeffs.h:382
nCoeffsEnumeratorFunc cfClearContent
function pointer behind n_ClearContent
Definition: coeffs.h:310
nCoeffsEnumeratorFunc cfClearDenominators
function pointer behind n_ClearDenominators
Definition: coeffs.h:313
BOOLEAN ntInitChar(coeffs cf, void *infoStruct)
Initialize the coeffs object.
Definition: transext.cc:2544