Functions | Variables
numbers.cc File Reference
#include <string.h>
#include <stdlib.h>
#include <misc/auxiliary.h>
#include <omalloc/omalloc.h>
#include <factory/factory.h>
#include <reporter/reporter.h>
#include <coeffs/coeffs.h>
#include <coeffs/numbers.h>
#include <coeffs/longrat.h>
#include <coeffs/modulop.h>
#include <coeffs/gnumpfl.h>
#include <coeffs/gnumpc.h>
#include <coeffs/ffields.h>
#include <coeffs/shortfl.h>
#include <coeffs/rmodulo2m.h>
#include <coeffs/rmodulon.h>
#include <coeffs/rintegers.h>
#include <polys/ext_fields/algext.h>
#include <polys/ext_fields/transext.h>

Go to the source code of this file.

Functions

void nNew (number *d)
 
static void ndDelete (number *d, const coeffs)
 
static number ndAnn (number, const coeffs)
 
static char * ndCoeffString (const coeffs r)
 
static void ndInpMult (number &a, number b, const coeffs r)
 
static void ndInpAdd (number &a, number b, const coeffs r)
 
static void ndPower (number a, int i, number *res, const coeffs r)
 
static BOOLEAN ndDBTest (number, const char *, const int, const coeffs)
 
static number ndFarey (number, number, const coeffs r)
 
static number ndChineseRemainder (number *, number *, int, BOOLEAN, const coeffs r)
 
static int ndParDeg (number n, const coeffs r)
 
static number ndParameter (const int, const coeffs r)
 
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 implementation: should ONLY be used for debug stuff /tests. More...
 
static void ndNormalize (number &, const coeffs)
 
static number ndReturn0 (number, const coeffs r)
 
static number ndGcd (number, number, const coeffs r)
 
static number ndIntMod (number, number, const coeffs r)
 
static number ndGetDenom (number &, const coeffs r)
 
static number ndGetNumerator (number &a, const coeffs r)
 
static int ndSize (number a, const coeffs r)
 
static char * ndCoeffName (const coeffs r)
 
static void ndClearContent (ICoeffsEnumerator &numberCollectionEnumerator, number &c, const coeffs r)
 
static void ndClearDenominators (ICoeffsEnumerator &, number &d, const coeffs r)
 
static number ndCopy (number a, const coeffs)
 
number ndCopyMap (number a, const coeffs aRing, const coeffs r)
 
static void ndKillChar (coeffs)
 
static void ndSetChar (const coeffs)
 
number nd_Copy (number a, const coeffs r)
 
static BOOLEAN ndDivBy (number, number, const coeffs)
 
static int ndDivComp (number, number, const coeffs)
 
static BOOLEAN ndIsUnit (number a, const coeffs r)
 
static number ndExtGcd (number, number, number *, number *, const coeffs r)
 
static CanonicalForm ndConvSingNFactoryN (number, BOOLEAN, const coeffs)
 
static number ndConvFactoryNSingN (const CanonicalForm, const coeffs)
 [in, out] a bigint number >= 0 More...
 
static void ndMPZ (mpz_t result, number &n, const coeffs r)
 Converts a non-negative bigint number into a GMP number. More...
 
static number ndInitMPZ (mpz_t m, const coeffs r)
 
static BOOLEAN ndCoeffIsEqual (const coeffs r, n_coeffType n, void *)
 
coeffs nInitChar (n_coeffType t, void *parameter)
 one-time initialisations for new coeffs in case of an error return NULL More...
 
void nKillChar (coeffs r)
 undo all initialisations More...
 
n_coeffType nRegister (n_coeffType n, cfInitCharProc p)
 
void n_Print (number &a, const coeffs r)
 print a number (BEWARE of string buffers!) mostly for debugging More...
 
number n_convFactoryNSingN (const CanonicalForm n, const coeffs r)
 
CanonicalForm n_convSingNFactoryN (number n, BOOLEAN setChar, const coeffs r)
 

Variables

n_Procs_scf_root =NULL
 
static n_coeffType nLastCoeffs =n_CF
 
cfInitCharProc nInitCharTableDefault []
 
static cfInitCharProcnInitCharTable =nInitCharTableDefault
 

Function Documentation

number n_convFactoryNSingN ( const CanonicalForm  n,
const coeffs  r 
)

Definition at line 549 of file numbers.cc.

551 { STATISTIC(n_convFactoryNSingN); assume(r != NULL); assume(r->convFactoryNSingN != NULL); return r->convFactoryNSingN(n, r); }
#define STATISTIC(f)
Definition: numstats.h:16
number n_convFactoryNSingN(const CanonicalForm n, const coeffs r)
Definition: numbers.cc:549
#define assume(x)
Definition: mod2.h:405
#define NULL
Definition: omList.c:10
CanonicalForm n_convSingNFactoryN ( number  n,
BOOLEAN  setChar,
const coeffs  r 
)

Definition at line 554 of file numbers.cc.

556 { STATISTIC(n_convSingNFactoryN); assume(r != NULL); assume(r->convSingNFactoryN != NULL); return r->convSingNFactoryN(n, setChar, r); }
#define STATISTIC(f)
Definition: numstats.h:16
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
#define assume(x)
Definition: mod2.h:405
#define NULL
Definition: omList.c:10
CanonicalForm n_convSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
Definition: numbers.cc:554
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 implementation: should ONLY be used for debug stuff /tests.

Definition at line 120 of file numbers.cc.

121 {
122  int c = n_GetChar(r);
123  BOOLEAN ret = n_IsZero(a, r);
124  if( (c != 0) && !ret )
125  {
126  number ch = n_Init( c, r );
127  number g = n_Gcd( ch, a, r );
128  ret = !n_IsOne (g, r);
129  n_Delete(&ch, r);
130  n_Delete(&g, r);
131  }
132  return ret;
133 }
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 poly a
Definition: syzextra.cc:212
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:468
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 int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
Definition: coeffs.h:444
g
Definition: cfModGcd.cc:4031
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 void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
int BOOLEAN
Definition: auxiliary.h:131
void n_Print ( number &  a,
const coeffs  r 
)

print a number (BEWARE of string buffers!) mostly for debugging

Definition at line 538 of file numbers.cc.

540 {
541  assume(r != NULL);
542  n_Test(a,r);
543 
544  StringSetS("");
545  n_Write(a, r);
546  { char* s = StringEndS(); Print("%s", s); omFree(s); }
const CanonicalForm int s
Definition: facAbsFact.cc:55
const poly a
Definition: syzextra.cc:212
#define Print
Definition: emacs.cc:83
char * StringEndS()
Definition: reporter.cc:151
#define omFree(addr)
Definition: omAllocDecl.h:261
#define assume(x)
Definition: mod2.h:405
void StringSetS(const char *st)
Definition: reporter.cc:128
static FORCE_INLINE void n_Write(number &n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:590
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
Definition: coeffs.h:918
#define NULL
Definition: omList.c:10
number nd_Copy ( number  a,
const coeffs  r 
)

Definition at line 240 of file numbers.cc.

240 { return r->cfCopy(a, r); }
const poly a
Definition: syzextra.cc:212
static number ndAnn ( number  ,
const coeffs   
)
static

Definition at line 53 of file numbers.cc.

53 { return NULL;}
#define NULL
Definition: omList.c:10
static number ndChineseRemainder ( number *  ,
number *  ,
int  ,
BOOLEAN  ,
const coeffs  r 
)
static

Definition at line 103 of file numbers.cc.

104 {
105  Werror("ChineseRemainder not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
106  return r->cfInit(0,r);
107 }
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
void Werror(const char *fmt,...)
Definition: reporter.cc:199
static void ndClearContent ( ICoeffsEnumerator numberCollectionEnumerator,
number &  c,
const coeffs  r 
)
static

TODO: move to a separate implementation

Definition at line 144 of file numbers.cc.

145 {
146  assume(r != NULL);
147 
148  // no fractions
149  assume(!( nCoeff_is_Q(r) ));
150  // all coeffs are given by integers!!!
151 
152  numberCollectionEnumerator.Reset();
153 
154  if( !numberCollectionEnumerator.MoveNext() ) // empty zero polynomial?
155  {
156  c = n_Init(1, r);
157  return;
158  }
159 
160  number &curr = numberCollectionEnumerator.Current();
161 
162 #ifdef HAVE_RINGS
163  /// TODO: move to a separate implementation
164  if (nCoeff_is_Ring(r))
165  {
166  if (nCoeff_has_Units(r))
167  {
168  c = n_GetUnit(curr, r);
169 
170  if (!n_IsOne(c, r))
171  {
172  number inv = n_Invers(c, r);
173 
174  n_InpMult(curr, inv, r);
175 
176  while( numberCollectionEnumerator.MoveNext() )
177  {
178  number &n = numberCollectionEnumerator.Current();
179  n_Normalize(n, r); // ?
180  n_InpMult(n, inv, r); // TODO: either this or directly divide!!!?
181  }
182 
183  n_Delete(&inv, r);
184  }
185  } else c = n_Init(1, r);
186 
187  return;
188  }
189 #endif
190 
191  assume(!nCoeff_is_Ring(r));
193 
194  n_Normalize(curr, r); // Q: good/bad/ugly??
195 
196  if (!n_IsOne(curr, r))
197  {
198  number t = curr; // takes over the curr! note: not a reference!!!
199 
200  curr = n_Init(1, r); // ???
201 
202  number inv = n_Invers(t, r);
203 
204  while( numberCollectionEnumerator.MoveNext() )
205  {
206  number &n = numberCollectionEnumerator.Current();
207  n_InpMult(n, inv, r); // TODO: either this or directly divide!!!?
208 // n_Normalize(n, r); // ?
209  }
210 
211  n_Delete(&inv, r);
212 
213  c = t;
214  } else
215  c = n_Copy(curr, r); // c == 1 and nothing else to do...
216 }
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 BOOLEAN nCoeff_is_numeric(const coeffs r)
Definition: coeffs.h:825
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:816
static FORCE_INLINE BOOLEAN nCoeff_is_Zp_a(const coeffs r)
Definition: coeffs.h:852
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
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:468
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
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
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
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
Definition: coeffs.h:822
static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
Definition: coeffs.h:751
virtual void Reset()=0
Sets the enumerator to its initial position: -1, which is before the first element in the collection...
#define assume(x)
Definition: mod2.h:405
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
virtual reference Current()=0
Gets the current element in the collection (read and write).
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
static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
Definition: coeffs.h:832
#define NULL
Definition: omList.c:10
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition: coeffs.h:451
virtual bool MoveNext()=0
Advances the enumerator to the next element of the collection. returns true if the enumerator was suc...
static FORCE_INLINE BOOLEAN nCoeff_is_Q_algext(const coeffs r)
is it an alg. ext. of Q?
Definition: coeffs.h:910
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
static void ndClearDenominators ( ICoeffsEnumerator ,
number &  d,
const coeffs  r 
)
static

Definition at line 218 of file numbers.cc.

219 {
220  assume( r != NULL );
223 
224  d = n_Init(1, r);
225 }
static FORCE_INLINE BOOLEAN nCoeff_is_numeric(const coeffs r)
Definition: coeffs.h:825
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:816
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_Q(const coeffs r)
Definition: coeffs.h:822
static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
Definition: coeffs.h:751
static FORCE_INLINE BOOLEAN nCoeff_is_algExt(const coeffs r)
TRUE iff r represents an algebraic extension field.
Definition: coeffs.h:906
#define assume(x)
Definition: mod2.h:405
static FORCE_INLINE BOOLEAN nCoeff_is_transExt(const coeffs r)
TRUE iff r represents a transcendental extension field.
Definition: coeffs.h:914
static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
Definition: coeffs.h:832
#define NULL
Definition: omList.c:10
static BOOLEAN ndCoeffIsEqual ( const coeffs  r,
n_coeffType  n,
void *   
)
static

Definition at line 275 of file numbers.cc.

277 {
278  /* test, if r is an instance of nInitCoeffs(n,parameter) */
279  /* if parameter is not needed */
280  return (n==r->type);
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
static char* ndCoeffName ( const coeffs  r)
static

Definition at line 142 of file numbers.cc.

142 { return r->cfCoeffString(r); }
static char* ndCoeffString ( const coeffs  r)
static

Definition at line 54 of file numbers.cc.

55 {
56  char *s=(char *)omAlloc(11);snprintf(s,11,"Coeffs(%d)",r->type);
57  return s;
58 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
#define omAlloc(size)
Definition: omAllocDecl.h:210
static number ndConvFactoryNSingN ( const CanonicalForm  ,
const coeffs   
)
static

[in, out] a bigint number >= 0

[out] the GMP equivalent

Definition at line 256 of file numbers.cc.

static CanonicalForm ndConvSingNFactoryN ( number  ,
BOOLEAN  ,
const coeffs   
)
static

Definition at line 249 of file numbers.cc.

250 {
251  CanonicalForm term(0);
252  Werror("no conversion to factory");
253  return term;
254 }
Definition: int_poly.h:36
factory's main class
Definition: canonicalform.h:72
void Werror(const char *fmt,...)
Definition: reporter.cc:199
static number ndCopy ( number  a,
const coeffs   
)
static

Definition at line 227 of file numbers.cc.

227 { return a; }
const poly a
Definition: syzextra.cc:212
number ndCopyMap ( number  a,
const coeffs  aRing,
const coeffs  r 
)

Definition at line 228 of file numbers.cc.

229 {
230  assume( getCoeffType(r) == getCoeffType(aRing) );
232  return a;
233  else
234  return r->cfCopy(a, r);
235 }
const poly a
Definition: syzextra.cc:212
#define assume(x)
Definition: mod2.h:405
static FORCE_INLINE BOOLEAN nCoeff_has_simple_Alloc(const coeffs r)
TRUE if n_Delete/n_New are empty operations.
Definition: coeffs.h:902
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
static BOOLEAN ndDBTest ( number  ,
const char *  ,
const int  ,
const coeffs   
)
static

Definition at line 95 of file numbers.cc.

95 { return TRUE; }
#define TRUE
Definition: auxiliary.h:144
static void ndDelete ( number *  d,
const coeffs   
)
static

Definition at line 52 of file numbers.cc.

52 { *d=NULL; }
#define NULL
Definition: omList.c:10
static BOOLEAN ndDivBy ( number  ,
number  ,
const coeffs   
)
static

Definition at line 243 of file numbers.cc.

243 { return TRUE; } // assume a,b !=0
#define TRUE
Definition: auxiliary.h:144
static int ndDivComp ( number  ,
number  ,
const coeffs   
)
static

Definition at line 244 of file numbers.cc.

244 { return 2; }
static number ndExtGcd ( number  ,
number  ,
number *  ,
number *  ,
const coeffs  r 
)
static

Definition at line 246 of file numbers.cc.

246 { return r->cfInit(1,r); }
static number ndFarey ( number  ,
number  ,
const coeffs  r 
)
static

Definition at line 98 of file numbers.cc.

99 {
100  Werror("farey not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r));
101  return NULL;
102 }
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
#define NULL
Definition: omList.c:10
void Werror(const char *fmt,...)
Definition: reporter.cc:199
static number ndGcd ( number  ,
number  ,
const coeffs  r 
)
static

Definition at line 137 of file numbers.cc.

137 { return r->cfInit(1,r); }
static number ndGetDenom ( number &  ,
const coeffs  r 
)
static

Definition at line 139 of file numbers.cc.

139 { return r->cfInit(1,r); }
static number ndGetNumerator ( number &  a,
const coeffs  r 
)
static

Definition at line 140 of file numbers.cc.

140 { return r->cfCopy(a,r); }
const poly a
Definition: syzextra.cc:212
static number ndInitMPZ ( mpz_t  m,
const coeffs  r 
)
static

Definition at line 269 of file numbers.cc.

271 {
272  return r->cfInit( mpz_get_si(m), r);
int m
Definition: cfEzgcd.cc:119
static void ndInpAdd ( number &  a,
number  b,
const coeffs  r 
)
static

Definition at line 65 of file numbers.cc.

66 {
67  number n=r->cfAdd(a,b,r);
68  r->cfDelete(&a,r);
69  a=n;
70 }
const poly a
Definition: syzextra.cc:212
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
const poly b
Definition: syzextra.cc:213
static void ndInpMult ( number &  a,
number  b,
const coeffs  r 
)
static

Definition at line 59 of file numbers.cc.

60 {
61  number n=r->cfMult(a,b,r);
62  r->cfDelete(&a,r);
63  a=n;
64 }
const poly a
Definition: syzextra.cc:212
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
const poly b
Definition: syzextra.cc:213
static number ndIntMod ( number  ,
number  ,
const coeffs  r 
)
static

Definition at line 138 of file numbers.cc.

138 { return r->cfInit(0,r); }
static BOOLEAN ndIsUnit ( number  a,
const coeffs  r 
)
static

Definition at line 245 of file numbers.cc.

245 { return !r->cfIsZero(a,r); }
const poly a
Definition: syzextra.cc:212
static void ndKillChar ( coeffs  )
static

Definition at line 237 of file numbers.cc.

237 {}
static void ndMPZ ( mpz_t  result,
number &  n,
const coeffs  r 
)
static

Converts a non-negative bigint number into a GMP number.

Definition at line 264 of file numbers.cc.

266 {
267  mpz_init_set_si( result, r->cfInt(n, r) );
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
return result
Definition: facAbsBiFact.cc:76
static void ndNormalize ( number &  ,
const coeffs   
)
static

Definition at line 135 of file numbers.cc.

135 { }
static number ndParameter ( const int  ,
const coeffs  r 
)
static

Definition at line 114 of file numbers.cc.

115 {
116  Werror("ndParameter: n_Parameter is not implemented/relevant for (coeff_type = %d)",getCoeffType(r));
117  return NULL;
118 }
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
#define NULL
Definition: omList.c:10
void Werror(const char *fmt,...)
Definition: reporter.cc:199
static int ndParDeg ( number  n,
const coeffs  r 
)
static

Definition at line 109 of file numbers.cc.

110 {
111  return (-r->cfIsZero(n,r));
112 }
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
static void ndPower ( number  a,
int  i,
number *  res,
const coeffs  r 
)
static

Definition at line 72 of file numbers.cc.

73 {
74  if (i==0) {
75  *res = r->cfInit(1, r);
76  } else if (i==1) {
77  *res = r->cfCopy(a, r);
78  } else if (i==2) {
79  *res = r->cfMult(a, a, r);
80  } else if (i<0) {
81  number b = r->cfInvers(a, r);
82  ndPower(b, -i, res, r);
83  r->cfDelete(&b, r);
84  } else {
85  ndPower(a, i/2, res, r);
86  r->cfInpMult(*res, *res, r);
87  if (i&1) {
88  r->cfInpMult(*res, a, r);
89  }
90  }
91 }
const poly a
Definition: syzextra.cc:212
static void ndPower(number a, int i, number *res, const coeffs r)
Definition: numbers.cc:72
poly res
Definition: myNF.cc:322
int i
Definition: cfEzgcd.cc:123
const poly b
Definition: syzextra.cc:213
static number ndReturn0 ( number  ,
const coeffs  r 
)
static

Definition at line 136 of file numbers.cc.

136 { return r->cfInit(0,r); }
static void ndSetChar ( const coeffs  )
static

Definition at line 238 of file numbers.cc.

238 {}
static int ndSize ( number  a,
const coeffs  r 
)
static

Definition at line 141 of file numbers.cc.

141 { return (int)r->cfIsZero(a,r)==FALSE; }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:140
coeffs nInitChar ( n_coeffType  t,
void *  parameter 
)

one-time initialisations for new coeffs in case of an error return NULL

Definition at line 316 of file numbers.cc.

318 {
320 
321  while((n!=NULL) && (n->nCoeffIsEqual!=NULL) && (!n->nCoeffIsEqual(n,t,parameter)))
322  n=n->next;
323 
324  if (n==NULL)
325  {
326  n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
327  n->next=cf_root;
328  n->ref=1;
329  n->type=t;
330 
331  // default entries (different from NULL) for some routines:
333  n->cfSize = ndSize;
336  n->cfImPart=ndReturn0;
337  n->cfDelete= ndDelete;
338  n->cfAnn = ndAnn;
339  n->cfCoeffString = ndCoeffString; // should alway be changed!
340  n->cfInpMult=ndInpMult;
341  n->cfInpAdd=ndInpAdd;
342  n->cfCopy = ndCopy;
343  n->cfIntMod=ndIntMod; /* dummy !! */
345  n->cfGcd = ndGcd;
346  n->cfNormalizeHelper = ndGcd; /* tricky, isn't it ?*/
347  n->cfLcm = ndGcd; /* tricky, isn't it ?*/
348  n->cfInitMPZ = ndInitMPZ;
349  n->cfMPZ = ndMPZ;
350  n->cfPower = ndPower;
352 
353  n->cfKillChar = ndKillChar; /* dummy */
354  n->cfSetChar = ndSetChar; /* dummy */
355  // temp. removed to catch all the coeffs which miss to implement this!
356 
358  n->cfFarey = ndFarey;
359  n->cfParDeg = ndParDeg;
360 
362 
365 
366 #ifdef HAVE_RINGS
367  n->cfDivComp = ndDivComp;
368  n->cfDivBy = ndDivBy;
369  n->cfIsUnit = ndIsUnit;
370  n->cfExtGcd = ndExtGcd;
371  //n->cfGetUnit = (nMapFunc)NULL;
372 #endif
373 
374 #ifdef LDEBUG
375  n->cfDBTest=ndDBTest;
376 #endif
377 
380 
381  BOOLEAN nOK=TRUE;
382  // init
383  if ((t<=nLastCoeffs) && (nInitCharTable[t]!=NULL))
384  nOK = (nInitCharTable[t])(n,parameter);
385  else
386  Werror("Sorry: the coeff type [%d] was not registered: it is missing in nInitCharTable", (int)t);
387  if (nOK)
388  {
389  omFreeSize(n,sizeof(*n));
390  return NULL;
391  }
392  cf_root=n;
393  // post init settings:
394  if (n->cfRePart==NULL) n->cfRePart=n->cfCopy;
395  if (n->cfExactDiv==NULL) n->cfExactDiv=n->cfDiv;
396  if (n->cfSubringGcd==NULL) n->cfSubringGcd=n->cfGcd;
397 
398 #ifdef HAVE_RINGS
399  if (n->cfGetUnit==NULL) n->cfGetUnit=n->cfCopy;
400 #endif
401 
402  if(n->cfWriteShort==NULL)
403  n->cfWriteShort = n->cfWriteLong;
404 
406  assume(n->cfSetChar!=NULL);
408  assume(n->cfMult!=NULL);
409  assume(n->cfSub!=NULL);
410  assume(n->cfAdd!=NULL);
411  assume(n->cfDiv!=NULL);
412  assume(n->cfIntMod!=NULL);
413  assume(n->cfExactDiv!=NULL);
414  assume(n->cfInit!=NULL);
415  assume(n->cfInitMPZ!=NULL);
416  assume(n->cfSize!=NULL);
417  assume(n->cfInt!=NULL);
418  assume(n->cfMPZ!=NULL);
419  //assume(n->n->cfDivComp!=NULL);
420  //assume(n->cfIsUnit!=NULL);
421  //assume(n->cfGetUnit!=NULL);
422  //assume(n->cfExtGcd!=NULL);
423  assume(n->cfInpNeg!=NULL);
424  assume(n->cfCopy!=NULL);
425 
426  assume(n->cfWriteLong!=NULL);
427  assume(n->cfWriteShort!=NULL);
428 
429  assume(n->iNumberOfParameters>= 0);
430 
431  assume( (n->iNumberOfParameters == 0 && n->pParameterNames == NULL) ||
432  (n->iNumberOfParameters > 0 && n->pParameterNames != NULL) );
433 
434  assume(n->cfParameter!=NULL);
435  assume(n->cfParDeg!=NULL);
436 
437  assume(n->cfRead!=NULL);
438  assume(n->cfNormalize!=NULL);
439  assume(n->cfGreater!=NULL);
440  //assume(n->cfDivBy!=NULL);
441  assume(n->cfEqual!=NULL);
442  assume(n->cfIsZero!=NULL);
443  assume(n->cfIsOne!=NULL);
444  assume(n->cfIsMOne!=NULL);
446  assume(n->cfGetDenom!=NULL);
448  assume(n->cfGcd!=NULL);
450  assume(n->cfDelete!=NULL);
451  assume(n->cfSetMap!=NULL);
452  assume(n->cfInpMult!=NULL);
453 // assume(n->cfInit_bigint!=NULL);
454  assume(n->cfCoeffWrite != NULL);
455 
456  assume(n->cfClearContent != NULL);
458 
459  assume(n->type==t);
460 
461 #ifndef SING_NDEBUG
462  if(n->cfKillChar==NULL) Warn("cfKillChar is NULL for coeff %d",t);
463  if(n->cfWriteLong==NULL) Warn("cfWrite is NULL for coeff %d",t);
464  if(n->cfWriteShort==NULL) Warn("cfWriteShort is NULL for coeff %d",t);
465  if(n->cfCoeffString==ndCoeffString) Warn("cfCoeffString is undefined for coeff %d",t);
466 #endif
467 
468  if( n->nNULL == NULL )
469  n->nNULL = n->cfInit(0, n); // may still remain NULL
470  }
471  else
472  {
473  n->ref++;
474  }
475  return n;
static BOOLEAN ndIsUnit(number a, const coeffs r)
Definition: numbers.cc:245
BOOLEAN(* cfDivBy)(number a, number b, const coeffs r)
Definition: coeffs.h:381
static number ndChineseRemainder(number *, number *, int, BOOLEAN, const coeffs r)
Definition: numbers.cc:103
number(* cfCopy)(number a, const coeffs r)
return a copy of a
Definition: coeffs.h:197
number(* cfExtGcd)(number a, number b, number *s, number *t, const coeffs r)
Definition: coeffs.h:244
numberfunc cfIntMod
Definition: coeffs.h:173
int(* cfDivComp)(number a, number b, const coeffs r)
Definition: coeffs.h:377
static void ndPower(number a, int i, number *res, const coeffs r)
Definition: numbers.cc:72
static number ndParameter(const int, const coeffs r)
Definition: numbers.cc:114
number nNULL
the 0 as constant, NULL by default
Definition: coeffs.h:316
static void ndKillChar(coeffs)
Definition: numbers.cc:237
static BOOLEAN ndDBTest(number, const char *, const int, const coeffs)
Definition: numbers.cc:95
BOOLEAN(* cfDBTest)(number a, const char *f, const int l, const coeffs r)
Test: is "a" a correct number?
Definition: coeffs.h:415
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
void(* cfSetChar)(const coeffs r)
Definition: coeffs.h:159
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
static BOOLEAN ndDivBy(number, number, const coeffs)
Definition: numbers.cc:243
char const ** pParameterNames
array containing the names of Parameters (default NULL)
Definition: coeffs.h:322
coeffs next
Definition: coeffs.h:123
static number ndCopy(number a, const coeffs)
Definition: numbers.cc:227
static n_coeffType nLastCoeffs
Definition: numbers.cc:282
void(* cfDelete)(number *a, const coeffs r)
Definition: coeffs.h:268
static void ndNormalize(number &, const coeffs)
Definition: numbers.cc:135
BOOLEAN(*)(*)(*)(*) cfIsOne(number a, const coeffs r)
Definition: coeffs.h:227
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
number(* cfSubringGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:243
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
static number ndConvFactoryNSingN(const CanonicalForm, const coeffs)
[in, out] a bigint number >= 0
Definition: numbers.cc:256
numberfunc cfAdd
Definition: coeffs.h:173
BOOLEAN(* cfGreater)(number a, number b, const coeffs r)
Definition: coeffs.h:223
void(* cfNormalize)(number &a, const coeffs r)
Definition: coeffs.h:221
static char * ndCoeffString(const coeffs r)
Definition: numbers.cc:54
number(* cfRePart)(number a, const coeffs r)
Definition: coeffs.h:198
#define TRUE
Definition: auxiliary.h:144
static void ndDelete(number *d, const coeffs)
Definition: numbers.cc:52
static int ndDivComp(number, number, const coeffs)
Definition: numbers.cc:244
void(* cfCoeffWrite)(const coeffs r, BOOLEAN details)
output of coeff description via Print
Definition: coeffs.h:146
void(* cfWriteLong)(number &a, const coeffs r)
print a given number (long format)
Definition: coeffs.h:202
static char * ndCoeffName(const coeffs r)
Definition: numbers.cc:142
BOOLEAN(* cfIsUnit)(number a, const coeffs r)
Definition: coeffs.h:378
number(* cfGetUnit)(number a, const coeffs r)
Definition: coeffs.h:379
number(* cfFarey)(number p, number n, const coeffs)
rational reconstruction: "best" rational a/b with a/b = p mod n
Definition: coeffs.h:287
number(* cfInitMPZ)(mpz_t i, const coeffs r)
init with a GMP integer
Definition: coeffs.h:179
char *(* cfCoeffString)(const coeffs r)
string output of coeff description
Definition: coeffs.h:149
BOOLEAN(* nCoeffIsEqual)(const coeffs r, n_coeffType n, void *parameter)
Definition: coeffs.h:143
static number ndReturn0(number, const coeffs r)
Definition: numbers.cc:136
static void ndInpMult(number &a, number b, const coeffs r)
Definition: numbers.cc:59
number(* cfInit)(long i, const coeffs r)
init with an integer
Definition: coeffs.h:176
number(* cfNormalizeHelper)(number a, number b, const coeffs r)
Definition: coeffs.h:267
static number ndInitMPZ(mpz_t m, const coeffs r)
Definition: numbers.cc:269
static int ndParDeg(number n, const coeffs r)
Definition: numbers.cc:109
BOOLEAN(*)(*)(*)(*)(*)(*) cfGreaterZero(number a, const coeffs r)
Definition: coeffs.h:233
long(* cfInt)(number &n, const coeffs r)
convertion to long, 0 if impossible
Definition: coeffs.h:185
void(* cfInpMult)(number &a, number b, const coeffs r)
Inplace: a *= b.
Definition: coeffs.h:277
numberfunc cfSub
Definition: coeffs.h:173
static void ndClearContent(ICoeffsEnumerator &numberCollectionEnumerator, number &c, const coeffs r)
Definition: numbers.cc:144
static number ndGetDenom(number &, const coeffs r)
Definition: numbers.cc:139
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
static int ndSize(number a, const coeffs r)
Definition: numbers.cc:141
int ref
Definition: coeffs.h:124
void(* cfPower)(number a, int i, number *result, const coeffs r)
Definition: coeffs.h:235
nCoeffsEnumeratorFunc cfClearContent
function pointer behind n_ClearContent
Definition: coeffs.h:305
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
n_Procs_s * cf_root
Definition: numbers.cc:47
numberfunc cfExactDiv
Definition: coeffs.h:173
static BOOLEAN ndCoeffIsEqual(const coeffs r, n_coeffType n, void *)
Definition: numbers.cc:275
n_coeffType type
Definition: coeffs.h:126
static CanonicalForm ndConvSingNFactoryN(number, BOOLEAN, const coeffs)
Definition: numbers.cc:249
numberfunc cfDiv
Definition: coeffs.h:173
const char *(* cfRead)(const char *s, number *a, const coeffs r)
Definition: coeffs.h:219
numberfunc cfMult
Definition: coeffs.h:173
static number ndGcd(number, number, const coeffs r)
Definition: numbers.cc:137
static number ndExtGcd(number, number, number *, number *, const coeffs r)
Definition: numbers.cc:246
static cfInitCharProc * nInitCharTable
Definition: numbers.cc:312
#define NULL
Definition: omList.c:10
number(* cfGcd)(number a, number b, const coeffs r)
Definition: coeffs.h:242
static void ndSetChar(const coeffs)
Definition: numbers.cc:238
number(* cfLcm)(number a, number b, const coeffs r)
Definition: coeffs.h:266
static void ndInpAdd(number &a, number b, const coeffs r)
Definition: numbers.cc:65
number(* convFactoryNSingN)(const CanonicalForm n, const coeffs r)
conversion to CanonicalForm(factory) to number
Definition: coeffs.h:311
static number ndGetNumerator(number &a, const coeffs r)
Definition: numbers.cc:140
static number ndAnn(number, const coeffs)
Definition: numbers.cc:53
static number ndIntMod(number, number, const coeffs r)
Definition: numbers.cc:138
static number ndFarey(number, number, const coeffs r)
Definition: numbers.cc:98
static void ndClearDenominators(ICoeffsEnumerator &, number &d, const coeffs r)
Definition: numbers.cc:218
nMapFunc(* cfSetMap)(const coeffs src, const coeffs dst)
Definition: coeffs.h:271
char *(* cfCoeffName)(const coeffs r)
default name of cf, should substitue cfCoeffWrite, cfCoeffString
Definition: coeffs.h:152
int(* cfSize)(number n, const coeffs r)
how complicated, (0) => 0, or positive
Definition: coeffs.h:182
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
BOOLEAN(*)(*)(*)(*)(*) cfIsMOne(number a, const coeffs r)
Definition: coeffs.h:228
CanonicalForm(* convSingNFactoryN)(number n, BOOLEAN setChar, const coeffs r)
Definition: coeffs.h:312
void(* cfKillChar)(coeffs r)
Definition: coeffs.h:157
int BOOLEAN
Definition: auxiliary.h:131
static void ndMPZ(mpz_t result, number &n, const coeffs r)
Converts a non-negative bigint number into a GMP number.
Definition: numbers.cc:264
void Werror(const char *fmt,...)
Definition: reporter.cc:199
void(* cfInpAdd)(number &a, number b, const coeffs r)
Inplace: a += b.
Definition: coeffs.h:280
number(* cfGetNumerator)(number &n, const coeffs r)
Definition: coeffs.h:237
#define omAlloc0(size)
Definition: omAllocDecl.h:211
int iNumberOfParameters
Number of Parameters in the coeffs (default 0)
Definition: coeffs.h:319
number(* cfGetDenom)(number &n, const coeffs r)
Definition: coeffs.h:236
BOOLEAN(*)(*)(*) cfIsZero(number a, const coeffs r)
Definition: coeffs.h:226
BOOLEAN(*)(*) cfEqual(number a, number b, const coeffs r)
tests
Definition: coeffs.h:225
nCoeffsEnumeratorFunc cfClearDenominators
function pointer behind n_ClearDenominators
Definition: coeffs.h:308
#define Warn
Definition: emacs.cc:80
int(* cfParDeg)(number x, const coeffs r)
degree for coeffcients: -1 for 0, 0 for "constants", ...
Definition: coeffs.h:296
void nKillChar ( coeffs  r)

undo all initialisations

Definition at line 477 of file numbers.cc.

479 {
481  if (r!=NULL)
482  {
483  r->ref--;
484  if (r->ref<=0)
485  {
486  n_Procs_s tmp;
487  n_Procs_s* n=&tmp;
488  tmp.next=cf_root;
489  while((n->next!=NULL) && (n->next!=r)) n=n->next;
490  if (n->next==r)
491  {
492  n->next=n->next->next;
493  if (cf_root==r) cf_root=n->next;
494  n_Delete(&(r->nNULL),r);
495  assume (r->cfKillChar!=NULL); r->cfKillChar(r); // STATISTIC(nKillChar);
496  omFreeSize((void *)r, sizeof(n_Procs_s));
497  r=NULL;
498  }
499  else
500  {
501  WarnS("cf_root list destroyed");
502  }
503  }
504  }
#define STATISTIC(f)
Definition: numstats.h:16
coeffs next
Definition: coeffs.h:123
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
#define WarnS
Definition: emacs.cc:81
void nKillChar(coeffs r)
undo all initialisations
Definition: numbers.cc:477
#define assume(x)
Definition: mod2.h:405
n_Procs_s * cf_root
Definition: numbers.cc:47
#define NULL
Definition: omList.c:10
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
void nNew ( number *  d)

Definition at line 49 of file numbers.cc.

49 { *d=NULL; }
#define NULL
Definition: omList.c:10
n_coeffType nRegister ( n_coeffType  n,
cfInitCharProc  p 
)

Definition at line 507 of file numbers.cc.

509 {
510  if (n==n_unknown)
511  {
514  {
516  ((int)nLastCoeffs+1)*sizeof(cfInitCharProc));
518  ((int)nLastCoeffs)*sizeof(cfInitCharProc));
519  }
520  else
521  {
523  ((int)nLastCoeffs)*sizeof(cfInitCharProc),
524  (((int)nLastCoeffs)+1)*sizeof(cfInitCharProc));
525  }
526 
528  return nLastCoeffs;
529  }
530  else
531  {
532  if (nInitCharTable[n]!=NULL) Print("coeff %d already initialized\n",n);
533  nInitCharTable[n]=p;
534  return n;
535  }
#define Print
Definition: emacs.cc:83
return P p
Definition: myNF.cc:203
static n_coeffType nLastCoeffs
Definition: numbers.cc:282
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
#define omReallocSize(addr, o_size, size)
Definition: omAllocDecl.h:220
BOOLEAN(* cfInitCharProc)(coeffs, void *)
initialize an object of type coeff, return FALSE in case of success
Definition: numbers.h:89
cfInitCharProc nInitCharTableDefault[]
Definition: numbers.cc:283
n_coeffType
Definition: coeffs.h:26
static cfInitCharProc * nInitCharTable
Definition: numbers.cc:312
#define NULL
Definition: omList.c:10
#define omAlloc0(size)
Definition: omAllocDecl.h:211

Variable Documentation

n_Procs_s* cf_root =NULL

Definition at line 47 of file numbers.cc.

cfInitCharProc* nInitCharTable =nInitCharTableDefault
static

Definition at line 312 of file numbers.cc.

cfInitCharProc nInitCharTableDefault[]
Initial value:
=
{ NULL,
}
BOOLEAN nrInitChar(coeffs n, void *p)
Initialize r.
Definition: shortfl.cc:733
BOOLEAN naInitChar(coeffs cf, void *infoStruct)
Initialize the coeffs object.
Definition: algext.cc:1389
BOOLEAN nr2mInitChar(coeffs r, void *p)
Definition: rmodulo2m.cc:160
BOOLEAN npInitChar(coeffs r, void *p)
Definition: modulop.cc:500
BOOLEAN nlInitChar(coeffs r, void *p)
Definition: longrat.cc:3121
BOOLEAN ngcInitChar(coeffs n, void *parameter)
Initialize r (n_long_C)
Definition: gnumpc.cc:464
BOOLEAN nrnInitChar(coeffs r, void *p)
Definition: rmodulon.cc:163
BOOLEAN nrzInitChar(coeffs r, void *)
Definition: rintegers.cc:482
BOOLEAN nfInitChar(coeffs r, void *parameter)
Definition: ffields.cc:836
#define NULL
Definition: omList.c:10
BOOLEAN ngfInitChar(coeffs n, void *parameter)
Initialize r.
Definition: gnumpfl.cc:443
BOOLEAN ntInitChar(coeffs cf, void *infoStruct)
Initialize the coeffs object.
Definition: transext.cc:2370

Definition at line 283 of file numbers.cc.

n_coeffType nLastCoeffs =n_CF
static

Definition at line 282 of file numbers.cc.