source: git/kernel/numbers.cc @ 9c8927

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