source: git/kernel/numbers.cc @ 725ef18

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