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

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