source: git/coeffs/numbers.cc @ 7d90aa

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