source: git/kernel/numbers.cc @ 8627ad

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