source: git/libpolys/coeffs/coeffs.h @ 0afa07

spielwiese
Last change on this file since 0afa07 was 0afa07, checked in by Frank Seelisch <seelisch@…>, 13 years ago
removed cfPar, cfParDeg, n_Par, n_ParDeg, ndPar, ndParDeg from coeffs
  • Property mode set to 100644
File size: 19.8 KB
Line 
1#ifndef COEFFS_H
2#define COEFFS_H
3/****************************************
4*  Computer Algebra System SINGULAR     *
5****************************************/
6/* $Id$ */
7/*
8* ABSTRACT
9*/
10
11#include <misc/auxiliary.h>
12/* for assume: */
13#include <reporter/reporter.h>
14
15#include <coeffs/si_gmp.h>
16
17#ifdef HAVE_FACTORY
18class CanonicalForm;
19#endif
20
21enum n_coeffType
22{
23  n_unknown=0,
24  n_Zp,
25  n_Q,
26  n_R,
27  n_GF,
28  n_long_R,
29  n_algExt,  /**< used for all algebraic extensions, i.e.,
30                the top-most extension in an extension tower
31                is algebraic */
32  n_transExt,  /**< used for all transcendental extensions, i.e.,
33                  the top-most extension in an extension tower
34                  is transcendental */
35  n_long_C,
36  // only used if HAVE_RINGS is defined:
37  n_Z,
38  n_Zn,
39  n_Zpn, // does no longer exist?
40  n_Z2m,
41  n_CF
42};
43
44struct snumber;
45typedef struct snumber *   number;
46
47/* standard types */
48#ifdef HAVE_RINGS
49typedef unsigned long NATNUMBER;
50typedef mpz_ptr int_number;
51#endif
52
53struct ip_sring;
54typedef struct ip_sring *         ring;
55
56struct n_Procs_s;
57typedef struct  n_Procs_s  *coeffs;
58
59typedef number (*numberfunc)(number a, number b, const coeffs r);
60
61/// maps "a", which lives in src, into dst
62typedef number (*nMapFunc)(number a, const coeffs src, const coeffs dst);
63
64struct n_Procs_s
65{
66   coeffs next;
67   unsigned int ringtype;  /* =0 => coefficient field,
68                             !=0 => coeffs from one of the rings:
69                              =1 => Z/2^mZ
70                              =2 => Z/nZ, n not a prime
71                              =3 => Z/p^mZ
72                              =4 => Z */
73
74   // general properties:
75   /// TRUE, if nNew/nDelete/nCopy are dummies
76   BOOLEAN has_simple_Alloc;
77   /// TRUE, if std should make polynomials monic (if nInvers is cheap)
78   /// if false, then a gcd routine is used for a content computation
79   BOOLEAN has_simple_Inverse;
80
81   // tests for numbers.cc:
82   BOOLEAN (*nCoeffIsEqual)(const coeffs r, n_coeffType n, void * parameter);
83
84   /// output of coeff description via Print
85   void (*cfCoeffWrite)(const coeffs r);
86
87   // the union stuff
88
89   // Zp:
90   int npPrimeM;
91   int npPminus1M;
92   #ifdef HAVE_DIV_MOD
93   unsigned short *npInvTable;
94   #endif
95   #if !defined(HAVE_DIV_MOD) || !defined(HAVE_MULT_MOD)
96   unsigned short *npExpTable;
97   unsigned short *npLogTable;
98   #endif
99
100   // ?
101   // initialisation:
102   //void (*cfInitChar)(coeffs r, int parameter); // do one-time initialisations
103   void (*cfKillChar)(coeffs r); //  undo all initialisations
104                                // or NULL
105   void (*cfSetChar)(const coeffs r); // initialisations after each ring change
106                                // or NULL
107   // general stuff
108   numberfunc cfMult, cfSub ,cfAdd ,cfDiv, cfIntDiv, cfIntMod, cfExactDiv;
109   /// init with an integer
110   number  (*cfInit)(int i,const coeffs r);
111   /// how complicated, (0) => 0, or positive
112   int     (*cfSize)(number n, const coeffs r);
113   /// convertion, 0 if impossible
114   int     (*cfInt)(number &n, const coeffs r);
115
116#ifdef HAVE_RINGS
117   int     (*cfDivComp)(number a,number b,const coeffs r);
118   BOOLEAN (*cfIsUnit)(number a,const coeffs r);
119   number  (*cfGetUnit)(number a,const coeffs r);
120   number  (*cfExtGcd)(number a, number b, number *s, number *t,const coeffs r);
121#endif
122
123   /// changes argument  inline: a:= -a
124   number  (*cfNeg)(number a, const coeffs r);
125   /// return 1/a
126   number  (*cfInvers)(number a, const coeffs r);
127   /// return a copy of a
128   number  (*cfCopy)(number a, const coeffs r);
129   number  (*cfRePart)(number a, const coeffs r);
130   number  (*cfImPart)(number a, const coeffs r);
131   void    (*cfWrite)(number &a, const coeffs r);
132   const char *  (*cfRead)(const char * s, number * a, const coeffs r);
133   void    (*cfNormalize)(number &a, const coeffs r);
134   BOOLEAN (*cfGreater)(number a,number b, const coeffs r),
135#ifdef HAVE_RINGS
136           (*cfDivBy)(number a, number b, const coeffs r),
137#endif
138            /// tests
139           (*cfEqual)(number a,number b, const coeffs r),
140           (*cfIsZero)(number a, const coeffs r),
141           (*cfIsOne)(number a, const coeffs r),
142           (*cfIsMOne)(number a, const coeffs r),
143           (*cfGreaterZero)(number a, const coeffs r);
144
145   void    (*cfPower)(number a, int i, number * result, const coeffs r);
146   number  (*cfGetDenom)(number &n, const coeffs r);
147   number  (*cfGetNumerator)(number &n, const coeffs r);
148   number  (*cfGcd)(number a, number b, const coeffs r);
149   number  (*cfLcm)(number a, number b, const coeffs r);
150   void    (*cfDelete)(number * a, const coeffs r);
151   nMapFunc (*cfSetMap)(const coeffs src, const coeffs dst);
152
153   /// For extensions (writes into global string buffer)
154   char *  (*cfName)(number n, const coeffs r);
155
156   /// Inplace: a *= b
157   void    (*cfInpMult)(number &a, number b, const coeffs r);
158   /// maps the bigint i (from dummy) into the coeffs dst
159   number  (*cfInit_bigint)(number i, const coeffs dummy, const coeffs dst);
160
161#ifdef HAVE_FACTORY
162   number (*convFactoryNSingN)( const CanonicalForm n, const coeffs r);
163   CanonicalForm (*convSingNFactoryN)( number n, BOOLEAN setChar, const coeffs r );
164#endif
165
166
167#ifdef LDEBUG
168   /// Test: is "a" a correct number?
169   BOOLEAN (*cfDBTest)(number a, const char *f, const int l, const coeffs r);
170#endif
171
172   number nNULL; /* the 0 as constant */
173   int     char_flag;
174   int     ref;
175   n_coeffType type;
176//-------------------------------------------
177
178  /* for extension fields we need to be able to represent polynomials,
179     so here is the polynomial ring: */
180  ring          extRing;
181
182  //number     minpoly;  //< no longer needed: replaced by
183  //                     //< extRing->minideal->[0]
184
185
186//-------------------------------------------
187  char* complex_parameter; //< the name of sqrt(-1), i.e. 'i' or 'j' etc...?
188
189#ifdef HAVE_RINGS
190  /* The following members are for representing the ring Z/n,
191     where n is not a prime. We distinguish four cases:
192     1.) n has at least two distinct prime factors. Then
193         modBase stores n, modExponent stores 1, modNumber
194         stores n, and mod2mMask is not used;
195     2.) n = p^k for some odd prime p and k > 1. Then
196         modBase stores p, modExponent stores k, modNumber
197         stores n, and mod2mMask is not used;
198     3.) n = 2^k for some k > 1; moreover, 2^k - 1 fits in
199         an unsigned long. Then modBase stores 2, modExponent
200         stores k, modNumber is not used, and mod2mMask stores
201         2^k - 1, i.e., the bit mask '111..1' of length k.
202     4.) n = 2^k for some k > 1; but 2^k - 1 does not fit in
203         an unsigned long. Then modBase stores 2, modExponent
204         stores k, modNumber stores n, and mod2mMask is not
205         used;
206     Cases 1.), 2.), and 4.) are covered by the implementation
207     in the files rmodulon.h and rmodulon.cc, whereas case 3.)
208     is implemented in the files rmodulo2m.h and rmodulo2m.cc. */
209  int_number    modBase;
210  unsigned long modExponent;
211  int_number    modNumber;
212  unsigned long mod2mMask;
213#endif
214  int        ch;  /* characteristic, set by the local *InitChar methods;
215                     In field extensions or extensions towers, the
216                     characteristic can be accessed from any of the
217                     intermediate extension fields, i.e., in this case
218                     it is redundant along the chain of field extensions;
219                     CONTRARY to SINGULAR as it was, we do NO LONGER use
220                     negative values for ch;
221                     for rings, ch will also be set and is - per def -
222                     the smallest number of 1's that sum up to zero;
223                     however, in this case ch may not fit in an int,
224                     thus ch may contain a faulty value */
225
226  short      float_len; /* additional char-flags, rInit */
227  short      float_len2; /* additional char-flags, rInit */
228
229  BOOLEAN   ShortOut; /// ffields need this.
230
231// ---------------------------------------------------
232  // for n_GF
233
234  int m_nfCharQ;  ///< the number of elements: q
235  int m_nfM1;       ///< representation of -1
236  int m_nfCharP;  ///< the characteristic: p
237  int m_nfCharQ1; ///< q-1
238  unsigned short *m_nfPlus1Table;
239  int *m_nfMinPoly;
240  char * m_nfParameter;
241};
242//
243// test properties and type
244/// Returns the type of coeffs domain
245static inline n_coeffType getCoeffType(const coeffs r)
246{
247  assume(r != NULL);
248  return r->type;
249}
250
251static inline int nInternalChar(const coeffs r)
252{
253  assume(r != NULL);
254  return r->ch;
255}
256
257/// one-time initialisations for new coeffs
258/// in case of an error return NULL
259coeffs nInitChar(n_coeffType t, void * parameter);
260
261/// undo all initialisations
262void nKillChar(coeffs r);
263
264/// initialisations after each ring change
265static inline void nSetChar(const coeffs r)
266{
267  assume(r!=NULL); // r==NULL is an error
268  if (r->cfSetChar!=NULL) r->cfSetChar(r);
269}
270
271void           nNew(number * a);
272#define n_New(n, r)           nNew(n)
273
274
275// the access methods (part 2):
276
277/// return a copy of a
278static inline number n_Copy(number n,    const coeffs r)
279{   assume(r != NULL); assume(r->cfCopy!=NULL); return r->cfCopy(n, r); }
280
281static inline void   n_Delete(number* p, const coeffs r)
282{   assume(r != NULL); assume(r->cfDelete!= NULL); r->cfDelete(p, r); }
283
284static inline BOOLEAN n_Equal(number a, number b, const coeffs r)
285{ assume(r != NULL); assume(r->cfEqual!=NULL); return r->cfEqual(a, b, r); }
286
287static inline BOOLEAN n_IsZero(number n, const coeffs r)
288{ assume(r != NULL); assume(r->cfIsZero!=NULL); return r->cfIsZero(n,r); }
289
290static inline BOOLEAN n_IsOne(number n,  const coeffs r)
291{ assume(r != NULL); assume(r->cfIsOne!=NULL); return r->cfIsOne(n,r); }
292
293static inline BOOLEAN n_IsMOne(number n, const coeffs r)
294{ assume(r != NULL); assume(r->cfIsMOne!=NULL); return r->cfIsMOne(n,r); }
295
296static inline BOOLEAN n_GreaterZero(number n, const coeffs r)
297{ assume(r != NULL); assume(r->cfGreaterZero!=NULL); return r->cfGreaterZero(n,r); }
298static inline BOOLEAN n_Greater(number a, number b, const coeffs r)
299{ assume(r != NULL); assume(r->cfGreater!=NULL); return r->cfGreater(a,b,r); }
300
301#ifdef HAVE_RINGS
302static inline BOOLEAN n_IsUnit(number n, const coeffs r)
303{ assume(r != NULL); assume(r->cfIsUnit!=NULL); return r->cfIsUnit(n,r); }
304
305static inline number n_GetUnit(number n, const coeffs r)
306{ assume(r != NULL); assume(r->cfGetUnit!=NULL); return r->cfGetUnit(n,r); }
307#endif
308
309/// init with an integer
310static inline number n_Init(int i,       const coeffs r)
311{ assume(r != NULL); assume(r->cfInit!=NULL); return r->cfInit(i,r); }
312
313/// conversion to int; 0 if not possible
314static inline int n_Int(number &n,       const coeffs r)
315{ assume(r != NULL); assume(r->cfInt!=NULL); return r->cfInt(n,r); }
316
317/// changes argument  inline: a:= -a
318static inline number n_Neg(number n,     const coeffs r)
319{ assume(r != NULL); assume(r->cfNeg!=NULL); return r->cfNeg(n,r); }
320
321/// return 1/a
322static inline number n_Invers(number a,  const coeffs r)
323{ assume(r != NULL); assume(r->cfInvers!=NULL); return r->cfInvers(a,r); }
324
325/// use for pivot strategies, (0) => 0, otherwise positive
326static inline int    n_Size(number n,    const coeffs r)
327{ assume(r != NULL); assume(r->cfSize!=NULL); return r->cfSize(n,r); }
328
329/// normalize the number. i.e. go to some canonnical representation (inplace)
330static inline void   n_Normalize(number& n, const coeffs r)
331{ assume(r != NULL); assume(r->cfNormalize!=NULL); r->cfNormalize(n,r); }
332
333/// Normalize and Write to the output buffer of reporter
334static inline void   n_Write(number& n,  const coeffs r)
335{ assume(r != NULL); assume(r->cfWrite!=NULL); r->cfWrite(n,r); }
336
337/// @todo: Describe me!!!
338static inline const char *n_Read(const char * s, number * a, const coeffs r)
339{ assume(r != NULL); assume(r->cfRead!=NULL); return r->cfRead(s, a, r); }
340
341/// Normalize and get denomerator
342static inline number n_GetDenom(number& n, const coeffs r)
343{ assume(r != NULL); assume(r->cfGetDenom!=NULL); return r->cfGetDenom(n, r); }
344
345/// Normalize and get numerator
346static inline number n_GetNumerator(number& n, const coeffs r)
347{ assume(r != NULL); assume(r->cfGetNumerator!=NULL); return r->cfGetNumerator(n, r); }
348
349static inline void   n_Power(number a, int b, number *res, const coeffs r)
350{ assume(r != NULL); assume(r->cfPower!=NULL); r->cfPower(a,b,res,r); }
351
352static inline number n_Mult(number a, number b, const coeffs r)
353{ assume(r != NULL); assume(r->cfMult!=NULL); return r->cfMult(a, b, r); }
354
355/// Inplace multiplication: a := a * b
356static inline void n_InpMult(number &a, number b, const coeffs r)
357{ assume(r != NULL); assume(r->cfInpMult!=NULL); r->cfInpMult(a,b,r); }
358
359static inline number n_Sub(number a, number b, const coeffs r)
360{ assume(r != NULL); assume(r->cfSub!=NULL); return r->cfSub(a, b, r); }
361
362static inline number n_Add(number a, number b, const coeffs r)
363{ assume(r != NULL); assume(r->cfAdd!=NULL); return r->cfAdd(a, b, r); }
364
365static inline number n_Div(number a, number b, const coeffs r)
366{ assume(r != NULL); assume(r->cfDiv!=NULL); return r->cfDiv(a,b,r); }
367
368static inline number n_IntDiv(number a, number b, const coeffs r)
369{ assume(r != NULL); assume(r->cfIntDiv!=NULL); return r->cfIntDiv(a,b,r); }
370
371static inline number n_ExactDiv(number a, number b, const coeffs r)
372{ assume(r != NULL); assume(r->cfExactDiv!=NULL); return r->cfExactDiv(a,b,r); }
373
374static inline number n_Gcd(number a, number b, const coeffs r)
375{ assume(r != NULL); assume(r->cfGcd!=NULL); return r->cfGcd(a,b,r); }
376
377static inline number n_Lcm(number a, number b, const coeffs r)
378{ assume(r != NULL); assume(r->cfLcm!=NULL); return r->cfLcm(a,b,r); }
379
380static inline nMapFunc n_SetMap(const coeffs src, const coeffs dst)
381{ assume(src != NULL && dst != NULL); assume(dst->cfSetMap!=NULL); return dst->cfSetMap(src,dst); }
382
383/// Tests whether n is a correct number: only used if LDEBUG is defined
384static inline BOOLEAN n_DBTest(number n, const char *filename, const int linenumber, const coeffs r)
385{
386  assume(r != NULL); 
387#ifdef LDEBUG
388  assume(r->cfDBTest != NULL); 
389  return r->cfDBTest(n, filename, linenumber, r);
390#else
391  return TRUE;
392#endif
393}
394
395/// output the coeff description
396static inline void   n_CoeffWrite(const coeffs r)
397{ assume(r != NULL); assume(r->cfCoeffWrite != NULL); r->cfCoeffWrite(r); }
398
399// Tests:
400static inline BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
401{ assume(r != NULL); return (r->ringtype == 1); }
402
403static inline BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
404{ assume(r != NULL); return (r->ringtype == 2); }
405
406static inline BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
407{ assume(r != NULL); return (r->ringtype == 3); }
408
409static inline BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
410{ assume(r != NULL); return (r->ringtype == 4); }
411
412static inline BOOLEAN nCoeff_is_Ring(const coeffs r)
413{ assume(r != NULL); return (r->ringtype != 0); }
414
415/// returns TRUE, if r is not a field and r has no zero divisors (i.e is a domain)
416static inline BOOLEAN nCoeff_is_Domain(const coeffs r)
417{
418  assume(r != NULL); 
419#ifdef HAVE_RINGS
420  return (r->ringtype == 4 || r->ringtype == 0);
421#else
422  return TRUE;
423#endif
424}
425
426/// Test whether a can be divided by b?
427static inline BOOLEAN n_DivBy(number a, number b, const coeffs r)
428{
429  assume(r != NULL);
430#ifdef HAVE_RINGS
431  if( nCoeff_is_Ring(r) )
432  {
433    assume(r->cfDivBy!=NULL); return r->cfDivBy(a,b,r);
434  }
435#endif
436  return !n_IsZero(b, r);
437}
438
439/// returns TRUE, if r is not a field and r has non-trivial units
440static inline BOOLEAN nCoeff_has_Units(const coeffs r)
441{ assume(r != NULL); return ((r->ringtype == 1) || (r->ringtype == 2) || (r->ringtype == 3)); }
442
443static inline BOOLEAN nCoeff_is_Zp(const coeffs r)
444{ assume(r != NULL); return getCoeffType(r)==n_Zp; }
445
446static inline BOOLEAN nCoeff_is_Zp(const coeffs r, int p)
447{ assume(r != NULL); return (getCoeffType(r)  && (r->ch == p)); }
448
449static inline BOOLEAN nCoeff_is_Q(const coeffs r)
450{ assume(r != NULL); return getCoeffType(r)==n_Q; }
451
452static inline BOOLEAN nCoeff_is_numeric(const coeffs r) /* R, long R, long C */
453{ assume(r != NULL);  return (getCoeffType(r)==n_R) || (getCoeffType(r)==n_long_R) || (getCoeffType(r)==n_long_C); }
454// (r->ringtype == 0) && (r->ch ==  -1); ??
455
456static inline BOOLEAN nCoeff_is_R(const coeffs r)
457{ assume(r != NULL); return getCoeffType(r)==n_R; }
458
459static inline BOOLEAN nCoeff_is_GF(const coeffs r)
460{ assume(r != NULL); return getCoeffType(r)==n_GF; }
461
462static inline BOOLEAN nCoeff_is_GF(const coeffs r, int q)
463{ assume(r != NULL); return (getCoeffType(r)==n_GF) && (r->ch == q); }
464
465/* TRUE iff r represents an algebraic or transcendental extension field */
466static inline BOOLEAN nCoeff_is_Extension(const coeffs r)
467{
468  assume(r != NULL);
469  return (getCoeffType(r)==n_algExt) || (getCoeffType(r)==n_transExt);
470}
471
472/* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
473   svn trunk);
474   intension: should be TRUE iff the given r is an extension field above
475   some Z/pZ;
476   actually: TRUE iff the given r is an extension tower of arbitrary
477   height above some field of characteristic p (may be Z/pZ or some
478   Galois field of characteristic p) */
479static inline BOOLEAN nCoeff_is_Zp_a(const coeffs r)
480{
481  assume(r != NULL);
482  return ((r->ringtype == 0) && (r->ch != 0) && nCoeff_is_Extension(r));
483}
484
485/* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
486   svn trunk);
487   intension: should be TRUE iff the given r is an extension field above
488   Z/pZ (with p as provided);
489   actually: TRUE iff the given r is an extension tower of arbitrary
490   height above some field of characteristic p (may be Z/pZ or some
491   Galois field of characteristic p) */
492static inline BOOLEAN nCoeff_is_Zp_a(const coeffs r, int p)
493{
494  assume(r != NULL);
495  return ((r->ringtype == 0) && (r->ch == p) && nCoeff_is_Extension(r));
496}
497
498/* DO NOT USE (only kept for compatibility reasons towards the SINGULAR
499   svn trunk);
500   intension: should be TRUE iff the given r is an extension field
501   above Q;
502   actually: TRUE iff the given r is an extension tower of arbitrary
503   height above some field of characteristic 0 (may be Q, R, or C) */
504static inline BOOLEAN nCoeff_is_Q_a(const coeffs r)
505{
506  assume(r != NULL);
507  return ((r->ringtype == 0) && (r->ch == 0) && nCoeff_is_Extension(r));
508}
509
510static inline BOOLEAN nCoeff_is_long_R(const coeffs r)
511{ assume(r != NULL); return getCoeffType(r)==n_long_R; }
512
513static inline BOOLEAN nCoeff_is_long_C(const coeffs r)
514{ assume(r != NULL); return getCoeffType(r)==n_long_C; }
515
516static inline BOOLEAN nCoeff_is_CF(const coeffs r)
517{ assume(r != NULL); return getCoeffType(r)==n_CF; }
518
519/// TRUE, if the computation of the inverse is fast (i.e. prefer leading coeff. 1 over content)
520static inline BOOLEAN nCoeff_has_simple_inverse(const coeffs r)
521{ assume(r != NULL); return r->has_simple_Inverse; }
522/* Z/2^n, Z/p, GF(p,n), R, long_R, long_C*/
523// /* { return (r->ch>1) || (r->ch== -1); } *//* Z/p, GF(p,n), R, long_R, long_C*/
524// #ifdef HAVE_RINGS
525// { return (r->ringtype > 0) || (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/2^n, Z/p, GF(p,n), R, long_R, long_C*/
526// #else
527// { return (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/p, GF(p,n), R, long_R, long_C*/
528// #endif
529
530/// TRUE if n_Delete/n_New are empty operations
531static inline BOOLEAN nCoeff_has_simple_Alloc(const coeffs r)
532{ assume(r != NULL); return r->has_simple_Alloc; }
533/* Z/p, GF(p,n), R, Ring_2toM: nCopy, nNew, nDelete are dummies*/
534// return (rField_is_Zp(r)
535//         || rField_is_GF(r)
536// #ifdef HAVE_RINGS
537//             || rField_is_Ring_2toM(r)
538// #endif
539//             || rField_is_R(r)); }
540
541/* TRUE iff r represents an algebraic extension field */
542static inline BOOLEAN nCoeff_is_algExt(const coeffs r)
543{ assume(r != NULL); return (getCoeffType(r)==n_algExt); }
544
545/* TRUE iff r represents a transcendental extension field */
546static inline BOOLEAN nCoeff_is_transExt(const coeffs r)
547{ assume(r != NULL); return (getCoeffType(r)==n_transExt); }
548
549/// BOOLEAN n_Test(number a, const coeffs r)
550#define n_Test(a,r)  n_DBTest(a, __FILE__, __LINE__, r)
551
552// Missing wrappers for: (TODO: review this?)
553// cfIntMod, cfRePart, cfImPart, cfRead, cfName, cfInit_bigint
554// HAVE_RINGS: cfDivComp, cfExtGcd...
555
556
557
558// Deprecated:
559static inline int n_GetChar(const coeffs r)
560{ assume(r != NULL); return nInternalChar(r); }
561
562#endif
563
Note: See TracBrowser for help on using the repository browser.