source: git/kernel/numbers.cc @ 17268cb

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