source: git/kernel/numbers.cc @ a41f3aa

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