source: git/kernel/numbers.cc @ 1c473f

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