source: git/kernel/numbers.cc @ 098f98f

spielwiese
Last change on this file since 098f98f was 493225, checked in by Hans Schönemann <hannes@…>, 14 years ago
nWrite indep. from currRing git-svn-id: file:///usr/local/Singular/svn/trunk@12377 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 18.5 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id$ */
5
6/*
7* ABSTRACT: interface to coefficient aritmetics
8*/
9
10#include <string.h>
11#include <stdlib.h>
12#include "mod2.h"
13#include "structs.h"
14#include "febase.h"
15#include "kstd1.h"
16#include "numbers.h"
17#include "longrat.h"
18#include "longalg.h"
19#include "modulop.h"
20#include "gnumpfl.h"
21#include "gnumpc.h"
22#include "ring.h"
23#include "ffields.h"
24#include "shortfl.h"
25#ifdef HAVE_RINGS
26#include "rmodulo2m.h"
27#include "rmodulon.h"
28#include "rintegers.h"
29
30extern omBin gmp_nrz_bin;
31#endif
32
33//static int characteristic = 0;
34extern int IsPrime(int p);
35
36number  (*nInit_bigint)(number i);
37number (*nPar)(int i);
38int    (*nParDeg)(number n);
39int    (*nSize)(number n);
40int    (*n_Int)(number &n, const ring r);
41numberfunc nMult, nSub, nAdd, nDiv, nIntDiv, nIntMod, nExactDiv;
42number (*nNeg)(number a);
43number (*nInvers)(number a);
44void   (*nNormalize)(number &a);
45number (*nCopy)(number a);
46number (*nRePart)(number a);
47number (*nImPart)(number a);
48#ifdef HAVE_RINGS
49BOOLEAN (*nDivBy)(number a,number b);
50int     (*nDivComp)(number a,number b);
51BOOLEAN (*nIsUnit)(number a);
52number  (*nGetUnit)(number a);
53number  (*nExtGcd)(number a, number b, number *s, number *t);
54#endif
55BOOLEAN (*nGreater)(number a,number b);
56BOOLEAN (*nEqual)(number a,number b);
57BOOLEAN (*nIsZero)(number a);
58BOOLEAN (*nIsOne)(number a);
59BOOLEAN (*nIsMOne)(number a);
60BOOLEAN (*nGreaterZero)(number a);
61const char* (*nRead)(const char *s,number *a);
62void    (*nPower)(number a, int i, number * result);
63number  (*nGcd)(number a, number b, const ring r);
64number  (*nLcm)(number a, number b, const ring r);
65char * (*nName)(number n);
66
67/*0 implementation*/
68number nNULL; /* the 0 as constant */
69
70n_Procs_s *cf_root=NULL;
71
72void   nNew(number* d) { *d=NULL; }
73void   ndDelete(number* d, const ring r) { *d=NULL; }
74void   ndInpMult(number &a, number b, const ring r)
75{
76  number n=n_Mult(a,b,r);
77  n_Delete(&a,r);
78  a=n;
79}
80number ndInpAdd(number &a, number b, const ring r)
81{
82  number n=n_Add(a,b,r);
83  n_Delete(&a,r);
84  a=n;
85  return a;
86}
87
88#ifdef LDEBUG
89void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
90BOOLEAN ndDBTest(number a, const char *f, const int l)
91{
92  return TRUE;
93}
94#endif
95
96void   nDummy2(number& d) { }
97
98char * ndName(number n) { return NULL; }
99
100number ndPar(int i) { return nInit(0); }
101
102number ndReturn0(number n) { return nInit(0); }
103
104int    ndParDeg(number n) { return 0; }
105
106number ndGcd(number a, number b, const ring r) { return n_Init(1,r); }
107
108number ndIntMod(number a, number b) { return nInit(0); }
109
110number ndGetDenom(number &n, const ring r) { return n_Init(1,r); }
111number ndGetNumerator(number &a,const ring r) { return r->cf->nCopy(a); }
112
113int ndSize(number a) { return (int)nIsZero(a)==FALSE; }
114
115number ndCopy(number a) { return a; }
116number nd_Copy(number a,const ring r) { return r->cf->nCopy(a); }
117
118#ifdef HAVE_RINGS
119BOOLEAN ndDivBy(number a, number b) { return TRUE; } // assume a,b !=0
120int ndDivComp(number a, number b) { return 0; }
121BOOLEAN ndIsUnit(number a) { return !nIsZero(a); }
122number  ndExtGcd (number a, number b, number *s, number *t) { return nInit(1); }
123#endif
124
125/*2
126* init operations for characteristic c (complete==TRUE)
127* init nDelete    for characteristic c (complete==FALSE)
128*/
129void nSetChar(ring r)
130{
131  int c=rInternalChar(r);
132
133  /*--------------------- Q -----------------*/
134  if (rField_is_Q(r))
135  {
136    nInit_bigint=nlCopy;
137  }
138  /*--------------------- Q_a/ Zp_a -----------------*/
139  else if (rField_is_Extension(r))
140  {
141    naSetChar(c,r);
142    if (rField_is_Q_a()) nInit_bigint=naMap00;
143    if (rField_is_Zp_a()) nInit_bigint=naMap0P;
144  }
145#ifdef HAVE_RINGS
146  /*----------------------ring Z / 2^m----------------*/
147  else if (rField_is_Ring_2toM(r))
148  {
149    nr2mSetExp(c, r);
150    nInit_bigint=nr2mMapQ;
151  }
152  /*----------------------ring Z / 2^m----------------*/
153  else if (rField_is_Ring_Z(r))
154  {
155    nrzSetExp(c, r);
156    nInit_bigint=nrzMapQ;
157  }
158  /*----------------------ring Z / n----------------*/
159  else if (rField_is_Ring_ModN(r))
160  {
161    nrnSetExp(c, r);
162    nInit_bigint=nrnMapQ;
163  }
164  /*----------------------ring Z / n----------------*/
165  else if (rField_is_Ring_PtoM(r))
166  {
167    nrnSetExp(c, r);
168    nInit_bigint=nrnMapQ;
169  }
170#endif
171  else if (rField_is_Zp(r))
172  /*----------------------char. p----------------*/
173  {
174    npSetChar(c, r);
175    nInit_bigint=npMap0;
176  }
177  /* -------------- GF(p^m) -----------------------*/
178  else if (rField_is_GF(r))
179  {
180    nfSetChar(c,r->parameter);
181    nInit_bigint=ndReturn0; // not impl.
182  }
183  /* -------------- R -----------------------*/
184  //if (c==(-1))
185  else if (rField_is_R(r))
186  {
187    nInit_bigint=nrMapQ;
188  }
189  /* -------------- long R -----------------------*/
190  /* -------------- long C -----------------------*/
191  else if ((rField_is_long_R(r))
192  || (rField_is_long_C(r)))
193  {
194    setGMPFloatDigits(r->float_len,r->float_len2);
195    if (rField_is_long_R(r)) nInit_bigint=ngfMapQ;
196    else                     nInit_bigint=ngcMapQ;
197  }
198#ifdef TEST
199  /* -------------- R -----------------------*/
200  //if (c==(-1))
201  else if (!rField_is_R(r) && !rField_is_Q(r))
202  {
203    WerrorS("unknown field");
204  }
205#endif
206  nNormalize=r->cf->nNormalize;
207  nPar   = r->cf->nPar;
208  nParDeg= r->cf->nParDeg;
209  n_Int  = r->cf->n_Int;
210  nAdd   = r->cf->nAdd;
211  nSub   = r->cf->nSub;
212  nMult  = r->cf->nMult;
213  nDiv   = r->cf->nDiv;
214  nExactDiv= r->cf->nExactDiv;
215  nIntDiv= r->cf->nIntDiv;
216  nIntMod= r->cf->nIntMod;
217  nNeg   = r->cf->nNeg;
218  nInvers= r->cf->nInvers;
219  nCopy  = r->cf->nCopy;
220#ifdef HAVE_RINGS
221  nDivComp  = r->cf->nDivComp;
222  nDivBy = r->cf->nDivBy;
223  nIsUnit = r->cf->nIsUnit;
224  nGetUnit = r->cf->nGetUnit;
225  nExtGcd = r->cf->nExtGcd;
226#endif
227  nGreater = r->cf->nGreater;
228  nEqual = r->cf->nEqual;
229  nIsZero = r->cf->nIsZero;
230  nIsOne = r->cf->nIsOne;
231  nIsMOne = r->cf->nIsMOne;
232  nGreaterZero = r->cf->nGreaterZero;
233  nRead = r->cf->nRead;
234  nPower = r->cf->nPower;
235  nGcd  = r->cf->nGcd;
236  nLcm  = r->cf->nLcm;
237  nName= r->cf->nName;
238  nSize  = r->cf->nSize;
239  nRePart = r->cf->nRePart;
240  nImPart = r->cf->nImPart;
241  nNULL=r->cf->nNULL;
242}
243
244/*2
245* init operations for ring r
246*/
247void nInitChar(ring r)
248{
249  int c=rInternalChar(r);
250  n_coeffType t=rFieldType(r);
251
252  if (rField_is_Extension(r))
253  {
254    if (r->algring==NULL)
255    {
256      int ch=-c;
257      if (c==1) ch=0;
258      r->algring=(ring) rDefault(ch,r->P,r->parameter);
259      //r->algring->ShortOut=r->ShortOut;
260      // includes: nInitChar(r->algring);
261    }
262  }
263
264  n_Procs_s *n=cf_root;
265  while((n!=NULL)
266    && ((n->nChar!=c) || (n->type!=t)))
267      n=n->next;
268  if (n==NULL)
269  {
270    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
271    n->next=cf_root;
272    n->ref=1;
273    n->nChar=c;
274    n->type=t;
275    cf_root=n;
276  }
277  else if ((n->nChar==c) && (n->type==t))
278  {
279    n->ref++;
280    r->cf=n;
281    return;
282  }
283  else
284  {
285    WerrorS("nInitChar failed");
286    return;
287  }
288  r->cf=n;
289  n->nChar = c;
290  n->nPar  = ndPar;
291  n->nParDeg=ndParDeg;
292  n->nSize = ndSize;
293  n->cfGetDenom= ndGetDenom;
294  n->cfGetNumerator= ndGetNumerator;
295  n->nName =  ndName;
296  n->nImPart=ndReturn0;
297  n->cfDelete= ndDelete;
298  n->nInpMult=ndInpMult;
299  n->cfCopy=nd_Copy;
300  n->nIntMod=ndIntMod; /* dummy !! */
301  n->nNormalize=nDummy2;
302  n->nGcd  = ndGcd;
303  n->nLcm  = ndGcd; /* tricky, isn't it ?*/
304#ifdef HAVE_RINGS
305  n->nDivComp = ndDivComp;
306  n->nDivBy = ndDivBy;
307  n->nIsUnit = ndIsUnit;
308  n->nExtGcd = ndExtGcd;
309  n->nGetUnit = (nMapFunc)NULL;
310#endif
311  if (rField_is_Extension(r))
312  {
313    //naInitChar(c,TRUE,r);
314    n->cfDelete = naDelete;
315    n-> nNormalize = naNormalize;
316    n->cfInit      = naInit;
317    n->nPar        = naPar;
318    n->nParDeg     = naParDeg;
319    n->n_Int       = naInt;
320    n->nAdd        = naAdd;
321    n->nSub        = naSub;
322    n->nMult       = naMult;
323    n->nDiv        = naDiv;
324    n->nExactDiv   = naDiv;
325    n->nIntDiv     = naIntDiv;
326    n->nNeg        = naNeg;
327    n->nInvers     = naInvers;
328    n->nCopy       = naCopy;
329    n->cfCopy      = na_Copy;
330    n->nGreater    = naGreater;
331    n->nEqual      = naEqual;
332    n->nIsZero     = naIsZero;
333    n->nIsOne      = naIsOne;
334    n->nIsMOne     = naIsMOne;
335    n->nGreaterZero= naGreaterZero;
336    n->cfWrite     = naWrite;
337    n->nRead       = naRead;
338    n->nPower      = naPower;
339    n->nGcd        = naGcd;
340    n->nLcm        = naLcm;
341    n->cfSetMap    = naSetMap;
342    n->nName       = naName;
343    n->nSize       = naSize;
344    n->cfGetDenom   = naGetDenom;
345    n->cfGetNumerator= naGetNumerator;
346#ifdef LDEBUG
347    n->nDBTest     = naDBTest;
348#endif
349  }
350#ifdef HAVE_RINGS
351  /* -------------- Z/2^m ----------------------- */
352  else if (rField_is_Ring_2toM(r))
353  {
354     nr2mInitExp(c,r);
355     n->cfInit = nr2mInit;
356     n->nCopy  = ndCopy;
357     n->n_Int  = nr2mInt;
358     n->nAdd   = nr2mAdd;
359     n->nSub   = nr2mSub;
360     n->nMult  = nr2mMult;
361     n->nDiv   = nr2mDiv;
362     n->nIntDiv       = nr2mIntDiv;
363     n->nIntMod=nr2mMod;
364     n->nExactDiv= nr2mDiv;
365     n->nNeg   = nr2mNeg;
366     n->nInvers= nr2mInvers;
367     n->nDivBy = nr2mDivBy;
368     n->nDivComp = nr2mDivComp;
369     n->nGreater = nr2mGreater;
370     n->nEqual = nr2mEqual;
371     n->nIsZero = nr2mIsZero;
372     n->nIsOne = nr2mIsOne;
373     n->nIsMOne = nr2mIsMOne;
374     n->nGreaterZero = nr2mGreaterZero;
375     n->cfWrite = nr2mWrite;
376     n->nRead = nr2mRead;
377     n->nPower = nr2mPower;
378     n->cfSetMap = nr2mSetMap;
379     n->nNormalize = nDummy2;
380     n->nLcm          = nr2mLcm;
381     n->nGcd          = nr2mGcd;
382     n->nIsUnit = nr2mIsUnit;
383     n->nGetUnit = nr2mGetUnit;
384     n->nExtGcd = nr2mExtGcd;
385     n->nName= ndName;
386#ifdef LDEBUG
387     n->nDBTest=nr2mDBTest;
388#endif
389  }
390  /* -------------- Z/n ----------------------- */
391  else if (rField_is_Ring_ModN(r) || rField_is_Ring_PtoM(r)
392  )
393  {
394     nrnInitExp(c,r);
395     n->cfInit  = nrnInit;
396     n->cfDelete= nrnDelete;
397     n->nCopy  = nrnCopy;
398     n->cfCopy = cfrnCopy;
399     n->nSize  = nrnSize;
400     n->n_Int  = nrnInt;
401     n->nAdd   = nrnAdd;
402     n->nSub   = nrnSub;
403     n->nMult  = nrnMult;
404     n->nDiv   = nrnDiv;
405     n->nIntDiv= nrnIntDiv;
406     n->nIntMod= nrnMod;
407     n->nExactDiv= nrnDiv;
408     n->nNeg   = nrnNeg;
409     n->nInvers= nrnInvers;
410     n->nDivBy = nrnDivBy;
411     n->nDivComp = nrnDivComp;
412     n->nGreater = nrnGreater;
413     n->nEqual = nrnEqual;
414     n->nIsZero = nrnIsZero;
415     n->nIsOne = nrnIsOne;
416     n->nIsMOne = nrnIsMOne;
417     n->nGreaterZero = nrnGreaterZero;
418     n->cfWrite = nrnWrite;
419     n->nRead = nrnRead;
420     n->nPower = nrnPower;
421     n->cfSetMap = nrnSetMap;
422     n->nNormalize = nDummy2;
423     n->nLcm          = nrnLcm;
424     n->nGcd          = nrnGcd;
425     n->nIsUnit = nrnIsUnit;
426     n->nGetUnit = nrnGetUnit;
427     n->nExtGcd = nrnExtGcd;
428     n->nName= ndName;
429#ifdef LDEBUG
430     n->nDBTest=nrnDBTest;
431#endif
432  }
433  /* -------------- Z ----------------------- */
434  else if (rField_is_Ring_Z(r))
435  {
436     n->cfInit  = nrzInit;
437     n->cfDelete= nrzDelete;
438     n->nCopy  = nrzCopy;
439     n->cfCopy = cfrzCopy;
440     n->nSize  = nrzSize;
441     n->n_Int  = nrzInt;
442     n->nAdd   = nrzAdd;
443     n->nSub   = nrzSub;
444     n->nMult  = nrzMult;
445     n->nDiv   = nrzDiv;
446     n->nIntDiv = nrzIntDiv;
447     n->nIntMod = nrzIntMod;
448     n->nExactDiv= nrzDiv;
449     n->nNeg   = nrzNeg;
450     n->nInvers= nrzInvers;
451     n->nDivBy = nrzDivBy;
452     n->nDivComp = nrzDivComp;
453     n->nGreater = nrzGreater;
454     n->nEqual = nrzEqual;
455     n->nIsZero = nrzIsZero;
456     n->nIsOne = nrzIsOne;
457     n->nIsMOne = nrzIsMOne;
458     n->nGreaterZero = nrzGreaterZero;
459     n->cfWrite = nrzWrite;
460     n->nRead = nrzRead;
461     n->nPower = nrzPower;
462     n->cfSetMap = nrzSetMap;
463     n->nNormalize = nDummy2;
464     n->nLcm          = nrzLcm;
465     n->nGcd          = nrzGcd;
466     n->nIsUnit = nrzIsUnit;
467     n->nGetUnit = nrzGetUnit;
468     n->nExtGcd = nrzExtGcd;
469     n->nName= ndName;
470#ifdef LDEBUG
471     n->nDBTest=ndDBTest; // not yet implemented: nrzDBTest;
472#endif
473  }
474#endif
475  else if (rField_is_Q(r))
476  {
477    n->cfDelete= nlDelete;
478    n->nNormalize=nlNormalize;
479    n->cfInit = nlInit;
480    n->n_Int  = nlInt;
481    n->nAdd   = nlAdd;
482    n->nSub   = nlSub;
483    n->nMult  = nlMult;
484    n->nInpMult=nlInpMult;
485    n->nDiv   = nlDiv;
486    n->nExactDiv= nlExactDiv;
487    n->nIntDiv= nlIntDiv;
488    n->nIntMod= nlIntMod;
489    n->nNeg   = nlNeg;
490    n->nInvers= nlInvers;
491    n->nCopy  = nlCopy;
492    n->nGreater = nlGreater;
493    n->nEqual = nlEqual;
494    n->nIsZero = nlIsZero;
495    n->nIsOne = nlIsOne;
496    n->nIsMOne = nlIsMOne;
497    n->nGreaterZero = nlGreaterZero;
498    n->cfWrite = nlWrite;
499    n->nRead = nlRead;
500    n->nPower = nlPower;
501    n->nGcd  = nlGcd;
502    n->nLcm  = nlLcm;
503    n->cfSetMap = nlSetMap;
504    n->nSize  = nlSize;
505    n->cfGetDenom = nlGetDenom;
506    n->cfGetNumerator = nlGetNumerator;
507#ifdef LDEBUG
508    n->nDBTest=nlDBTest;
509#endif
510  }
511  else if (rField_is_Zp(r))
512  /*----------------------char. p----------------*/
513  {
514    npInitChar(c,r);
515    n->cfInit = npInit;
516    n->n_Int  = npInt;
517    n->nAdd   = npAdd;
518    n->nSub   = npSub;
519    n->nMult  = npMult;
520    n->nDiv   = npDiv;
521    n->nExactDiv= npDiv;
522    n->nNeg   = npNeg;
523    n->nInvers= npInvers;
524    n->nCopy  = ndCopy;
525    n->nGreater = npGreater;
526    n->nEqual = npEqual;
527    n->nIsZero = npIsZero;
528    n->nIsOne = npIsOne;
529    n->nIsMOne = npIsMOne;
530    n->nGreaterZero = npGreaterZero;
531    n->cfWrite = npWrite;
532    n->nRead = npRead;
533    n->nPower = npPower;
534    n->cfSetMap = npSetMap;
535    /* nName= ndName; */
536    /*nSize  = ndSize;*/
537#ifdef LDEBUG
538    n->nDBTest=npDBTest;
539#endif
540#ifdef NV_OPS
541    if (c>NV_MAX_PRIME)
542    {
543      n->nMult  = nvMult;
544      n->nDiv   = nvDiv;
545      n->nExactDiv= nvDiv;
546      n->nInvers= nvInvers;
547      n->nPower= nvPower;
548    }
549#endif
550  }
551  /* -------------- GF(p^m) -----------------------*/
552  else if (rField_is_GF(r))
553  {
554    //nfSetChar(c,r->parameter);
555    n->cfInit = nfInit;
556    n->nPar   = nfPar;
557    n->nParDeg= nfParDeg;
558    n->n_Int  = nfInt;
559    n->nAdd   = nfAdd;
560    n->nSub   = nfSub;
561    n->nMult  = nfMult;
562    n->nDiv   = nfDiv;
563    n->nExactDiv= nfDiv;
564    n->nNeg   = nfNeg;
565    n->nInvers= nfInvers;
566    n->nCopy  = ndCopy;
567    n->nGreater = nfGreater;
568    n->nEqual = nfEqual;
569    n->nIsZero = nfIsZero;
570    n->nIsOne = nfIsOne;
571    n->nIsMOne = nfIsMOne;
572    n->nGreaterZero = nfGreaterZero;
573    n->cfWrite = nfWrite;
574    n->nRead = nfRead;
575    n->nPower = nfPower;
576    n->cfSetMap = nfSetMap;
577    n->nName= nfName;
578    /*nSize  = ndSize;*/
579#ifdef LDEBUG
580    n->nDBTest=nfDBTest;
581#endif
582  }
583  /* -------------- R -----------------------*/
584  //if (c==(-1))
585  else if (rField_is_R(r))
586  {
587    n->cfInit = nrInit;
588    n->n_Int  = nrInt;
589    n->nAdd   = nrAdd;
590    n->nSub   = nrSub;
591    n->nMult  = nrMult;
592    n->nDiv   = nrDiv;
593    n->nExactDiv= nrDiv;
594    n->nNeg   = nrNeg;
595    n->nInvers= nrInvers;
596    n->nCopy  = ndCopy;
597    n->nGreater = nrGreater;
598    n->nEqual = nrEqual;
599    n->nIsZero = nrIsZero;
600    n->nIsOne = nrIsOne;
601    n->nIsMOne = nrIsMOne;
602    n->nGreaterZero = nrGreaterZero;
603    n->cfWrite = nrWrite;
604    n->nRead = nrRead;
605    n->nPower = nrPower;
606    n->cfSetMap=nrSetMap;
607    /* nName= ndName; */
608    /*nSize  = ndSize;*/
609#ifdef LDEBUG
610    n->nDBTest=ndDBTest; // not yet implemented: nrDBTest;
611#endif
612  }
613  /* -------------- long R -----------------------*/
614  else if (rField_is_long_R(r))
615  {
616    n->cfDelete= ngfDelete;
617    n->cfInit = ngfInit;
618    n->n_Int  = ngfInt;
619    n->nAdd   = ngfAdd;
620    n->nSub   = ngfSub;
621    n->nMult  = ngfMult;
622    n->nDiv   = ngfDiv;
623    n->nExactDiv= ngfDiv;
624    n->nNeg   = ngfNeg;
625    n->nInvers= ngfInvers;
626    n->nCopy  = ngfCopy;
627    n->nGreater = ngfGreater;
628    n->nEqual = ngfEqual;
629    n->nIsZero = ngfIsZero;
630    n->nIsOne = ngfIsOne;
631    n->nIsMOne = ngfIsMOne;
632    n->nGreaterZero = ngfGreaterZero;
633    n->cfWrite = ngfWrite;
634    n->nRead = ngfRead;
635    n->nPower = ngfPower;
636    n->cfSetMap=ngfSetMap;
637    n->nName= ndName;
638    n->nSize  = ndSize;
639#ifdef LDEBUG
640    n->nDBTest=ndDBTest; // not yet implemented: ngfDBTest
641#endif
642  }
643  /* -------------- long C -----------------------*/
644  else if (rField_is_long_C(r))
645  {
646    n->cfDelete= ngcDelete;
647    n->nNormalize=nDummy2;
648    n->cfInit = ngcInit;
649    n->n_Int  = ngcInt;
650    n->nAdd   = ngcAdd;
651    n->nSub   = ngcSub;
652    n->nMult  = ngcMult;
653    n->nDiv   = ngcDiv;
654    n->nExactDiv= ngcDiv;
655    n->nNeg   = ngcNeg;
656    n->nInvers= ngcInvers;
657    n->nCopy  = ngcCopy;
658    n->nGreater = ngcGreater;
659    n->nEqual = ngcEqual;
660    n->nIsZero = ngcIsZero;
661    n->nIsOne = ngcIsOne;
662    n->nIsMOne = ngcIsMOne;
663    n->nGreaterZero = ngcGreaterZero;
664    n->cfWrite = ngcWrite;
665    n->nRead = ngcRead;
666    n->nPower = ngcPower;
667    n->cfSetMap=ngcSetMap;
668    n->nPar=ngcPar;
669    n->nRePart=ngcRePart;
670    n->nImPart=ngcImPart;
671    /*nSize  = ndSize;*/
672#ifdef LDEBUG
673    n->nDBTest=ndDBTest; // not yet implemented: ngcDBTest
674#endif
675  }
676#ifdef TEST
677  else
678  {
679    WerrorS("unknown field");
680  }
681#endif
682#ifdef HAVE_RINGS
683  if (n->nGetUnit==(nMapFunc)NULL) n->nGetUnit=n->nCopy;
684#endif
685  if (!errorreported)
686  {
687    n->nNULL=n->cfInit(0,r);
688    if (n->nRePart==NULL)
689      n->nRePart=n->nCopy;
690    if (n->nIntDiv==NULL)
691      n->nIntDiv=n->nDiv;
692  }
693}
694
695void nKillChar(ring r)
696{
697  if (r!=NULL)
698  {
699    if (r->cf!=NULL)
700    {
701      r->cf->ref--;
702      if (r->cf->ref<=0)
703      {
704        n_Procs_s tmp;
705        n_Procs_s* n=&tmp;
706        tmp.next=cf_root;
707        while((n->next!=NULL) && (n->next!=r->cf)) n=n->next;
708        if (n->next==r->cf)
709        {
710          n->next=n->next->next;
711          if (cf_root==r->cf) cf_root=n->next;
712          r->cf->cfDelete(&(r->cf->nNULL),r);
713          switch(r->cf->type)
714          {
715            case n_Zp:
716                 #ifdef HAVE_DIV_MOD
717                 if (r->cf->npInvTable!=NULL)
718                 omFreeSize( (ADDRESS)r->cf->npInvTable,
719                             r->cf->npPrimeM*sizeof(CARDINAL) );
720                 #else
721                 if (r->cf->npExpTable!=NULL)
722                 {
723                   omFreeSize( (ADDRESS)r->cf->npExpTable,
724                               r->cf->npPrimeM*sizeof(CARDINAL) );
725                   omFreeSize( (ADDRESS)r->cf->npLogTable,
726                               r->cf->npPrimeM*sizeof(CARDINAL) );
727                 }
728                 #endif
729                 break;
730            case n_Zp_a:
731            case n_Q_a:
732                 {
733                   number n=r->minpoly;
734                   if (n!=NULL)
735                   {
736                     r->minpoly=NULL;
737                     if (r==currRing) naMinimalPoly=NULL;
738                     naDelete(&n,r);
739                   }
740                 }
741                 break;
742
743            default:
744                 break;
745          }
746          omFreeSize((ADDRESS)r->cf, sizeof(n_Procs_s));
747          r->cf=NULL;
748        }
749        else
750        {
751          WarnS("cf_root list destroyed");
752        }
753      }
754    }
755    if (r->algring!=NULL)
756    {
757      rKill(r->algring);
758      r->algring=NULL;
759    }
760  }
761}
Note: See TracBrowser for help on using the repository browser.