coeffs.h
Go to the documentation of this file.
1 /*! \file coeffs/coeffs.h Coefficient rings, fields and other domains suitable for Singular polynomials
2 
3  The main interface for Singular coefficients: \ref coeffs is the main handler for Singular numbers
4 */
5 /****************************************
6 * Computer Algebra System SINGULAR *
7 ****************************************/
8 
9 #ifndef COEFFS_H
10 #define COEFFS_H
11 
12 #include <misc/auxiliary.h>
13 #include <omalloc/omalloc.h>
14 
15 #include <misc/sirandom.h>
16 /* for assume: */
17 #include <reporter/reporter.h>
18 #include <reporter/s_buff.h>
19 
20 #include <coeffs/si_gmp.h>
21 #include <coeffs/Enumerator.h>
22 #include <coeffs/numstats.h> // for STATISTIC(F) counting macro
23 
24 class CanonicalForm;
25 
27 {
29  n_Zp, /**< \F{p < 2^31} */
30  n_Q, /**< rational (GMP) numbers */
31  n_R, /**< single prescision (6,6) real numbers */
32  n_GF, /**< \GF{p^n < 2^16} */
33  n_long_R, /**< real floating point (GMP) numbers */
34  n_algExt, /**< used for all algebraic extensions, i.e.,
35  the top-most extension in an extension tower
36  is algebraic */
37  n_transExt, /**< used for all transcendental extensions, i.e.,
38  the top-most extension in an extension tower
39  is transcendental */
40  n_long_C, /**< complex floating point (GMP) numbers */
41  n_Z, /**< only used if HAVE_RINGS is defined: ? */
42  n_Zn, /**< only used if HAVE_RINGS is defined: ? */
43  n_Znm, /**< only used if HAVE_RINGS is defined: ? */
44  n_Z2m, /**< only used if HAVE_RINGS is defined: ? */
45  n_CF /**< ? */
46 };
47 
48 extern unsigned short fftable[];
49 
50 struct snumber;
51 typedef struct snumber * number;
52 
53 /* standard types */
54 struct ip_sring;
55 typedef struct ip_sring * ring;
56 typedef struct ip_sring const * const_ring;
57 
58 /// @class coeffs coeffs.h coeffs/coeffs.h
59 ///
60 /// The main handler for Singular numbers which are suitable for Singular polynomials.
61 ///
62 /// With it one may implement a ring, a field, a domain etc.
63 ///
64 struct n_Procs_s;
65 typedef struct n_Procs_s *coeffs;
66 typedef struct n_Procs_s const * const_coeffs;
67 
68 typedef number (*numberfunc)(number a, number b, const coeffs r);
69 
70 /// maps "a", which lives in src, into dst
71 typedef number (*nMapFunc)(number a, const coeffs src, const coeffs dst);
72 
73 
74 /// Abstract interface for an enumerator of number coefficients for an
75 /// object, e.g. a polynomial
77 
78 /// goes over coeffs given by the ICoeffsEnumerator and changes them.
79 /// Additionally returns a number;
80 typedef void (*nCoeffsEnumeratorFunc)(ICoeffsEnumerator& numberCollectionEnumerator, number& output, const coeffs r);
81 
82 extern omBin rnumber_bin;
83 
84 #define FREE_RNUMBER(x) omFreeBin((void *)x, rnumber_bin)
85 #define ALLOC_RNUMBER() (number)omAllocBin(rnumber_bin)
86 #define ALLOC0_RNUMBER() (number)omAlloc0Bin(rnumber_bin)
87 
88 
89 /// Creation data needed for finite fields
90 typedef struct
91 {
92  int GFChar;
93  int GFDegree;
94  const char* GFPar_name;
95 } GFInfo;
96 
97 typedef struct
98 {
99  short float_len; /**< additional char-flags, rInit */
100  short float_len2; /**< additional char-flags, rInit */
101  const char* par_name; /**< parameter name */
103 
104 
106 {
108  n_rep_int, /**< (int), see modulop.h */
109  n_rep_gap_rat, /**< (number), see longrat.h */
110  n_rep_gap_gmp, /**< (), see rinteger.h, new impl. */
111  n_rep_poly, /**< (poly), see algext.h */
112  n_rep_rat_fct, /**< (fraction), see transext.h */
113  n_rep_gmp, /**< (mpz_ptr), see rmodulon,h */
114  n_rep_float, /**< (float), see shortfl.h */
115  n_rep_gmp_float, /**< (gmp_float), see */
116  n_rep_gmp_complex,/**< (gmp_complex), see gnumpc.h */
117  n_rep_gf /**< (int), see ffields.h */
118 };
119 
120 struct n_Procs_s
121 {
122  // administration of coeffs:
123  coeffs next;
124  int ref;
127  /// how many variables of factory are already used by this coeff
129 
130  // general properties:
131  /// TRUE, if nNew/nDelete/nCopy are dummies
133  /// TRUE, if std should make polynomials monic (if nInvers is cheap)
134  /// if false, then a gcd routine is used for a content computation
136 
137  /// TRUE, if cf is a field
139  /// TRUE, if cf is a domain
141 
142  // tests for numbers.cc:
143  BOOLEAN (*nCoeffIsEqual)(const coeffs r, n_coeffType n, void * parameter);
144 
145  /// output of coeff description via Print
146  void (*cfCoeffWrite)(const coeffs r, BOOLEAN details);
147 
148  /// string output of coeff description
149  char* (*cfCoeffString)(const coeffs r);
150 
151  /// default name of cf, should substitue cfCoeffWrite, cfCoeffString
152  char* (*cfCoeffName)(const coeffs r);
153 
154  // ?
155  // initialisation:
156  //void (*cfInitChar)(coeffs r, int parameter); // do one-time initialisations
157  void (*cfKillChar)(coeffs r); // undo all initialisations
158  // or NULL
159  void (*cfSetChar)(const coeffs r); // initialisations after each ring change
160  // or NULL
161  // general stuff
162  // if the ring has a meaningful Euclidean structure, hopefully
163  // supported by cfQuotRem, then
164  // IntMod, Div should give the same result
165  // Div(a,b) = QuotRem(a,b, &IntMod(a,b))
166  // if the ring is not Euclidean or a field, then IntMod should return 0
167  // and Div the exact quotient. It is assumed that the function is
168  // ONLY called on Euclidean rings or in the case of an exact division.
169  //
170  // cfDiv does an exact division, but has to handle illegal input
171  // cfExactDiv does an exact division, but no error checking
172  // (I'm not sure I understant and even less that this makes sense)
174 
175  /// init with an integer
176  number (*cfInit)(long i,const coeffs r);
177 
178  /// init with a GMP integer
179  number (*cfInitMPZ)(mpz_t i, const coeffs r);
180 
181  /// how complicated, (0) => 0, or positive
182  int (*cfSize)(number n, const coeffs r);
183 
184  /// convertion to long, 0 if impossible
185  long (*cfInt)(number &n, const coeffs r);
186 
187  /// Converts a non-negative number n into a GMP number, 0 if impossible
188  void (*cfMPZ)(mpz_t result, number &n, const coeffs r);
189 
190  /// changes argument inline: a:= -a
191  /// return -a! (no copy is returned)
192  /// the result should be assigned to the original argument: e.g. a = n_InpNeg(a,r)
193  number (*cfInpNeg)(number a, const coeffs r);
194  /// return 1/a
195  number (*cfInvers)(number a, const coeffs r);
196  /// return a copy of a
197  number (*cfCopy)(number a, const coeffs r);
198  number (*cfRePart)(number a, const coeffs r);
199  number (*cfImPart)(number a, const coeffs r);
200 
201  /// print a given number (long format)
202  void (*cfWriteLong)(number &a, const coeffs r);
203 
204  /// print a given number in a shorter way, if possible
205  /// e.g. in K(a): a2 instead of a^2
206  void (*cfWriteShort)(number &a, const coeffs r);
207 
208  // it is legal, but not always useful to have cfRead(s, a, r)
209  // just return s again.
210  // Useful application (read constants which are not an projection
211  // from int/bigint:
212  // Let ring r = R,x,dp;
213  // where R is a coeffs having "special" "named" elements (ie.
214  // the primitive element in some algebraic extension).
215  // If there is no interpreter variable of the same name, it is
216  // difficult to create non-trivial elements in R.
217  // Hence one can use the string to allow creation of R-elts using the
218  // unbound name of the special element.
219  const char * (*cfRead)(const char * s, number * a, const coeffs r);
220 
221  void (*cfNormalize)(number &a, const coeffs r);
222 
223  BOOLEAN (*cfGreater)(number a,number b, const coeffs r),
224  /// tests
225  (*cfEqual)(number a,number b, const coeffs r),
226  (*cfIsZero)(number a, const coeffs r),
227  (*cfIsOne)(number a, const coeffs r),
228  (*cfIsMOne)(number a, const coeffs r),
229  //GreaterZero is used for printing of polynomials:
230  // a "+" is only printed in front of a coefficient
231  // if the element is >0. It is assumed that any element
232  // failing this will start printing with a leading "-"
233  (*cfGreaterZero)(number a, const coeffs r);
234 
235  void (*cfPower)(number a, int i, number * result, const coeffs r);
236  number (*cfGetDenom)(number &n, const coeffs r);
237  number (*cfGetNumerator)(number &n, const coeffs r);
238  //CF: a Euclidean ring is a commutative, unitary ring with an Euclidean
239  // function f s.th. for all a,b in R, b ne 0, we can find q, r s.th.
240  // a = qb+r and either r=0 or f(r) < f(b)
241  // Note that neither q nor r nor f(r) are unique.
242  number (*cfGcd)(number a, number b, const coeffs r);
243  number (*cfSubringGcd)(number a, number b, const coeffs r);
244  number (*cfExtGcd)(number a, number b, number *s, number *t,const coeffs r);
245  //given a and b in a Euclidean setting, return s,t,u,v sth.
246  // sa + tb = gcd
247  // ua + vb = 0
248  // sv + tu = 1
249  // ie. the 2x2 matrix (s t | u v) is unimodular and maps (a,b) to (g, 0)
250  //CF: note, in general, this cannot be derived from ExtGcd due to
251  // zero divisors
252  number (*cfXExtGcd)(number a, number b, number *s, number *t, number *u, number *v, const coeffs r);
253  //in a Euclidean ring, return the Euclidean norm as a bigint (of type number)
254  number (*cfEucNorm)(number a, const coeffs r);
255  //in a principal ideal ring (with zero divisors): the annihilator
256  // NULL otherwise
257  number (*cfAnn)(number a, const coeffs r);
258  //find a "canonical representative of a modulo the units of r
259  //return NULL if a is already normalized
260  //otherwise, the factor.
261  //(for Z: make positive, for z/nZ make the gcd with n
262  //aparently it is GetUnit!
263  //in a Euclidean ring, return the quotient and compute the remainder
264  //rem can be NULL
265  number (*cfQuotRem)(number a, number b, number *rem, const coeffs r);
266  number (*cfLcm)(number a, number b, const coeffs r);
267  number (*cfNormalizeHelper)(number a, number b, const coeffs r);
268  void (*cfDelete)(number * a, const coeffs r);
269 
270  //CF: tries to find a canonical map from src -> dst
271  nMapFunc (*cfSetMap)(const coeffs src, const coeffs dst);
272 
273  void (*cfWriteFd)(number a, FILE *f, const coeffs r);
274  number (*cfReadFd)( s_buff f, const coeffs r);
275 
276  /// Inplace: a *= b
277  void (*cfInpMult)(number &a, number b, const coeffs r);
278 
279  /// Inplace: a += b
280  void (*cfInpAdd)(number &a, number b, const coeffs r);
281 
282  /// rational reconstruction: "best" rational a/b with a/b = p mod n
283  // or a = bp mod n
284  // CF: no idea what this would be in general
285  // it seems to be extended to operate coefficient wise in extensions.
286  // I presume then n in coeffs_BIGINT while p in coeffs
287  number (*cfFarey)(number p, number n, const coeffs);
288 
289  /// chinese remainder
290  /// returns X with X mod q[i]=x[i], i=0..rl-1
291  //CF: by the looks of it: q[i] in Z (coeffs_BIGINT)
292  // strange things happen in naChineseRemainder for example.
293  number (*cfChineseRemainder)(number *x, number *q,int rl, BOOLEAN sym,const coeffs);
294 
295  /// degree for coeffcients: -1 for 0, 0 for "constants", ...
296  int (*cfParDeg)(number x,const coeffs r);
297 
298  /// create i^th parameter or NULL if not possible
299  number (*cfParameter)(const int i, const coeffs r);
300 
301  /// a function returning random elements
302  number (*cfRandom)(siRandProc p, number p1, number p2, const coeffs cf);
303 
304  /// function pointer behind n_ClearContent
306 
307  /// function pointer behind n_ClearDenominators
309 
310  /// conversion to CanonicalForm(factory) to number
311  number (*convFactoryNSingN)( const CanonicalForm n, const coeffs r);
312  CanonicalForm (*convSingNFactoryN)( number n, BOOLEAN setChar, const coeffs r );
313 
314 
315  /// the 0 as constant, NULL by default
316  number nNULL;
317 
318  /// Number of Parameters in the coeffs (default 0)
320 
321  /// array containing the names of Parameters (default NULL)
322  char const ** pParameterNames;
323  // NOTE that it replaces the following:
324 // char* complex_parameter; //< the name of sqrt(-1) in n_long_C , i.e. 'i' or 'j' etc...?
325 // char * m_nfParameter; //< the name of parameter in n_GF
326 
327  /////////////////////////////////////////////
328  // the union stuff
329 
330  //-------------------------------------------
331 
332  /* for extension fields we need to be able to represent polynomials,
333  so here is the polynomial ring: */
334  ring extRing;
335 
336  //number minpoly; //< no longer needed: replaced by
337  // //< extRing->qideal->[0]
338 
339 
340  int ch; /* characteristic, set by the local *InitChar methods;
341  In field extensions or extensions towers, the
342  characteristic can be accessed from any of the
343  intermediate extension fields, i.e., in this case
344  it is redundant along the chain of field extensions;
345  CONTRARY to SINGULAR as it was, we do NO LONGER use
346  negative values for ch;
347  for rings, ch will also be set and is - per def -
348  the smallest number of 1's that sum up to zero;
349  however, in this case ch may not fit in an int,
350  thus ch may contain a faulty value */
351 
352  short float_len; /* additional char-flags, rInit */
353  short float_len2; /* additional char-flags, rInit */
354 
355 // BOOLEAN CanShortOut; //< if the elements can be printed in short format
356 // // this is set to FALSE if a parameter name has >2 chars
357 // BOOLEAN ShortOut; //< if the elements should print in short format
358 
359 // ---------------------------------------------------
360  // for n_GF
361 
362  int m_nfCharQ; ///< the number of elements: q
363  int m_nfM1; ///< representation of -1
364  int m_nfCharP; ///< the characteristic: p
365  int m_nfCharQ1; ///< q-1
366  unsigned short *m_nfPlus1Table;
368 
369 // ---------------------------------------------------
370 // for Zp:
371  unsigned short *npInvTable;
372  unsigned short *npExpTable;
373  unsigned short *npLogTable;
374  // int npPrimeM; // NOTE: npPrimeM is deprecated, please use ch instead!
375  int npPminus1M; ///< characteristic - 1
376 //-------------------------------------------
377  int (*cfDivComp)(number a,number b,const coeffs r);
378  BOOLEAN (*cfIsUnit)(number a,const coeffs r);
379  number (*cfGetUnit)(number a,const coeffs r);
380  //CF: test if b divides a
381  BOOLEAN (*cfDivBy)(number a, number b, const coeffs r);
382  /* The following members are for representing the ring Z/n,
383  where n is not a prime. We distinguish four cases:
384  1.) n has at least two distinct prime factors. Then
385  modBase stores n, modExponent stores 1, modNumber
386  stores n, and mod2mMask is not used;
387  2.) n = p^k for some odd prime p and k > 1. Then
388  modBase stores p, modExponent stores k, modNumber
389  stores n, and mod2mMask is not used;
390  3.) n = 2^k for some k > 1; moreover, 2^k - 1 fits in
391  an unsigned long. Then modBase stores 2, modExponent
392  stores k, modNumber is not used, and mod2mMask stores
393  2^k - 1, i.e., the bit mask '111..1' of length k.
394  4.) n = 2^k for some k > 1; but 2^k - 1 does not fit in
395  an unsigned long. Then modBase stores 2, modExponent
396  stores k, modNumber stores n, and mod2mMask is not
397  used;
398  Cases 1.), 2.), and 4.) are covered by the implementation
399  in the files rmodulon.h and rmodulon.cc, whereas case 3.)
400  is implemented in the files rmodulo2m.h and rmodulo2m.cc. */
401  mpz_ptr modBase;
402  unsigned long modExponent;
403  mpz_ptr modNumber;
404  unsigned long mod2mMask;
405  //returns coeffs with updated ch, modNumber and modExp
406  coeffs (*cfQuot1)(number c, const coeffs r);
407 
408  /*CF: for blackbox rings, contains data needed to define the ring.
409  * contents depends on the actual example.*/
410  void * data;
411 #ifdef LDEBUG
412  // must be last entry:
413  /// Test: is "a" a correct number?
414  // DB as in debug, not data base.
415  BOOLEAN (*cfDBTest)(number a, const char *f, const int l, const coeffs r);
416 #endif
417 };
418 
419 // test properties and type
420 /// Returns the type of coeffs domain
421 static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
422 { assume(r != NULL); return r->type; }
423 
424 /// one-time initialisations for new coeffs
425 /// in case of an error return NULL
426 coeffs nInitChar(n_coeffType t, void * parameter);
427 
428 /// "copy" coeffs, i.e. increment ref
429 static FORCE_INLINE coeffs nCopyCoeff(const coeffs r)
430 { assume(r!=NULL); r->ref++; return r;}
431 
432 /// undo all initialisations
433 void nKillChar(coeffs r);
434 
435 /// initialisations after each ring change
436 static FORCE_INLINE void nSetChar(const coeffs r)
437 { STATISTIC(nSetChar); assume(r!=NULL); assume(r->cfSetChar != NULL); r->cfSetChar(r); }
438 
439 void nNew(number * a);
440 #define n_New(n, r) nNew(n)
441 
442 
443 /// Return the characteristic of the coeff. domain.
444 static FORCE_INLINE int n_GetChar(const coeffs r)
445 { STATISTIC(n_GetChar); assume(r != NULL); return r->ch; }
446 
447 
448 // the access methods (part 2):
449 
450 /// return a copy of 'n'
451 static FORCE_INLINE number n_Copy(number n, const coeffs r)
452 { STATISTIC(n_Copy); assume(r != NULL); assume(r->cfCopy!=NULL); return r->cfCopy(n, r); }
453 
454 /// delete 'p'
455 static FORCE_INLINE void n_Delete(number* p, const coeffs r)
456 { STATISTIC(n_Delete); assume(r != NULL); assume(r->cfDelete!= NULL); r->cfDelete(p, r); }
457 
458 /// TRUE iff 'a' and 'b' represent the same number;
459 /// they may have different representations
460 static FORCE_INLINE BOOLEAN n_Equal(number a, number b, const coeffs r)
461 { STATISTIC(n_Equal); assume(r != NULL); assume(r->cfEqual!=NULL); return r->cfEqual(a, b, r); }
462 
463 /// TRUE iff 'n' represents the zero element
464 static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
465 { STATISTIC(n_IsZero); assume(r != NULL); assume(r->cfIsZero!=NULL); return r->cfIsZero(n,r); }
466 
467 /// TRUE iff 'n' represents the one element
468 static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
469 { STATISTIC(n_IsOne); assume(r != NULL); assume(r->cfIsOne!=NULL); return r->cfIsOne(n,r); }
470 
471 /// TRUE iff 'n' represents the additive inverse of the one element, i.e. -1
472 static FORCE_INLINE BOOLEAN n_IsMOne(number n, const coeffs r)
473 { STATISTIC(n_IsMOne); assume(r != NULL); assume(r->cfIsMOne!=NULL); return r->cfIsMOne(n,r); }
474 
475 /// ordered fields: TRUE iff 'n' is positive;
476 /// in Z/pZ: TRUE iff 0 < m <= roundedBelow(p/2), where m is the long
477 /// representing n
478 /// in C: TRUE iff (Im(n) != 0 and Im(n) >= 0) or
479 /// (Im(n) == 0 and Re(n) >= 0)
480 /// in K(a)/<p(a)>: TRUE iff (n != 0 and (LC(n) > 0 or deg(n) > 0))
481 /// in K(t_1, ..., t_n): TRUE iff (LC(numerator(n) is a constant and > 0)
482 /// or (LC(numerator(n) is not a constant)
483 /// in Z/2^kZ: TRUE iff 0 < n <= 2^(k-1)
484 /// in Z/mZ: TRUE iff the internal mpz is greater than zero
485 /// in Z: TRUE iff n > 0
486 ///
487 /// !!! Recommendation: remove implementations for unordered fields
488 /// !!! and raise errors instead, in these cases
489 /// !!! Do not follow this recommendation: while writing polys,
490 /// !!! between 2 monomials will be an additional + iff !n_GreaterZero(next coeff)
491 /// Then change definition to include n_GreaterZero => printing does NOT
492 /// start with -
493 ///
494 static FORCE_INLINE BOOLEAN n_GreaterZero(number n, const coeffs r)
495 { STATISTIC(n_GreaterZero); assume(r != NULL); assume(r->cfGreaterZero!=NULL); return r->cfGreaterZero(n,r); }
496 
497 /// ordered fields: TRUE iff 'a' is larger than 'b';
498 /// in Z/pZ: TRUE iff la > lb, where la and lb are the long's representing
499 // a and b, respectively
500 /// in C: TRUE iff (Im(a) > Im(b))
501 /// in K(a)/<p(a)>: TRUE iff (a != 0 and (b == 0 or deg(a) > deg(b))
502 /// in K(t_1, ..., t_n): TRUE only if one or both numerator polynomials are
503 /// zero or if their degrees are equal. In this case,
504 /// TRUE if LC(numerator(a)) > LC(numerator(b))
505 /// in Z/2^kZ: TRUE if n_DivBy(a, b)
506 /// in Z/mZ: TRUE iff the internal mpz's fulfill the relation '>'
507 /// in Z: TRUE iff a > b
508 ///
509 /// !!! Recommendation: remove implementations for unordered fields
510 /// !!! and raise errors instead, in these cases
511 static FORCE_INLINE BOOLEAN n_Greater(number a, number b, const coeffs r)
512 { STATISTIC(n_Greater); assume(r != NULL); assume(r->cfGreater!=NULL); return r->cfGreater(a,b,r); }
513 
514 #ifdef HAVE_RINGS
515 static FORCE_INLINE int n_DivComp(number a, number b, const coeffs r)
516 { STATISTIC(n_DivComp); assume(r != NULL); assume(r->cfDivComp!=NULL); return r->cfDivComp (a,b,r); }
517 
518 /// TRUE iff n has a multiplicative inverse in the given coeff field/ring r
519 static FORCE_INLINE BOOLEAN n_IsUnit(number n, const coeffs r)
520 { STATISTIC(n_IsUnit); assume(r != NULL); assume(r->cfIsUnit!=NULL); return r->cfIsUnit(n,r); }
521 
522 /// in Z: 1
523 /// in Z/kZ (where k is not a prime): largest divisor of n (taken in Z) that
524 /// is co-prime with k
525 /// in Z/2^kZ: largest odd divisor of n (taken in Z)
526 /// other cases: not implemented
527 // CF: shold imply that n/GetUnit(n) is normalized in Z/kZ
528 // it would make more sense to return the inverse...
529 static FORCE_INLINE number n_GetUnit(number n, const coeffs r)
530 { STATISTIC(n_GetUnit); assume(r != NULL); assume(r->cfGetUnit!=NULL); return r->cfGetUnit(n,r); }
531 
532 static FORCE_INLINE coeffs n_CoeffRingQuot1(number c, const coeffs r)
533 { STATISTIC(n_CoeffRingQuot1); assume(r != NULL); assume(r->cfQuot1 != NULL); return r->cfQuot1(c, r); }
534 #endif
535 
536 /// a number representing i in the given coeff field/ring r
537 static FORCE_INLINE number n_Init(long i, const coeffs r)
538 { STATISTIC(n_Init); assume(r != NULL); assume(r->cfInit!=NULL); return r->cfInit(i,r); }
539 
540 /// conversion of a GMP integer to number
541 static FORCE_INLINE number n_InitMPZ(mpz_t n, const coeffs r)
542 { STATISTIC(n_InitMPZ); assume(r != NULL); assume(r->cfInitMPZ != NULL); return r->cfInitMPZ(n,r); }
543 
544 /// conversion of n to an int; 0 if not possible
545 /// in Z/pZ: the representing int lying in (-p/2 .. p/2]
546 static FORCE_INLINE long n_Int(number &n, const coeffs r)
547 { STATISTIC(n_Int); assume(r != NULL); assume(r->cfInt!=NULL); return r->cfInt(n,r); }
548 
549 /// conversion of n to a GMP integer; 0 if not possible
550 static FORCE_INLINE void n_MPZ(mpz_t result, number &n, const coeffs r)
551 { STATISTIC(n_MPZ); assume(r != NULL); assume(r->cfMPZ!=NULL); r->cfMPZ(result, n, r); }
552 
553 
554 /// in-place negation of n
555 /// MUST BE USED: n = n_InpNeg(n) (no copy is returned)
556 static FORCE_INLINE number n_InpNeg(number n, const coeffs r)
557 { STATISTIC(n_InpNeg); assume(r != NULL); assume(r->cfInpNeg!=NULL); return r->cfInpNeg(n,r); }
558 
559 /// return the multiplicative inverse of 'a';
560 /// raise an error if 'a' is not invertible
561 ///
562 /// !!! Recommendation: rename to 'n_Inverse'
563 static FORCE_INLINE number n_Invers(number a, const coeffs r)
564 { STATISTIC(n_Invers); assume(r != NULL); assume(r->cfInvers!=NULL); return r->cfInvers(a,r); }
565 
566 /// return a non-negative measure for the complexity of n;
567 /// return 0 only when n represents zero;
568 /// (used for pivot strategies in matrix computations with entries from r)
569 static FORCE_INLINE int n_Size(number n, const coeffs r)
570 { STATISTIC(n_Size); assume(r != NULL); assume(r->cfSize!=NULL); return r->cfSize(n,r); }
571 
572 /// inplace-normalization of n;
573 /// produces some canonical representation of n;
574 ///
575 /// !!! Recommendation: remove this method from the user-interface, i.e.,
576 /// !!! this should be hidden
577 static FORCE_INLINE void n_Normalize(number& n, const coeffs r)
578 { STATISTIC(n_Normalize); assume(r != NULL); assume(r->cfNormalize!=NULL); r->cfNormalize(n,r); }
579 
580 /// write to the output buffer of the currently used reporter
581 //CF: the "&" should be removed, as one wants to write constants as well
582 static FORCE_INLINE void n_WriteLong(number& n, const coeffs r)
583 { STATISTIC(n_WriteLong); assume(r != NULL); assume(r->cfWriteLong!=NULL); r->cfWriteLong(n,r); }
584 
585 /// write to the output buffer of the currently used reporter
586 /// in a shortest possible way, e.g. in K(a): a2 instead of a^2
587 static FORCE_INLINE void n_WriteShort(number& n, const coeffs r)
588 { STATISTIC(n_WriteShort); assume(r != NULL); assume(r->cfWriteShort!=NULL); r->cfWriteShort(n,r); }
589 
590 static FORCE_INLINE void n_Write(number& n, const coeffs r, const BOOLEAN bShortOut = TRUE)
591 { STATISTIC(n_Write); if (bShortOut) n_WriteShort(n, r); else n_WriteLong(n, r); }
592 
593 
594 /// !!! Recommendation: This method is too cryptic to be part of the user-
595 /// !!! interface. As defined here, it is merely a helper
596 /// !!! method for parsing number input strings.
597 static FORCE_INLINE const char *n_Read(const char * s, number * a, const coeffs r)
598 { STATISTIC(n_Read); assume(r != NULL); assume(r->cfRead!=NULL); return r->cfRead(s, a, r); }
599 
600 /// return the denominator of n
601 /// (if elements of r are by nature not fractional, result is 1)
602 static FORCE_INLINE number n_GetDenom(number& n, const coeffs r)
603 { STATISTIC(n_GetDenom); assume(r != NULL); assume(r->cfGetDenom!=NULL); return r->cfGetDenom(n, r); }
604 
605 /// return the numerator of n
606 /// (if elements of r are by nature not fractional, result is n)
607 static FORCE_INLINE number n_GetNumerator(number& n, const coeffs r)
608 { STATISTIC(n_GetNumerator); assume(r != NULL); assume(r->cfGetNumerator!=NULL); return r->cfGetNumerator(n, r); }
609 
610 /// return the quotient of 'a' and 'b', i.e., a/b;
611 /// raises an error if 'b' is not invertible in r
612 /// exception in Z: raises an error if 'a' is not divisible by 'b'
613 static FORCE_INLINE number n_Div(number a, number b, const coeffs r)
614 { STATISTIC(n_Div); assume(r != NULL); assume(r->cfDiv!=NULL); return r->cfDiv(a,b,r); }
615 
616 /// assume that there is a canonical subring in cf and we know
617 /// that division is possible for these a and b in the subring,
618 /// n_ExactDiv performs it, may skip additional tests.
619 /// Can always be substituted by n_Div at the cost of larger computing time.
620 static FORCE_INLINE number n_ExactDiv(number a, number b, const coeffs r)
621 { STATISTIC(n_ExactDiv); assume(r != NULL); assume(r->cfExactDiv!=NULL); return r->cfExactDiv(a,b,r); }
622 
623 /// for r a field, return n_Init(0,r)
624 /// otherwise: n_Div(a,b,r)*b+n_IntMod(a,b,r)==a
625 static FORCE_INLINE number n_IntMod(number a, number b, const coeffs r)
626 { STATISTIC(n_IntMod); assume(r != NULL); return r->cfIntMod(a,b,r); }
627 
628 /// fill res with the power a^b
629 static FORCE_INLINE void n_Power(number a, int b, number *res, const coeffs r)
630 { STATISTIC(n_Power); assume(r != NULL); assume(r->cfPower!=NULL); r->cfPower(a,b,res,r); }
631 
632 /// return the product of 'a' and 'b', i.e., a*b
633 static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
634 { STATISTIC(n_Mult); assume(r != NULL); assume(r->cfMult!=NULL); return r->cfMult(a, b, r); }
635 
636 /// multiplication of 'a' and 'b';
637 /// replacement of 'a' by the product a*b
638 static FORCE_INLINE void n_InpMult(number &a, number b, const coeffs r)
639 { STATISTIC(n_InpMult); assume(r != NULL); assume(r->cfInpMult!=NULL); r->cfInpMult(a,b,r); }
640 
641 /// addition of 'a' and 'b';
642 /// replacement of 'a' by the sum a+b
643 static FORCE_INLINE void n_InpAdd(number &a, number b, const coeffs r)
644 { STATISTIC(n_InpAdd); assume(r != NULL); assume(r->cfInpAdd!=NULL); r->cfInpAdd(a,b,r);
645 
646 #ifdef HAVE_NUMSTATS
647  // avoid double counting
648  if( r->cfIsZero(a,r) ) STATISTIC(n_CancelOut);
649 #endif
650 }
651 
652 /// return the sum of 'a' and 'b', i.e., a+b
653 static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
654 { STATISTIC(n_Add); assume(r != NULL); assume(r->cfAdd!=NULL); const number sum = r->cfAdd(a, b, r);
655 
656 #ifdef HAVE_NUMSTATS
657  // avoid double counting
658  if( r->cfIsZero(sum,r) ) STATISTIC(n_CancelOut);
659 #endif
660 
661  return sum;
662 }
663 
664 
665 /// return the difference of 'a' and 'b', i.e., a-b
666 static FORCE_INLINE number n_Sub(number a, number b, const coeffs r)
667 { STATISTIC(n_Sub); assume(r != NULL); assume(r->cfSub!=NULL); const number d = r->cfSub(a, b, r);
668 
669 #ifdef HAVE_NUMSTATS
670  // avoid double counting
671  if( r->cfIsZero(d,r) ) STATISTIC(n_CancelOut);
672 #endif
673 
674  return d;
675 }
676 
677 /// in Z: return the gcd of 'a' and 'b'
678 /// in Z/nZ, Z/2^kZ: computed as in the case Z
679 /// in Z/pZ, C, R: not implemented
680 /// in Q: return the gcd of the numerators of 'a' and 'b'
681 /// in K(a)/<p(a)>: not implemented
682 /// in K(t_1, ..., t_n): not implemented
683 static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
684 { STATISTIC(n_Gcd); assume(r != NULL); assume(r->cfGcd!=NULL); return r->cfGcd(a,b,r); }
685 static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
686 { STATISTIC(n_SubringGcd); assume(r != NULL); assume(r->cfSubringGcd!=NULL); return r->cfSubringGcd(a,b,r); }
687 
688 /// beware that ExtGCD is only relevant for a few chosen coeff. domains
689 /// and may perform something unexpected in some cases...
690 static FORCE_INLINE number n_ExtGcd(number a, number b, number *s, number *t, const coeffs r)
691 { STATISTIC(n_ExtGcd); assume(r != NULL); assume(r->cfExtGcd!=NULL); return r->cfExtGcd (a,b,s,t,r); }
692 static FORCE_INLINE number n_XExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
693 { STATISTIC(n_XExtGcd); assume(r != NULL); assume(r->cfXExtGcd!=NULL); return r->cfXExtGcd (a,b,s,t,u,v,r); }
694 static FORCE_INLINE number n_EucNorm(number a, const coeffs r)
695 { STATISTIC(n_EucNorm); assume(r != NULL); assume(r->cfEucNorm!=NULL); return r->cfEucNorm (a,r); }
696 /// if r is a ring with zero divisors, return an annihilator!=0 of b
697 /// otherwise return NULL
698 static FORCE_INLINE number n_Ann(number a, const coeffs r)
699 { STATISTIC(n_Ann); assume(r != NULL); return r->cfAnn (a,r); }
700 static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
701 { STATISTIC(n_QuotRem); assume(r != NULL); assume(r->cfQuotRem!=NULL); return r->cfQuotRem (a,b,q,r); }
702 
703 
704 /// in Z: return the lcm of 'a' and 'b'
705 /// in Z/nZ, Z/2^kZ: computed as in the case Z
706 /// in Z/pZ, C, R: not implemented
707 /// in K(a)/<p(a)>: not implemented
708 /// in K(t_1, ..., t_n): not implemented
709 static FORCE_INLINE number n_Lcm(number a, number b, const coeffs r)
710 { STATISTIC(n_Lcm); assume(r != NULL); assume(r->cfLcm!=NULL); return r->cfLcm(a,b,r); }
711 
712 /// assume that r is a quotient field (otherwise, return 1)
713 /// for arguments (a1/a2,b1/b2) return (lcm(a1,b2)/1)
714 static FORCE_INLINE number n_NormalizeHelper(number a, number b, const coeffs r)
715 { STATISTIC(n_NormalizeHelper); assume(r != NULL); assume(r->cfNormalizeHelper!=NULL); return r->cfNormalizeHelper(a,b,r); }
716 
717 /// set the mapping function pointers for translating numbers from src to dst
718 static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
719 { STATISTIC(n_SetMap); assume(src != NULL && dst != NULL); assume(dst->cfSetMap!=NULL); return dst->cfSetMap(src,dst); }
720 
721 #ifdef LDEBUG
722 /// test whether n is a correct number;
723 /// only used if LDEBUG is defined
724 static FORCE_INLINE BOOLEAN n_DBTest(number n, const char *filename, const int linenumber, const coeffs r)
725 { STATISTIC(n_Test); assume(r != NULL); assume(r->cfDBTest != NULL); return r->cfDBTest(n, filename, linenumber, r); }
726 #else
727 // is it really necessary to define this function in any case?
728 /// test whether n is a correct number;
729 /// only used if LDEBUG is defined
730 static FORCE_INLINE BOOLEAN n_DBTest(number, const char*, const int, const coeffs)
731 { STATISTIC(n_Test); return TRUE; }
732 #endif
733 
734 /// output the coeff description
735 static FORCE_INLINE void n_CoeffWrite(const coeffs r, BOOLEAN details = TRUE)
736 { STATISTIC(n_CoeffWrite); assume(r != NULL); assume(r->cfCoeffWrite != NULL); r->cfCoeffWrite(r, details); }
737 
738 // Tests:
740 { assume(r != NULL); return (getCoeffType(r)==n_Z2m); }
741 
743 { assume(r != NULL); return (getCoeffType(r)==n_Zn); }
744 
746 { assume(r != NULL); return (getCoeffType(r)==n_Znm); }
747 
748 static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
749 { assume(r != NULL); return (getCoeffType(r)==n_Z); }
750 
751 static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
752 { assume(r != NULL); return (r->is_field==0); }
753 
754 /// returns TRUE, if r is a field or r has no zero divisors (i.e is a domain)
755 static FORCE_INLINE BOOLEAN nCoeff_is_Domain(const coeffs r)
756 {
757  assume(r != NULL);
758  return (r->is_domain);
759 }
760 
761 /// test whether 'a' is divisible 'b';
762 /// for r encoding a field: TRUE iff 'b' does not represent zero
763 /// in Z: TRUE iff 'b' divides 'a' (with remainder = zero)
764 /// in Z/nZ: TRUE iff (a = 0 and b divides n in Z) or
765 /// (a != 0 and b/gcd(a, b) is co-prime with n, i.e.
766 /// a unit in Z/nZ)
767 /// in Z/2^kZ: TRUE iff ((a = 0 mod 2^k) and (b = 0 or b is a power of 2))
768 /// or ((a, b <> 0) and (b/gcd(a, b) is odd))
769 static FORCE_INLINE BOOLEAN n_DivBy(number a, number b, const coeffs r)
770 { STATISTIC(n_DivBy); assume(r != NULL);
771 #ifdef HAVE_RINGS
772  if( nCoeff_is_Ring(r) )
773  {
774  assume(r->cfDivBy!=NULL); return r->cfDivBy(a,b,r);
775  }
776 #endif
777  return !n_IsZero(b, r);
778 }
779 
780 static FORCE_INLINE number n_ChineseRemainderSym(number *a, number *b, int rl, BOOLEAN sym,const coeffs r)
781 { STATISTIC(n_ChineseRemainderSym); assume(r != NULL); assume(r->cfChineseRemainder != NULL); return r->cfChineseRemainder(a,b,rl,sym,r); }
782 
783 static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
784 { STATISTIC(n_Farey); assume(r != NULL); assume(r->cfFarey != NULL); return r->cfFarey(a,b,r); }
785 
786 static FORCE_INLINE int n_ParDeg(number n, const coeffs r)
787 { STATISTIC(n_ParDeg); assume(r != NULL); assume(r->cfParDeg != NULL); return r->cfParDeg(n,r); }
788 
789 /// Returns the number of parameters
790 static FORCE_INLINE int n_NumberOfParameters(const coeffs r)
791 { STATISTIC(n_NumberOfParameters); assume(r != NULL); return r->iNumberOfParameters; }
792 
793 /// Returns a (const!) pointer to (const char*) names of parameters
794 static FORCE_INLINE char const * * n_ParameterNames(const coeffs r)
795 { STATISTIC(n_ParameterNames); assume(r != NULL); return r->pParameterNames; }
796 
797 /// return the (iParameter^th) parameter as a NEW number
798 /// NOTE: parameter numbering: 1..n_NumberOfParameters(...)
799 static FORCE_INLINE number n_Param(const int iParameter, const coeffs r)
800 { assume(r != NULL);
801  assume((iParameter >= 1) || (iParameter <= n_NumberOfParameters(r)));
802  assume(r->cfParameter != NULL);
803  STATISTIC(n_Param); return r->cfParameter(iParameter, r);
804 }
805 
806 static FORCE_INLINE number n_RePart(number i, const coeffs cf)
807 { STATISTIC(n_RePart); assume(cf != NULL); assume(cf->cfRePart!=NULL); return cf->cfRePart(i,cf); }
808 
809 static FORCE_INLINE number n_ImPart(number i, const coeffs cf)
810 { STATISTIC(n_ImPart); assume(cf != NULL); assume(cf->cfImPart!=NULL); return cf->cfImPart(i,cf); }
811 
812 /// returns TRUE, if r is not a field and r has non-trivial units
813 static FORCE_INLINE BOOLEAN nCoeff_has_Units(const coeffs r)
814 { assume(r != NULL); return ((getCoeffType(r)==n_Zn) || (getCoeffType(r)==n_Z2m) || (getCoeffType(r)==n_Znm)); }
815 
816 static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
817 { assume(r != NULL); return getCoeffType(r)==n_Zp; }
818 
819 static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r, int p)
820 { assume(r != NULL); return ((getCoeffType(r)==n_Zp) && (r->ch == p)); }
821 
822 static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
823 { assume(r != NULL); return getCoeffType(r)==n_Q && (r->is_field); }
824 
825 static FORCE_INLINE BOOLEAN nCoeff_is_numeric(const coeffs r) /* R, long R, long C */
826 { assume(r != NULL); return (getCoeffType(r)==n_R) || (getCoeffType(r)==n_long_R) || (getCoeffType(r)==n_long_C); }
827 // (r->ringtype == 0) && (r->ch == -1); ??
828 
829 static FORCE_INLINE BOOLEAN nCoeff_is_R(const coeffs r)
830 { assume(r != NULL); return getCoeffType(r)==n_R; }
831 
832 static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
833 { assume(r != NULL); return getCoeffType(r)==n_GF; }
834 
835 static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r, int q)
836 { assume(r != NULL); return (getCoeffType(r)==n_GF) && (r->ch == q); }
837 
838 /* TRUE iff r represents an algebraic or transcendental extension field */
840 {
841  assume(r != NULL);
842  return (getCoeffType(r)==n_algExt) || (getCoeffType(r)==n_transExt);
843 }
844 
845 /* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
846  svn trunk);
847  intension: should be TRUE iff the given r is an extension field above
848  some Z/pZ;
849  actually: TRUE iff the given r is an extension tower of arbitrary
850  height above some field of characteristic p (may be Z/pZ or some
851  Galois field of characteristic p) */
852 static FORCE_INLINE BOOLEAN nCoeff_is_Zp_a(const coeffs r)
853 {
854  assume(r != NULL);
855  return ((!nCoeff_is_Ring(r)) && (n_GetChar(r) != 0) && nCoeff_is_Extension(r));
856 }
857 
858 /* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
859  svn trunk);
860  intension: should be TRUE iff the given r is an extension field above
861  Z/pZ (with p as provided);
862  actually: TRUE iff the given r is an extension tower of arbitrary
863  height above some field of characteristic p (may be Z/pZ or some
864  Galois field of characteristic p) */
865 static FORCE_INLINE BOOLEAN nCoeff_is_Zp_a(const coeffs r, int p)
866 {
867  assume(r != NULL);
868  assume(p != 0);
869  return ((!nCoeff_is_Ring(r)) && (n_GetChar(r) == p) && nCoeff_is_Extension(r));
870 }
871 
872 /* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
873  svn trunk);
874  intension: should be TRUE iff the given r is an extension field
875  above Q;
876  actually: TRUE iff the given r is an extension tower of arbitrary
877  height above some field of characteristic 0 (may be Q, R, or C) */
878 static FORCE_INLINE BOOLEAN nCoeff_is_Q_a(const coeffs r)
879 {
880  assume(r != NULL);
881  return ((n_GetChar(r) == 0) && nCoeff_is_Extension(r));
882 }
883 
884 
885 
886 
887 static FORCE_INLINE BOOLEAN nCoeff_is_long_R(const coeffs r)
888 { assume(r != NULL); return getCoeffType(r)==n_long_R; }
889 
890 static FORCE_INLINE BOOLEAN nCoeff_is_long_C(const coeffs r)
891 { assume(r != NULL); return getCoeffType(r)==n_long_C; }
892 
893 static FORCE_INLINE BOOLEAN nCoeff_is_CF(const coeffs r)
894 { assume(r != NULL); return getCoeffType(r)==n_CF; }
895 
896 /// TRUE, if the computation of the inverse is fast,
897 /// i.e. prefer leading coeff. 1 over content
899 { assume(r != NULL); return r->has_simple_Inverse; }
900 
901 /// TRUE if n_Delete/n_New are empty operations
903 { assume(r != NULL); return r->has_simple_Alloc; }
904 
905 /// TRUE iff r represents an algebraic extension field
906 static FORCE_INLINE BOOLEAN nCoeff_is_algExt(const coeffs r)
907 { assume(r != NULL); return (getCoeffType(r)==n_algExt); }
908 
909 /// is it an alg. ext. of Q?
911 { assume(r != NULL); return ((n_GetChar(r) == 0) && nCoeff_is_algExt(r)); }
912 
913 /// TRUE iff r represents a transcendental extension field
915 { assume(r != NULL); return (getCoeffType(r)==n_transExt); }
916 
917 /// BOOLEAN n_Test(number a, const coeffs r)
918 #define n_Test(a,r) n_DBTest(a, __FILE__, __LINE__, r)
919 
920 /// Computes the content and (inplace) divides it out on a collection
921 /// of numbers
922 /// number @em c is the content (i.e. the GCD of all the coeffs, which
923 /// we divide out inplace)
924 /// NOTE: it assumes all coefficient numbers to be integer!!!
925 /// NOTE/TODO: see also the description by Hans
926 /// TODO: rename into n_ClearIntegerContent
927 static FORCE_INLINE void n_ClearContent(ICoeffsEnumerator& numberCollectionEnumerator, number& c, const coeffs r)
928 { STATISTIC(n_ClearContent); assume(r != NULL); r->cfClearContent(numberCollectionEnumerator, c, r); }
929 
930 /// (inplace) Clears denominators on a collection of numbers
931 /// number @em d is the LCM of all the coefficient denominators (i.e. the number
932 /// with which all the number coeffs. were multiplied)
933 /// NOTE/TODO: see also the description by Hans
934 static FORCE_INLINE void n_ClearDenominators(ICoeffsEnumerator& numberCollectionEnumerator, number& d, const coeffs r)
935 { STATISTIC(n_ClearDenominators); assume(r != NULL); r->cfClearDenominators(numberCollectionEnumerator, d, r); }
936 
937 // convenience helpers (no number returned - but the input enumeration
938 // is to be changed
939 // TODO: do we need separate hooks for these as our existing code does
940 // *different things* there: compare p_Cleardenom (which calls
941 // *p_Content) and p_Cleardenom_n (which doesn't)!!!
942 
943 static FORCE_INLINE void n_ClearContent(ICoeffsEnumerator& numberCollectionEnumerator, const coeffs r)
944 { STATISTIC(n_ClearContent); number c; n_ClearContent(numberCollectionEnumerator, c, r); n_Delete(&c, r); }
945 
946 static FORCE_INLINE void n_ClearDenominators(ICoeffsEnumerator& numberCollectionEnumerator, const coeffs r)
947 { STATISTIC(n_ClearDenominators); assume(r != NULL); number d; n_ClearDenominators(numberCollectionEnumerator, d, r); n_Delete(&d, r); }
948 
949 
950 /// print a number (BEWARE of string buffers!)
951 /// mostly for debugging
952 void n_Print(number& a, const coeffs r);
953 
954 
955 
956 /// TODO: make it a virtual method of coeffs, together with:
957 /// Decompose & Compose, rParameter & rPar
958 static FORCE_INLINE char * nCoeffString(const coeffs cf)
959 { STATISTIC(nCoeffString); assume( cf != NULL ); return cf->cfCoeffString(cf); }
960 
961 
962 static FORCE_INLINE char * nCoeffName (const coeffs cf)
963 { STATISTIC(nCoeffName); assume( cf != NULL ); return cf->cfCoeffName(cf); }
964 
965 static FORCE_INLINE number n_Random(siRandProc p, number p1, number p2, const coeffs cf)
966 { STATISTIC(n_Random); assume( cf != NULL ); assume( cf->cfRandom != NULL ); return cf->cfRandom(p, p1, p2, cf); }
967 
968 /// io via ssi:
969 static FORCE_INLINE void n_WriteFd(number a, FILE *f, const coeffs r)
970 { STATISTIC(n_WriteFd); assume(r != NULL); assume(r->cfWriteFd != NULL); return r->cfWriteFd(a, f, r); }
971 
972 /// io via ssi:
973 static FORCE_INLINE number n_ReadFd( s_buff f, const coeffs r)
974 { STATISTIC(n_ReadFd); assume(r != NULL); assume(r->cfReadFd != NULL); return r->cfReadFd(f, r); }
975 
976 
977 // the following wrappers went to numbers.cc since they needed factory
978 // knowledge!
979 number n_convFactoryNSingN( const CanonicalForm n, const coeffs r);
980 
981 CanonicalForm n_convSingNFactoryN( number n, BOOLEAN setChar, const coeffs r );
982 
983 
984 // TODO: remove the following functions...
985 // the following 2 inline functions are just convenience shortcuts for Frank's code:
986 static FORCE_INLINE void number2mpz(number n, coeffs c, mpz_t m){ n_MPZ(m, n, c); }
987 static FORCE_INLINE number mpz2number(mpz_t m, coeffs c){ return n_InitMPZ(m, c); }
988 
989 #endif
990 
static FORCE_INLINE number n_Sub(number a, number b, const coeffs r)
return the difference of 'a' and 'b', i.e., a-b
Definition: coeffs.h:666
int ch
Definition: coeffs.h:340
BOOLEAN(* cfDivBy)(number a, number b, const coeffs r)
Definition: coeffs.h:381
short float_len2
Definition: coeffs.h:353
const const intvec const intvec const ring _currRing const const intvec const intvec const ring _currRing int
Definition: gb_hack.h:53
static FORCE_INLINE BOOLEAN n_Greater(number a, number b, const coeffs r)
ordered fields: TRUE iff 'a' is larger than 'b'; in Z/pZ: TRUE iff la > lb, where la and lb are the l...
Definition: coeffs.h:511
#define STATISTIC(f)
Definition: numstats.h:16
static FORCE_INLINE number n_IntMod(number a, number b, const coeffs r)
for r a field, return n_Init(0,r) otherwise: n_Div(a,b,r)*b+n_IntMod(a,b,r)==a
Definition: coeffs.h:625
static FORCE_INLINE number n_GetNumerator(number &n, const coeffs r)
return the numerator of n (if elements of r are by nature not fractional, result is n) ...
Definition: coeffs.h:607
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:529
static FORCE_INLINE char const ** n_ParameterNames(const coeffs r)
Returns a (const!) pointer to (const char*) names of parameters.
Definition: coeffs.h:794
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:683
const CanonicalForm int s
Definition: facAbsFact.cc:55
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
Definition: coeffs.h:742
static FORCE_INLINE number n_EucNorm(number a, const coeffs r)
Definition: coeffs.h:694
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition: minpoly.cc:574
number(* cfCopy)(number a, const coeffs r)
return a copy of a
Definition: coeffs.h:197
static FORCE_INLINE BOOLEAN nCoeff_is_numeric(const coeffs r)
Definition: coeffs.h:825
static FORCE_INLINE BOOLEAN n_IsUnit(number n, const coeffs r)
TRUE iff n has a multiplicative inverse in the given coeff field/ring r.
Definition: coeffs.h:519
int m_nfCharQ1
q-1
Definition: coeffs.h:365
const poly a
Definition: syzextra.cc:212
static FORCE_INLINE const char * n_Read(const char *s, number *a, const coeffs r)
!!! Recommendation: This method is too cryptic to be part of the user- !!! interface. As defined here, it is merely a helper !!! method for parsing number input strings.
Definition: coeffs.h:597
number(* cfExtGcd)(number a, number b, number *s, number *t, const coeffs r)
Definition: coeffs.h:244
omBin_t * omBin
Definition: omStructs.h:12
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:42
numberfunc cfIntMod
Definition: coeffs.h:173
int(* cfDivComp)(number a, number b, const coeffs r)
Definition: coeffs.h:377
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:816
number nNULL
the 0 as constant, NULL by default
Definition: coeffs.h:316
static FORCE_INLINE number n_XExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: coeffs.h:692
?
Definition: coeffs.h:45
static FORCE_INLINE BOOLEAN nCoeff_is_Zp_a(const coeffs r)
Definition: coeffs.h:852
number(* cfRandom)(siRandProc p, number p1, number p2, const coeffs cf)
a function returning random elements
Definition: coeffs.h:302
BOOLEAN(* cfDBTest)(number a, const char *f, const int l, const coeffs r)
Test: is "a" a correct number?
Definition: coeffs.h:415
unsigned short * m_nfPlus1Table
Definition: coeffs.h:366
void(* cfMPZ)(mpz_t result, number &n, const coeffs r)
Converts a non-negative number n into a GMP number, 0 if impossible.
Definition: coeffs.h:188
'SR_INT' is the type of those integers small enough to fit into 29 bits.
Definition: longrat.h:46
void(* cfSetChar)(const coeffs r)
Definition: coeffs.h:159
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:44
number(* cfChineseRemainder)(number *x, number *q, int rl, BOOLEAN sym, const coeffs)
chinese remainder returns X with X mod q[i]=x[i], i=0..rl-1
Definition: coeffs.h:293
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
Definition: coeffs.h:37
static FORCE_INLINE number n_ChineseRemainderSym(number *a, number *b, int rl, BOOLEAN sym, const coeffs r)
Definition: coeffs.h:780
number(* cfQuotRem)(number a, number b, number *rem, const coeffs r)
Definition: coeffs.h:265
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:638
return P p
Definition: myNF.cc:203
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:468
char const ** pParameterNames
array containing the names of Parameters (default NULL)
Definition: coeffs.h:322
number n_convFactoryNSingN(const CanonicalForm n, const coeffs r)
Definition: numbers.cc:549
f
Definition: cfModGcd.cc:4022
unsigned short fftable[]
Definition: ffields.cc:61
coeffs next
Definition: coeffs.h:123
static FORCE_INLINE BOOLEAN nCoeff_is_long_R(const coeffs r)
Definition: coeffs.h:887
mpz_ptr modNumber
Definition: coeffs.h:403
static FORCE_INLINE void nSetChar(const coeffs r)
initialisations after each ring change
Definition: coeffs.h:436
void(* cfDelete)(number *a, const coeffs r)
Definition: coeffs.h:268
number(* cfXExtGcd)(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: coeffs.h:252
BOOLEAN(*)(*)(*)(*) cfIsOne(number a, const coeffs r)
Definition: coeffs.h:227
rational (GMP) numbers
Definition: coeffs.h:30
const char * GFPar_name
Definition: coeffs.h:94
static FORCE_INLINE number n_ReadFd(s_buff f, const coeffs r)
io via ssi:
Definition: coeffs.h:973
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
Definition: coeffs.h:748
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:537
static FORCE_INLINE BOOLEAN nCoeff_is_R(const coeffs r)
Definition: coeffs.h:829
number(* cfSubringGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:243
{p < 2^31}
Definition: coeffs.h:29
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition: coeffs.h:739
(), see rinteger.h, new impl.
Definition: coeffs.h:110
int m_nfCharQ
the number of elements: q
Definition: coeffs.h:362
numberfunc cfAdd
Definition: coeffs.h:173
number(* cfInvers)(number a, const coeffs r)
return 1/a
Definition: coeffs.h:195
static FORCE_INLINE BOOLEAN nCoeff_has_simple_inverse(const coeffs r)
TRUE, if the computation of the inverse is fast, i.e. prefer leading coeff. 1 over content...
Definition: coeffs.h:898
BOOLEAN(* cfGreater)(number a, number b, const coeffs r)
Definition: coeffs.h:223
static FORCE_INLINE BOOLEAN n_DBTest(number n, const char *filename, const int linenumber, const coeffs r)
test whether n is a correct number; only used if LDEBUG is defined
Definition: coeffs.h:724
void(* cfNormalize)(number &a, const coeffs r)
Definition: coeffs.h:221
number(* cfRePart)(number a, const coeffs r)
Definition: coeffs.h:198
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
Definition: coeffs.h:444
factory's main class
Definition: canonicalform.h:72
Definition: ring.h:203
#define TRUE
Definition: auxiliary.h:144
#define FORCE_INLINE
Definition: auxiliary.h:386
static FORCE_INLINE void n_Normalize(number &n, const coeffs r)
inplace-normalization of n; produces some canonical representation of n;
Definition: coeffs.h:577
void(* cfWriteLong)(number &a, const coeffs r)
print a given number (long format)
Definition: coeffs.h:202
void(* cfCoeffWrite)(const coeffs r, BOOLEAN details)
output of coeff description via Print
Definition: coeffs.h:146
number(* numberfunc)(number a, number b, const coeffs r)
Definition: coeffs.h:68
BOOLEAN is_field
TRUE, if cf is a field.
Definition: coeffs.h:138
n_coeffRep rep
Definition: coeffs.h:125
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...
Definition: coeffs.h:714
int factoryVarOffset
how many variables of factory are already used by this coeff
Definition: coeffs.h:128
(fraction), see transext.h
Definition: coeffs.h:112
BOOLEAN(* cfIsUnit)(number a, const coeffs r)
Definition: coeffs.h:378
number(* cfGetUnit)(number a, const coeffs r)
Definition: coeffs.h:379
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
Definition: coeffs.h:822
void(* nCoeffsEnumeratorFunc)(ICoeffsEnumerator &numberCollectionEnumerator, number &output, const coeffs r)
goes over coeffs given by the ICoeffsEnumerator and changes them. Additionally returns a number; ...
Definition: coeffs.h:80
number(* cfFarey)(number p, number n, const coeffs)
rational reconstruction: "best" rational a/b with a/b = p mod n
Definition: coeffs.h:287
static FORCE_INLINE BOOLEAN nCoeff_is_long_C(const coeffs r)
Definition: coeffs.h:890
static FORCE_INLINE int n_ParDeg(number n, const coeffs r)
Definition: coeffs.h:786
IEnumerator< number > ICoeffsEnumerator
Abstract interface for an enumerator of number coefficients for an object, e.g. a polynomial...
Definition: coeffs.h:76
BOOLEAN has_simple_Alloc
TRUE, if nNew/nDelete/nCopy are dummies.
Definition: coeffs.h:132
number(* cfInitMPZ)(mpz_t i, const coeffs r)
init with a GMP integer
Definition: coeffs.h:179
static FORCE_INLINE void n_InpAdd(number &a, number b, const coeffs r)
addition of 'a' and 'b'; replacement of 'a' by the sum a+b
Definition: coeffs.h:643
static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
Definition: coeffs.h:751
CanonicalForm n_convSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
Definition: numbers.cc:554
Creation data needed for finite fields.
Definition: coeffs.h:90
unsigned short * npLogTable
Definition: coeffs.h:373
static FORCE_INLINE BOOLEAN nCoeff_is_Q_a(const coeffs r)
Definition: coeffs.h:878
static FORCE_INLINE void number2mpz(number n, coeffs c, mpz_t m)
Definition: coeffs.h:986
static FORCE_INLINE number n_Ann(number a, const coeffs r)
if r is a ring with zero divisors, return an annihilator!=0 of b otherwise return NULL ...
Definition: coeffs.h:698
real floating point (GMP) numbers
Definition: coeffs.h:33
Abstract API for enumerators.
short float_len2
additional char-flags, rInit
Definition: coeffs.h:100
(poly), see algext.h
Definition: coeffs.h:111
static FORCE_INLINE number n_Random(siRandProc p, number p1, number p2, const coeffs cf)
Definition: coeffs.h:965
static FORCE_INLINE int n_NumberOfParameters(const coeffs r)
Returns the number of parameters.
Definition: coeffs.h:790
BOOLEAN(* nCoeffIsEqual)(const coeffs r, n_coeffType n, void *parameter)
Definition: coeffs.h:143
static FORCE_INLINE number n_Param(const int iParameter, const coeffs r)
return the (iParameter^th) parameter as a NEW number NOTE: parameter numbering: 1..n_NumberOfParameters(...)
Definition: coeffs.h:799
poly res
Definition: myNF.cc:322
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
Definition: coeffs.h:633
single prescision (6,6) real numbers
Definition: coeffs.h:31
n_coeffRep
Definition: coeffs.h:105
number(* cfInit)(long i, const coeffs r)
init with an integer
Definition: coeffs.h:176
static FORCE_INLINE void n_ClearContent(ICoeffsEnumerator &numberCollectionEnumerator, number &c, const coeffs r)
Computes the content and (inplace) divides it out on a collection of numbers number c is the content ...
Definition: coeffs.h:927
number(* cfNormalizeHelper)(number a, number b, const coeffs r)
Definition: coeffs.h:267
short float_len
additional char-flags, rInit
Definition: coeffs.h:99
const ring r
Definition: syzextra.cc:208
unsigned short * npInvTable
Definition: coeffs.h:371
static FORCE_INLINE number mpz2number(mpz_t m, coeffs c)
Definition: coeffs.h:987
BOOLEAN(*)(*)(*)(*)(*)(*) cfGreaterZero(number a, const coeffs r)
Definition: coeffs.h:233
static FORCE_INLINE BOOLEAN nCoeff_is_algExt(const coeffs r)
TRUE iff r represents an algebraic extension field.
Definition: coeffs.h:906
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 ...
Definition: coeffs.h:546
long(* cfInt)(number &n, const coeffs r)
convertion to long, 0 if impossible
Definition: coeffs.h:185
static FORCE_INLINE BOOLEAN nCoeff_is_CF(const coeffs r)
Definition: coeffs.h:893
void(* cfInpMult)(number &a, number b, const coeffs r)
Inplace: a *= b.
Definition: coeffs.h:277
ring extRing
Definition: coeffs.h:334
numberfunc cfSub
Definition: coeffs.h:173
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:43
number(* cfImPart)(number a, const coeffs r)
Definition: coeffs.h:199
#define assume(x)
Definition: mod2.h:405
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:193
The main handler for Singular numbers which are suitable for Singular polynomials.
static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
return the sum of 'a' and 'b', i.e., a+b
Definition: coeffs.h:653
Templated enumerator interface for simple iteration over a generic collection of T's.
Definition: Enumerator.h:124
BOOLEAN has_simple_Inverse
TRUE, if std should make polynomials monic (if nInvers is cheap) if false, then a gcd routine is used...
Definition: coeffs.h:135
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:813
int ref
Definition: coeffs.h:124
void(* cfPower)(number a, int i, number *result, const coeffs r)
Definition: coeffs.h:235
int GFDegree
Definition: coeffs.h:93
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
Definition: coeffs.h:71
static FORCE_INLINE BOOLEAN n_DivBy(number a, number b, const coeffs r)
test whether 'a' is divisible 'b'; for r encoding a field: TRUE iff 'b' does not represent zero in Z:...
Definition: coeffs.h:769
static FORCE_INLINE BOOLEAN nCoeff_has_simple_Alloc(const coeffs r)
TRUE if n_Delete/n_New are empty operations.
Definition: coeffs.h:902
complex floating point (GMP) numbers
Definition: coeffs.h:40
static FORCE_INLINE char * nCoeffName(const coeffs cf)
Definition: coeffs.h:962
(gmp_complex), see gnumpc.h
Definition: coeffs.h:116
static FORCE_INLINE void n_Write(number &n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:590
nCoeffsEnumeratorFunc cfClearContent
function pointer behind n_ClearContent
Definition: coeffs.h:305
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
Definition: coeffs.h:918
static FORCE_INLINE number n_InitMPZ(mpz_t n, const coeffs r)
conversion of a GMP integer to number
Definition: coeffs.h:541
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:206
All the auxiliary stuff.
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:563
int m
Definition: cfEzgcd.cc:119
static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
Definition: coeffs.h:700
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)
Definition: coeffs.h:556
int m_nfCharP
the characteristic: p
Definition: coeffs.h:364
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:41
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition: coeffs.h:745
int npPminus1M
characteristic - 1
Definition: coeffs.h:375
BOOLEAN is_domain
TRUE, if cf is a domain.
Definition: coeffs.h:140
numberfunc cfExactDiv
Definition: coeffs.h:173
static FORCE_INLINE BOOLEAN nCoeff_is_transExt(const coeffs r)
TRUE iff r represents a transcendental extension field.
Definition: coeffs.h:914
int i
Definition: cfEzgcd.cc:123
n_coeffType type
Definition: coeffs.h:126
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:113
numberfunc cfDiv
Definition: coeffs.h:173
static FORCE_INLINE int n_DivComp(number a, number b, const coeffs r)
Definition: coeffs.h:515
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
Definition: coeffs.h:464
static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
Definition: coeffs.h:832
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
Definition: coeffs.h:718
static FORCE_INLINE number n_Lcm(number a, number b, const coeffs r)
in Z: return the lcm of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ...
Definition: coeffs.h:709
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
void * data
Definition: coeffs.h:410
numberfunc cfMult
Definition: coeffs.h:173
int(* siRandProc)()
Definition: sirandom.h:9
unsigned long mod2mMask
Definition: coeffs.h:404
short float_len
Definition: coeffs.h:352
static FORCE_INLINE number n_ImPart(number i, const coeffs cf)
Definition: coeffs.h:809
static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
Definition: coeffs.h:783
static FORCE_INLINE coeffs nCopyCoeff(const coeffs r)
"copy" coeffs, i.e. increment ref
Definition: coeffs.h:429
(number), see longrat.h
Definition: coeffs.h:109
static FORCE_INLINE number n_ExtGcd(number a, number b, number *s, number *t, const coeffs r)
beware that ExtGCD is only relevant for a few chosen coeff. domains and may perform something unexpec...
Definition: coeffs.h:690
int GFChar
Definition: coeffs.h:92
static FORCE_INLINE void n_WriteFd(number a, FILE *f, const coeffs r)
io via ssi:
Definition: coeffs.h:969
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:37
n_coeffType
Definition: coeffs.h:26
static FORCE_INLINE void n_Power(number a, int b, number *res, const coeffs r)
fill res with the power a^b
Definition: coeffs.h:629
CanonicalForm cf
Definition: cfModGcd.cc:4024
static FORCE_INLINE void n_CoeffWrite(const coeffs r, BOOLEAN details=TRUE)
output the coeff description
Definition: coeffs.h:735
static FORCE_INLINE BOOLEAN nCoeff_is_Domain(const coeffs r)
returns TRUE, if r is a field or r has no zero divisors (i.e is a domain)
Definition: coeffs.h:755
#define NULL
Definition: omList.c:10
{p^n < 2^16}
Definition: coeffs.h:32
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition: coeffs.h:451
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic ...
Definition: coeffs.h:34
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:613
(gmp_float), see
Definition: coeffs.h:115
number(* cfGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:242
Count number operarions over coefficient rings, fields and other domains suitable for Singular polyno...
number(* cfReadFd)(s_buff f, const coeffs r)
Definition: coeffs.h:274
static FORCE_INLINE BOOLEAN nCoeff_is_Q_algext(const coeffs r)
is it an alg. ext. of Q?
Definition: coeffs.h:910
number(* cfLcm)(number a, number b, const coeffs r)
Definition: coeffs.h:266
Variable x
Definition: cfModGcd.cc:4023
number(* convFactoryNSingN)(const CanonicalForm n, const coeffs r)
conversion to CanonicalForm(factory) to number
Definition: coeffs.h:311
static FORCE_INLINE number n_GetDenom(number &n, const coeffs r)
return the denominator of n (if elements of r are by nature not fractional, result is 1) ...
Definition: coeffs.h:602
static FORCE_INLINE number n_RePart(number i, const coeffs cf)
Definition: coeffs.h:806
static FORCE_INLINE BOOLEAN n_Equal(number a, number b, const coeffs r)
TRUE iff 'a' and 'b' represent the same number; they may have different representations.
Definition: coeffs.h:460
const char * par_name
parameter name
Definition: coeffs.h:101
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 ...
Definition: coeffs.h:620
nMapFunc(* cfSetMap)(const coeffs src, const coeffs dst)
Definition: coeffs.h:271
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
Definition: coeffs.h:685
unsigned long modExponent
Definition: coeffs.h:402
#define const
Definition: fegetopt.c:41
void nNew(number *a)
Definition: numbers.cc:49
static FORCE_INLINE BOOLEAN nCoeff_is_Extension(const coeffs r)
Definition: coeffs.h:839
int(* cfSize)(number n, const coeffs r)
how complicated, (0) => 0, or positive
Definition: coeffs.h:182
(int), see modulop.h
Definition: coeffs.h:108
END_NAMESPACE const void * p2
Definition: syzextra.cc:202
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
static FORCE_INLINE BOOLEAN n_IsMOne(number n, const coeffs r)
TRUE iff 'n' represents the additive inverse of the one element, i.e. -1.
Definition: coeffs.h:472
static FORCE_INLINE BOOLEAN n_GreaterZero(number n, const coeffs r)
ordered fields: TRUE iff 'n' is positive; in Z/pZ: TRUE iff 0 < m <= roundedBelow(p/2), where m is the long representing n in C: TRUE iff (Im(n) != 0 and Im(n) >= 0) or (Im(n) == 0 and Re(n) >= 0) in K(a)/: TRUE iff (n != 0 and (LC(n) > 0 or deg(n) > 0)) in K(t_1, ..., t_n): TRUE iff (LC(numerator(n) is a constant and > 0) or (LC(numerator(n) is not a constant) in Z/2^kZ: TRUE iff 0 < n <= 2^(k-1) in Z/mZ: TRUE iff the internal mpz is greater than zero in Z: TRUE iff n > 0
Definition: coeffs.h:494
number(* cfAnn)(number a, const coeffs r)
Definition: coeffs.h:257
number(* cfParameter)(const int i, const coeffs r)
create i^th parameter or NULL if not possible
Definition: coeffs.h:299
static FORCE_INLINE char * nCoeffString(const coeffs cf)
TODO: make it a virtual method of coeffs, together with: Decompose & Compose, rParameter & rPar...
Definition: coeffs.h:958
int * m_nfMinPoly
Definition: coeffs.h:367
BOOLEAN(*)(*)(*)(*)(*) cfIsMOne(number a, const coeffs r)
Definition: coeffs.h:228
CanonicalForm(* convSingNFactoryN)(number n, BOOLEAN setChar, const coeffs r)
Definition: coeffs.h:312
(int), see ffields.h
Definition: coeffs.h:117
void(* cfKillChar)(coeffs r)
Definition: coeffs.h:157
number(* cfEucNorm)(number a, const coeffs r)
Definition: coeffs.h:254
int BOOLEAN
Definition: auxiliary.h:131
const poly b
Definition: syzextra.cc:213
mpz_ptr modBase
Definition: coeffs.h:401
coeffs(* cfQuot1)(number c, const coeffs r)
Definition: coeffs.h:406
static FORCE_INLINE void n_WriteShort(number &n, const coeffs r)
write to the output buffer of the currently used reporter in a shortest possible way, e.g. in K(a): a2 instead of a^2
Definition: coeffs.h:587
static FORCE_INLINE int n_Size(number n, const coeffs r)
return a non-negative measure for the complexity of n; return 0 only when n represents zero; (used fo...
Definition: coeffs.h:569
void nKillChar(coeffs r)
undo all initialisations
Definition: numbers.cc:477
void(* cfInpAdd)(number &a, number b, const coeffs r)
Inplace: a += b.
Definition: coeffs.h:280
omBin rnumber_bin
Definition: longrat0.cc:23
number(* cfGetNumerator)(number &n, const coeffs r)
Definition: coeffs.h:237
void(* cfWriteFd)(number a, FILE *f, const coeffs r)
Definition: coeffs.h:273
static FORCE_INLINE void n_MPZ(mpz_t result, number &n, const coeffs r)
conversion of n to a GMP integer; 0 if not possible
Definition: coeffs.h:550
int iNumberOfParameters
Number of Parameters in the coeffs (default 0)
Definition: coeffs.h:319
int l
Definition: cfEzgcd.cc:94
return result
Definition: facAbsBiFact.cc:76
number(* cfGetDenom)(number &n, const coeffs r)
Definition: coeffs.h:236
BOOLEAN(*)(*)(*) cfIsZero(number a, const coeffs r)
Definition: coeffs.h:226
static FORCE_INLINE coeffs n_CoeffRingQuot1(number c, const coeffs r)
Definition: coeffs.h:532
static FORCE_INLINE void n_WriteLong(number &n, const coeffs r)
write to the output buffer of the currently used reporter
Definition: coeffs.h:582
BOOLEAN(*)(*) cfEqual(number a, number b, const coeffs r)
tests
Definition: coeffs.h:225
static FORCE_INLINE void n_ClearDenominators(ICoeffsEnumerator &numberCollectionEnumerator, number &d, const coeffs r)
(inplace) Clears denominators on a collection of numbers number d is the LCM of all the coefficient d...
Definition: coeffs.h:934
void n_Print(number &a, const coeffs r)
print a number (BEWARE of string buffers!) mostly for debugging
Definition: numbers.cc:538
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition: numbers.cc:316
(float), see shortfl.h
Definition: coeffs.h:114
unsigned short * npExpTable
Definition: coeffs.h:372
nCoeffsEnumeratorFunc cfClearDenominators
function pointer behind n_ClearDenominators
Definition: coeffs.h:308
int m_nfM1
representation of -1
Definition: coeffs.h:363
int(* cfParDeg)(number x, const coeffs r)
degree for coeffcients: -1 for 0, 0 for "constants", ...
Definition: coeffs.h:296