source: git/kernel/numbers.cc @ cfb8edb

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