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

spielwiese
Last change on this file since 9e8da7 was 661c214, checked in by Frank Seelisch <seelisch@…>, 13 years ago
further separation of alg/transc ext code git-svn-id: file:///usr/local/Singular/svn/trunk@13903 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 19.0 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id$ */
5
6/*
7* ABSTRACT: interface to coefficient aritmetics
8*/
9
10#include <string.h>
11#include <stdlib.h>
12#include <kernel/mod2.h>
13#include <kernel/structs.h>
14#include <kernel/febase.h>
15#include <kernel/kstd1.h>
16#include <kernel/numbers.h>
17#include <kernel/longrat.h>
18#include <kernel/longalg.h>
19#include <kernel/longtrans.h>
20#include <kernel/modulop.h>
21#include <kernel/gnumpfl.h>
22#include <kernel/gnumpc.h>
23#include <kernel/ring.h>
24#include <kernel/ffields.h>
25#include <kernel/shortfl.h>
26#ifdef HAVE_RINGS
27#include <kernel/rmodulo2m.h>
28#include <kernel/rmodulon.h>
29#include <kernel/rintegers.h>
30
31extern omBin gmp_nrz_bin;
32#endif
33
34//static int characteristic = 0;
35extern int IsPrime(int p);
36
37number  (*nInit_bigint)(number i);
38number (*nPar)(int i);
39int    (*nParDeg)(number n);
40int    (*nSize)(number n);
41int    (*n_Int)(number &n, const ring r);
42numberfunc nMult, nSub, nAdd, nDiv, nIntDiv, nIntMod, nExactDiv;
43number (*nNeg)(number a);
44number (*nInvers)(number a);
45void   (*nNormalize)(number &a);
46number (*nCopy)(number a);
47number (*nRePart)(number a);
48number (*nImPart)(number a);
49#ifdef HAVE_RINGS
50BOOLEAN (*nDivBy)(number a,number b);
51int     (*nDivComp)(number a,number b);
52BOOLEAN (*nIsUnit)(number a);
53number  (*nGetUnit)(number a);
54number  (*nExtGcd)(number a, number b, number *s, number *t);
55#endif
56BOOLEAN (*nGreater)(number a,number b);
57BOOLEAN (*nEqual)(number a,number b);
58BOOLEAN (*nIsZero)(number a);
59BOOLEAN (*nIsOne)(number a);
60BOOLEAN (*nIsMOne)(number a);
61BOOLEAN (*nGreaterZero)(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);
67
68/*0 implementation*/
69number nNULL; /* the 0 as constant */
70
71n_Procs_s *cf_root=NULL;
72
73void   nNew(number* d) { *d=NULL; }
74void   ndDelete(number* d, const ring r) { *d=NULL; }
75void   ndInpMult(number &a, number b, const ring r)
76{
77  number n=n_Mult(a,b,r);
78  n_Delete(&a,r);
79  a=n;
80}
81number ndInpAdd(number &a, number b, const ring r)
82{
83  number n=n_Add(a,b,r);
84  n_Delete(&a,r);
85  a=n;
86  return a;
87}
88
89#ifdef LDEBUG
90void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
91BOOLEAN ndDBTest(number a, const char *f, const int l)
92{
93  return TRUE;
94}
95#endif
96
97void   nDummy2(number& d) { }
98
99char * ndName(number n) { return NULL; }
100
101number ndPar(int i) { return nInit(0); }
102
103number ndReturn0(number n) { return nInit(0); }
104
105int    ndParDeg(number n) { return 0; }
106
107number ndGcd(number a, number b, const ring r) { return n_Init(1,r); }
108
109number ndIntMod(number a, number b) { return nInit(0); }
110
111number ndGetDenom(number &n, const ring r) { return n_Init(1,r); }
112number ndGetNumerator(number &a,const ring r) { return r->cf->nCopy(a); }
113
114int ndSize(number a) { return (int)nIsZero(a)==FALSE; }
115
116number ndCopy(number a) { return a; }
117number nd_Copy(number a,const ring r) { return r->cf->nCopy(a); }
118
119#ifdef HAVE_RINGS
120BOOLEAN ndDivBy(number a, number b) { return TRUE; } // assume a,b !=0
121int ndDivComp(number a, number b) { return 2; }
122BOOLEAN ndIsUnit(number a) { return !nIsZero(a); }
123number  ndExtGcd (number a, number b, number *s, number *t) { return nInit(1); }
124#endif
125
126/*2
127* init operations for characteristic c (complete==TRUE)
128* init nDelete    for characteristic c (complete==FALSE)
129*/
130void nSetChar(ring r)
131{
132  int c=rInternalChar(r);
133
134  /*--------------------- Q -----------------*/
135  if (rField_is_Q(r))
136  {
137    nInit_bigint=nlCopy;
138  }
139  /*--------------------- Q_a/ Zp_a -----------------*/
140  else if (rField_is_Extension(r))
141  {
142    if (r->minpoly != NULL)
143    {
144      naSetChar(c,r);
145      if (rField_is_Q_a()) nInit_bigint=naMap00;
146      if (rField_is_Zp_a()) nInit_bigint=naMap0P;
147    }
148    else
149    {
150      ntSetChar(c,r);
151      if (rField_is_Q_a()) nInit_bigint=ntMap00;
152      if (rField_is_Zp_a()) nInit_bigint=ntMap0P;
153    }
154  }
155#ifdef HAVE_RINGS
156  /*----------------------ring Z / 2^m----------------*/
157  else if (rField_is_Ring_2toM(r))
158  {
159    nr2mSetExp(c, r);
160    nInit_bigint=nr2mMapQ;
161  }
162  /*----------------------ring Z / 2^m----------------*/
163  else if (rField_is_Ring_Z(r))
164  {
165    nrzSetExp(c, r);
166    nInit_bigint=nrzMapQ;
167  }
168  /*----------------------ring Z / n----------------*/
169  else if (rField_is_Ring_ModN(r))
170  {
171    nrnSetExp(c, r);
172    nInit_bigint=nrnMapQ;
173  }
174  /*----------------------ring Z / n----------------*/
175  else if (rField_is_Ring_PtoM(r))
176  {
177    nrnSetExp(c, r);
178    nInit_bigint=nrnMapQ;
179  }
180#endif
181  else if (rField_is_Zp(r))
182  /*----------------------char. p----------------*/
183  {
184    npSetChar(c, r);
185    nInit_bigint=npMap0;
186  }
187  /* -------------- GF(p^m) -----------------------*/
188  else if (rField_is_GF(r))
189  {
190    nfSetChar(c,r->parameter);
191    nInit_bigint=ndReturn0; // not impl.
192  }
193  /* -------------- R -----------------------*/
194  //if (c==(-1))
195  else if (rField_is_R(r))
196  {
197    nInit_bigint=nrMapQ;
198  }
199  /* -------------- long R -----------------------*/
200  /* -------------- long C -----------------------*/
201  else if ((rField_is_long_R(r))
202  || (rField_is_long_C(r)))
203  {
204    setGMPFloatDigits(r->float_len,r->float_len2);
205    if (rField_is_long_R(r)) nInit_bigint=ngfMapQ;
206    else                     nInit_bigint=ngcMapQ;
207  }
208#ifdef TEST
209  /* -------------- R -----------------------*/
210  //if (c==(-1))
211  else if (!rField_is_R(r) && !rField_is_Q(r))
212  {
213    WerrorS("unknown field");
214  }
215#endif
216  nNormalize=r->cf->nNormalize;
217  nPar   = r->cf->nPar;
218  nParDeg= r->cf->nParDeg;
219  n_Int  = r->cf->n_Int;
220  nAdd   = r->cf->nAdd;
221  nSub   = r->cf->nSub;
222  nMult  = r->cf->nMult;
223  nDiv   = r->cf->nDiv;
224  nExactDiv= r->cf->nExactDiv;
225  nIntDiv= r->cf->nIntDiv;
226  nIntMod= r->cf->nIntMod;
227  nNeg   = r->cf->nNeg;
228  nInvers= r->cf->nInvers;
229  nCopy  = r->cf->nCopy;
230#ifdef HAVE_RINGS
231  nDivComp  = r->cf->nDivComp;
232  nDivBy = r->cf->nDivBy;
233  nIsUnit = r->cf->nIsUnit;
234  nGetUnit = r->cf->nGetUnit;
235  nExtGcd = r->cf->nExtGcd;
236#endif
237  nGreater = r->cf->nGreater;
238  nEqual = r->cf->nEqual;
239  nIsZero = r->cf->nIsZero;
240  nIsOne = r->cf->nIsOne;
241  nIsMOne = r->cf->nIsMOne;
242  nGreaterZero = r->cf->nGreaterZero;
243  nRead = r->cf->nRead;
244  nPower = r->cf->nPower;
245  nGcd  = r->cf->nGcd;
246  nLcm  = r->cf->nLcm;
247  nName= r->cf->nName;
248  nSize  = r->cf->nSize;
249  nRePart = r->cf->nRePart;
250  nImPart = r->cf->nImPart;
251  nNULL=r->cf->nNULL;
252}
253
254/*2
255* init operations for ring r
256*/
257void nInitChar(ring r)
258{
259  int c=rInternalChar(r);
260  n_coeffType t=rFieldType(r);
261
262  if (rField_is_Extension(r))
263  {
264    if (r->algring==NULL)
265    {
266      int ch=-c;
267      if (c==1) ch=0;
268      r->algring=(ring) rDefault(ch,r->P,r->parameter);
269      //r->algring->ShortOut=r->ShortOut;
270      // includes: nInitChar(r->algring);
271    }
272  }
273
274  n_Procs_s *n=cf_root;
275  while((n!=NULL)
276    && ((n->nChar!=c) || (n->type!=t)))
277      n=n->next;
278  if (n==NULL)
279  {
280    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
281    n->next=cf_root;
282    n->ref=1;
283    n->nChar=c;
284    n->type=t;
285    cf_root=n;
286  }
287  else if ((n->nChar==c) && (n->type==t))
288  {
289    n->ref++;
290    r->cf=n;
291    return;
292  }
293  else
294  {
295    WerrorS("nInitChar failed");
296    return;
297  }
298  r->cf=n;
299  n->nChar = c;
300  n->nPar  = ndPar;
301  n->nParDeg=ndParDeg;
302  n->nSize = ndSize;
303  n->cfGetDenom= ndGetDenom;
304  n->cfGetNumerator= ndGetNumerator;
305  n->nName =  ndName;
306  n->nImPart=ndReturn0;
307  n->cfDelete= ndDelete;
308  n->nInpMult=ndInpMult;
309  n->cfCopy=nd_Copy;
310  n->nIntMod=ndIntMod; /* dummy !! */
311  n->nNormalize=nDummy2;
312  n->nGcd  = ndGcd;
313  n->nLcm  = ndGcd; /* tricky, isn't it ?*/
314#ifdef HAVE_RINGS
315  n->nDivComp = ndDivComp;
316  n->nDivBy = ndDivBy;
317  n->nIsUnit = ndIsUnit;
318  n->nExtGcd = ndExtGcd;
319  n->nGetUnit = (nMapFunc)NULL;
320#endif
321  if (rField_is_Extension(r))
322  {
323    //ntInitChar(c,TRUE,r);
324    n->cfDelete       = ntDelete;
325    n->nNormalize     = ntNormalize;
326    n->cfInit         = ntInit;
327    n->nPar           = ntPar;
328    n->nParDeg        = ntParDeg;
329    n->n_Int          = ntInt;
330    n->nAdd           = ntAdd;
331    n->nSub           = ntSub;
332    n->nMult          = ntMult;
333    n->nDiv           = ntDiv;
334    n->nExactDiv      = ntDiv;
335    n->nIntDiv        = ntIntDiv;
336    n->nNeg           = ntNeg;
337    n->nInvers        = ntInvers;
338    n->nCopy          = ntCopy;
339    n->cfCopy         = nt_Copy;
340    n->nGreater       = ntGreater;
341    n->nEqual         = ntEqual;
342    n->nIsZero        = ntIsZero;
343    n->nIsOne         = ntIsOne;
344    n->nIsMOne        = ntIsMOne;
345    n->nGreaterZero   = ntGreaterZero;
346    n->cfWrite        = ntWrite;
347    n->nRead          = ntRead;
348    n->nPower         = ntPower;
349    n->nGcd           = ntGcd;
350    n->nLcm           = ntLcm;
351    n->cfSetMap       = ntSetMap;
352    n->nName          = ntName;
353    n->nSize          = ntSize;
354    n->cfGetDenom     = napGetDenom;
355    n->cfGetNumerator = napGetNumerator;
356#ifdef LDEBUG
357    n->nDBTest        = ntDBTest;
358#endif
359  }
360#ifdef HAVE_RINGS
361  /* -------------- Z/2^m ----------------------- */
362  else if (rField_is_Ring_2toM(r))
363  {
364     nr2mInitExp(c,r);
365     n->cfInit = nr2mInit;
366     n->nCopy  = ndCopy;
367     n->n_Int  = nr2mInt;
368     n->nAdd   = nr2mAdd;
369     n->nSub   = nr2mSub;
370     n->nMult  = nr2mMult;
371     n->nDiv   = nr2mDiv;
372     n->nIntDiv       = nr2mIntDiv;
373     n->nIntMod=nr2mMod;
374     n->nExactDiv= nr2mDiv;
375     n->nNeg   = nr2mNeg;
376     n->nInvers= nr2mInvers;
377     n->nDivBy = nr2mDivBy;
378     n->nDivComp = nr2mDivComp;
379     n->nGreater = nr2mGreater;
380     n->nEqual = nr2mEqual;
381     n->nIsZero = nr2mIsZero;
382     n->nIsOne = nr2mIsOne;
383     n->nIsMOne = nr2mIsMOne;
384     n->nGreaterZero = nr2mGreaterZero;
385     n->cfWrite = nr2mWrite;
386     n->nRead = nr2mRead;
387     n->nPower = nr2mPower;
388     n->cfSetMap = nr2mSetMap;
389     n->nNormalize = nDummy2;
390     n->nLcm          = nr2mLcm;
391     n->nGcd          = nr2mGcd;
392     n->nIsUnit = nr2mIsUnit;
393     n->nGetUnit = nr2mGetUnit;
394     n->nExtGcd = nr2mExtGcd;
395     n->nName= ndName;
396#ifdef LDEBUG
397     n->nDBTest=nr2mDBTest;
398#endif
399  }
400  /* -------------- Z/n ----------------------- */
401  else if (rField_is_Ring_ModN(r) || rField_is_Ring_PtoM(r)
402  )
403  {
404     nrnInitExp(c,r);
405     n->cfInit  = nrnInit;
406     n->cfDelete= nrnDelete;
407     n->nCopy  = nrnCopy;
408     n->cfCopy = cfrnCopy;
409     n->nSize  = nrnSize;
410     n->n_Int  = nrnInt;
411     n->nAdd   = nrnAdd;
412     n->nSub   = nrnSub;
413     n->nMult  = nrnMult;
414     n->nDiv   = nrnDiv;
415     n->nIntDiv= nrnIntDiv;
416     n->nIntMod= nrnMod;
417     n->nExactDiv= nrnDiv;
418     n->nNeg   = nrnNeg;
419     n->nInvers= nrnInvers;
420     n->nDivBy = nrnDivBy;
421     n->nDivComp = nrnDivComp;
422     n->nGreater = nrnGreater;
423     n->nEqual = nrnEqual;
424     n->nIsZero = nrnIsZero;
425     n->nIsOne = nrnIsOne;
426     n->nIsMOne = nrnIsMOne;
427     n->nGreaterZero = nrnGreaterZero;
428     n->cfWrite = nrnWrite;
429     n->nRead = nrnRead;
430     n->nPower = nrnPower;
431     n->cfSetMap = nrnSetMap;
432     n->nNormalize = nDummy2;
433     n->nLcm          = nrnLcm;
434     n->nGcd          = nrnGcd;
435     n->nIsUnit = nrnIsUnit;
436     n->nGetUnit = nrnGetUnit;
437     n->nExtGcd = nrnExtGcd;
438     n->nName= ndName;
439#ifdef LDEBUG
440     n->nDBTest=nrnDBTest;
441#endif
442  }
443  /* -------------- Z ----------------------- */
444  else if (rField_is_Ring_Z(r))
445  {
446     n->cfInit  = nrzInit;
447     n->cfDelete= nrzDelete;
448     n->nCopy  = nrzCopy;
449     n->cfCopy = cfrzCopy;
450     n->nSize  = nrzSize;
451     n->n_Int  = nrzInt;
452     n->nAdd   = nrzAdd;
453     n->nSub   = nrzSub;
454     n->nMult  = nrzMult;
455     n->nDiv   = nrzDiv;
456     n->nIntDiv = nrzIntDiv;
457     n->nIntMod = nrzIntMod;
458     n->nExactDiv= nrzDiv;
459     n->nNeg   = nrzNeg;
460     n->nInvers= nrzInvers;
461     n->nDivBy = nrzDivBy;
462     n->nDivComp = nrzDivComp;
463     n->nGreater = nrzGreater;
464     n->nEqual = nrzEqual;
465     n->nIsZero = nrzIsZero;
466     n->nIsOne = nrzIsOne;
467     n->nIsMOne = nrzIsMOne;
468     n->nGreaterZero = nrzGreaterZero;
469     n->cfWrite = nrzWrite;
470     n->nRead = nrzRead;
471     n->nPower = nrzPower;
472     n->cfSetMap = nrzSetMap;
473     n->nNormalize = nDummy2;
474     n->nLcm          = nrzLcm;
475     n->nGcd          = nrzGcd;
476     n->nIsUnit = nrzIsUnit;
477     n->nGetUnit = nrzGetUnit;
478     n->nExtGcd = nrzExtGcd;
479     n->nName= ndName;
480#ifdef LDEBUG
481     n->nDBTest=ndDBTest; // not yet implemented: nrzDBTest;
482#endif
483  }
484#endif
485  else if (rField_is_Q(r))
486  {
487    n->cfDelete= nlDelete;
488    n->nNormalize=nlNormalize;
489    n->cfInit = nlInit;
490    n->n_Int  = 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->cfWrite = 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->cfInit = npInit;
526    n->n_Int  = 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->cfWrite = 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      n->nInpMult= nvInpMult;
559    }
560#endif
561  }
562  /* -------------- GF(p^m) -----------------------*/
563  else if (rField_is_GF(r))
564  {
565    //nfSetChar(c,r->parameter);
566    n->cfInit = nfInit;
567    n->nPar   = nfPar;
568    n->nParDeg= nfParDeg;
569    n->n_Int  = nfInt;
570    n->nAdd   = nfAdd;
571    n->nSub   = nfSub;
572    n->nMult  = nfMult;
573    n->nDiv   = nfDiv;
574    n->nExactDiv= nfDiv;
575    n->nNeg   = nfNeg;
576    n->nInvers= nfInvers;
577    n->nCopy  = ndCopy;
578    n->nGreater = nfGreater;
579    n->nEqual = nfEqual;
580    n->nIsZero = nfIsZero;
581    n->nIsOne = nfIsOne;
582    n->nIsMOne = nfIsMOne;
583    n->nGreaterZero = nfGreaterZero;
584    n->cfWrite = nfWrite;
585    n->nRead = nfRead;
586    n->nPower = nfPower;
587    n->cfSetMap = nfSetMap;
588    n->nName= nfName;
589    /*nSize  = ndSize;*/
590#ifdef LDEBUG
591    n->nDBTest=nfDBTest;
592#endif
593  }
594  /* -------------- R -----------------------*/
595  //if (c==(-1))
596  else if (rField_is_R(r))
597  {
598    n->cfInit = nrInit;
599    n->n_Int  = nrInt;
600    n->nAdd   = nrAdd;
601    n->nSub   = nrSub;
602    n->nMult  = nrMult;
603    n->nDiv   = nrDiv;
604    n->nExactDiv= nrDiv;
605    n->nNeg   = nrNeg;
606    n->nInvers= nrInvers;
607    n->nCopy  = ndCopy;
608    n->nGreater = nrGreater;
609    n->nEqual = nrEqual;
610    n->nIsZero = nrIsZero;
611    n->nIsOne = nrIsOne;
612    n->nIsMOne = nrIsMOne;
613    n->nGreaterZero = nrGreaterZero;
614    n->cfWrite = nrWrite;
615    n->nRead = nrRead;
616    n->nPower = nrPower;
617    n->cfSetMap=nrSetMap;
618    /* nName= ndName; */
619    n->nSize = nrSize;
620#ifdef LDEBUG
621    n->nDBTest=ndDBTest; // not yet implemented: nrDBTest;
622#endif
623  }
624  /* -------------- long R -----------------------*/
625  else if (rField_is_long_R(r))
626  {
627    n->cfDelete= ngfDelete;
628    n->cfInit = ngfInit;
629    n->n_Int  = 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->cfWrite = ngfWrite;
645    n->nRead = ngfRead;
646    n->nPower = ngfPower;
647    n->cfSetMap=ngfSetMap;
648    n->nName= ndName;
649    n->nSize  = ngfSize;
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->nNormalize=nDummy2;
659    n->cfInit = ngcInit;
660    n->n_Int  = ngcInt;
661    n->nAdd   = ngcAdd;
662    n->nSub   = ngcSub;
663    n->nMult  = ngcMult;
664    n->nDiv   = ngcDiv;
665    n->nExactDiv= ngcDiv;
666    n->nNeg   = ngcNeg;
667    n->nInvers= ngcInvers;
668    n->nCopy  = ngcCopy;
669    n->nGreater = ngcGreater;
670    n->nEqual = ngcEqual;
671    n->nIsZero = ngcIsZero;
672    n->nIsOne = ngcIsOne;
673    n->nIsMOne = ngcIsMOne;
674    n->nGreaterZero = ngcGreaterZero;
675    n->cfWrite = ngcWrite;
676    n->nRead = ngcRead;
677    n->nPower = ngcPower;
678    n->cfSetMap=ngcSetMap;
679    n->nPar=ngcPar;
680    n->nRePart=ngcRePart;
681    n->nImPart=ngcImPart;
682    n->nSize = ngcSize;
683#ifdef LDEBUG
684    n->nDBTest=ndDBTest; // not yet implemented: ngcDBTest
685#endif
686  }
687#ifdef TEST
688  else
689  {
690    WerrorS("unknown field");
691  }
692#endif
693#ifdef HAVE_RINGS
694  if (n->nGetUnit==(nMapFunc)NULL) n->nGetUnit=n->nCopy;
695#endif
696  if (!errorreported)
697  {
698    n->nNULL=n->cfInit(0,r);
699    if (n->nRePart==NULL)
700      n->nRePart=n->nCopy;
701    if (n->nIntDiv==NULL)
702      n->nIntDiv=n->nDiv;
703  }
704}
705
706void nKillChar(ring r)
707{
708  if (r!=NULL)
709  {
710    if (r->cf!=NULL)
711    {
712      r->cf->ref--;
713      if (r->cf->ref<=0)
714      {
715        n_Procs_s tmp;
716        n_Procs_s* n=&tmp;
717        tmp.next=cf_root;
718        while((n->next!=NULL) && (n->next!=r->cf)) n=n->next;
719        if (n->next==r->cf)
720        {
721          n->next=n->next->next;
722          if (cf_root==r->cf) cf_root=n->next;
723          r->cf->cfDelete(&(r->cf->nNULL),r);
724          switch(r->cf->type)
725          {
726            case n_Zp:
727                 #ifdef HAVE_DIV_MOD
728                 if (r->cf->npInvTable!=NULL)
729                 omFreeSize( (ADDRESS)r->cf->npInvTable,
730                             r->cf->npPrimeM*sizeof(unsigned short) );
731                 #else
732                 if (r->cf->npExpTable!=NULL)
733                 {
734                   omFreeSize( (ADDRESS)r->cf->npExpTable,
735                               r->cf->npPrimeM*sizeof(unsigned short) );
736                   omFreeSize( (ADDRESS)r->cf->npLogTable,
737                               r->cf->npPrimeM*sizeof(unsigned short) );
738                 }
739                 #endif
740                 break;
741            case n_Zp_a:
742            case n_Q_a:
743                 {
744                   number n=r->minpoly;
745                   if (n!=NULL)
746                   {
747                     r->minpoly=NULL;
748                     if (r==currRing) naMinimalPoly=NULL;
749                     naDelete(&n,r);
750                   }
751                 }
752                 break;
753
754            default:
755                 break;
756          }
757          omFreeSize((ADDRESS)r->cf, sizeof(n_Procs_s));
758          r->cf=NULL;
759        }
760        else
761        {
762          WarnS("cf_root list destroyed");
763        }
764      }
765    }
766    if (r->algring!=NULL)
767    {
768      rKill(r->algring);
769      r->algring=NULL;
770    }
771  }
772}
Note: See TracBrowser for help on using the repository browser.