source: git/coeffs/numbers.cc @ 3bc01c7

spielwiese
Last change on this file since 3bc01c7 was 3bc01c7, checked in by Hans Schoenemann <hannes@…>, 14 years ago
nDummy2 -> ndNormalize
  • Property mode set to 100644
File size: 15.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 "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"
22#ifdef HAVE_RINGS
23#include <kernel/rmodulo2m.h>
24#include <kernel/rmodulon.h>
25#include <kernel/rintegers.h>
26
27extern omBin gmp_nrz_bin;
28#endif
29
30#ifndef assume
31#  define assume(a) if(!(a)){ Werror( "Assumption: is wrong: %s\n", #a ); };
32#endif
33
34
35//static int characteristic = 0;
36extern int IsPrime(int p);
37
38/*0 implementation*/
39number nNULL; /* the 0 as constant */
40
41n_Procs_s *cf_root=NULL;
42
43void   nNew(number* d) { *d=NULL; }
44void   ndDelete(number* d, const coeffs r) { *d=NULL; }
45void   ndInpMult(number &a, number b, const coeffs r)
46{
47  number n=n_Mult(a,b,r);
48  n_Delete(&a,r);
49  a=n;
50}
51number ndInpAdd(number &a, number b, const coeffs r)
52{
53  number n=n_Add(a,b,r);
54  n_Delete(&a,r);
55  a=n;
56  return a;
57}
58
59#ifdef LDEBUG
60void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
61BOOLEAN ndDBTest(number a, const char *f, const int l)
62{
63  return TRUE;
64}
65#endif
66
67void   ndNormalize(number& d, const coeffs r) { }
68
69char * ndName(number n, const coeffs r) { return NULL; }
70
71number ndPar(int i, const coeffs r) { return n_Init(0,r); }
72
73number ndReturn0(number n, const coeffs r) { return n_Init(0,r); }
74
75int    ndParDeg(number n, const coeffs r) { return 0; }
76
77number ndGcd(number a, number b, const coeffs r) { return n_Init(1,r); }
78
79number ndIntMod(number a, number b, const coeffs r) { return n_Init(0,r); }
80
81number ndGetDenom(number &n, const coeffs r) { return n_Init(1,r); }
82number ndGetNumerator(number &a,const coeffs r) { return n_Copy(a,r); }
83
84int ndSize(number a, const coeffs r) { return (int)n_IsZero(a,r)==FALSE; }
85
86number ndCopy(number a, const coeffs) { return a; }
87number ndCopyMap(number a, const coeffs r, const coeffs aRing)
88{
89  assume( getCoeffType(r) == getCoeffType(aRing) );
90  assume( nField_has_simple_Alloc(r) && nField_has_simple_Alloc(aRing) );
91 
92  return a;
93}
94
95number nd_Copy(number a, const coeffs r) { return n_Copy(a, r); }
96
97#ifdef HAVE_RINGS
98BOOLEAN ndDivBy(number a, number b) { return TRUE; } // assume a,b !=0
99int ndDivComp(number a, number b) { return 2; }
100BOOLEAN ndIsUnit(number a) { return !nIsZero(a); }
101number  ndExtGcd (number a, number b, number *s, number *t) { return nInit(1); }
102#endif
103
104/*2
105* init operations for characteristic c (complete==TRUE)
106* init nDelete    for characteristic c (complete==FALSE)
107*/
108void nSetChar(coeffs r)
109{
110  int c=rInternalChar(r);
111
112  /*--------------------- Q -----------------*/
113  if (nField_is_Q(r))
114  {
115    r->nInit_bigint=nl_Copy;
116  }
117  #if 0 /* vertagt*/
118  /*--------------------- Q_a/ Zp_a -----------------*/
119  else if (nField_is_Extension(r))
120  {
121    if (r->minpoly != NULL)
122    {
123      naSetChar(c,r);
124      if (rField_is_Q_a(r)) r->nInit_bigint=naMap00;
125      if (rField_is_Zp_a(r)) r->nInit_bigint=naMap0P;
126    }
127    else
128    {
129      ntSetChar(c,r);
130      if (rField_is_Q_a(r)) r->nInit_bigint=ntMap00;
131      if (rField_is_Zp_a(r)) r->nInit_bigint=ntMap0P;
132    }
133  }
134  #endif
135#ifdef HAVE_RINGS
136  /*----------------------ring Z / 2^m----------------*/
137  else if (nField_is_Ring_2toM(r))
138  {
139    nr2mSetExp(c, r);
140    r->nInit_bigint=nr2mMapQ;
141  }
142  /*----------------------ring Z ----------------*/
143  else if (nField_is_Ring_Z(r))
144  {
145    nrzSetExp(c, r);
146    r->nInit_bigint=nrzMapQ;
147  }
148  /*----------------------ring Z / n----------------*/
149  else if (nField_is_Ring_ModN(r))
150  {
151    nrnSetExp(c, r);
152    r->nInit_bigint=nrnMapQ;
153  }
154  /*----------------------ring Z / n----------------*/
155  else if (nField_is_Ring_PtoM(r))
156  {
157    nrnSetExp(c, r);
158    r->nInit_bigint=nrnMapQ;
159  }
160#endif
161  else if (nField_is_Zp(r))
162  /*----------------------char. p----------------*/
163  {
164    npSetChar(c, r);
165  }
166  /* -------------- GF(p^m) -----------------------*/
167  else if (nField_is_GF(r))
168  {
169    nfSetChar(c,r->parameter);
170    r->nInit_bigint=ndReturn0; // not impl.
171  }
172  /* -------------- R -----------------------*/
173  //if (c==(-1))
174  else if (nField_is_R(r))
175  {
176    r->nInit_bigint=nrMapQ;
177  }
178  /* -------------- long R -----------------------*/
179  /* -------------- long C -----------------------*/
180  else if ((nField_is_long_R(r))
181  || (nField_is_long_C(r)))
182  {
183    setGMPFloatDigits(r->float_len,r->float_len2);
184    if (nField_is_long_R(r)) r->nInit_bigint=ngfMapQ;
185    else                     r->nInit_bigint=ngcMapQ;
186  }
187#ifdef TEST
188  /* -------------- R -----------------------*/
189  //if (c==(-1))
190  else if (!nField_is_R(r) && !nField_is_Q(r))
191  {
192    WerrorS("unknown field");
193  }
194#endif
195}
196
197/*2
198* init operations for coeffs r
199*/
200void nInitChar(coeffs r)
201{
202  int c=nInternalChar(r);
203  n_coeffType t=nFieldType(r);
204
205  #if 0 /* vertagt*/
206  if (nField_is_Extension(r))
207  {
208    if (r->algring==NULL)
209    {
210      int ch=-c;
211      if (c==1) ch=0;
212      r->algring=(ring) rDefault(ch,r->P,r->parameter);
213      //r->algring->ShortOut=r->ShortOut;
214      // includes: nInitChar(r->algring);
215    }
216  }
217  #endif
218
219  n_coeffType t=rFieldType(r);
220  if ((r->cf!=NULL) && (r->cf->nChar==c) && (r->cf->type==t))
221  { r->cf->ref++; return; }
222
223  n_Procs_s *n=cf_root;
224  while((n!=NULL)
225    && ((n->ch!=c) || (n->type!=t)))
226      n=n->next;
227  if (n==NULL)
228  {
229    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
230    n->next=cf_root;
231    n->ref=1;
232    n->ch=c;
233    n->type=t;
234    cf_root=n;
235  }
236  else if ((n->ch==c) && (n->type==t))
237  {
238    n->ref++;
239    r=n;
240    return;
241  }
242  else
243  {
244    WerrorS("nInitChar failed");
245    return;
246  }
247  r=n;
248  n->ch = c;
249  n->nPar  = ndPar;
250  n->nParDeg=ndParDeg;
251  n->nSize = ndSize;
252  n->cfGetDenom= ndGetDenom;
253  n->cfGetNumerator= ndGetNumerator;
254  n->nName =  ndName;
255  n->nImPart=ndReturn0;
256  n->cfDelete= ndDelete;
257  n->nInpMult=ndInpMult;
258  n->cfCopy=nd_Copy;
259  n->nIntMod=ndIntMod; /* dummy !! */
260  n->nNormalize=ndNormalize;
261  n->nGcd  = ndGcd;
262  n->nLcm  = ndGcd; /* tricky, isn't it ?*/
263#ifdef HAVE_RINGS
264  n->nDivComp = ndDivComp;
265  n->nDivBy = ndDivBy;
266  n->nIsUnit = ndIsUnit;
267  n->nExtGcd = ndExtGcd;
268  n->nGetUnit = (nMapFunc)NULL;
269#endif
270  #if 0 /*vertagt*/
271  if (nField_is_Extension(r))
272  {
273    //ntInitChar(c,TRUE,r);
274    n->cfDelete       = ntDelete;
275    n->nNormalize     = ntNormalize;
276    n->cfInit         = ntInit;
277    n->nPar           = ntPar;
278    n->nParDeg        = ntParDeg;
279    n->n_Int          = ntInt;
280    n->nAdd           = ntAdd;
281    n->nSub           = ntSub;
282    n->nMult          = ntMult;
283    n->nDiv           = ntDiv;
284    n->nExactDiv      = ntDiv;
285    n->nIntDiv        = ntIntDiv;
286    n->nNeg           = ntNeg;
287    n->nInvers        = ntInvers;
288    //n->nCopy          = ntCopy;
289    n->cfCopy         = nt_Copy;
290    n->nGreater       = ntGreater;
291    n->nEqual         = ntEqual;
292    n->nIsZero        = ntIsZero;
293    n->nIsOne         = ntIsOne;
294    n->nIsMOne        = ntIsMOne;
295    n->nGreaterZero   = ntGreaterZero;
296    n->cfWrite        = ntWrite;
297    n->nRead          = ntRead;
298    n->nPower         = ntPower;
299    n->nGcd           = ntGcd;
300    n->nLcm           = ntLcm;
301    n->cfSetMap       = ntSetMap;
302    n->nName          = ntName;
303    n->nSize          = ntSize;
304    n->cfGetDenom     = napGetDenom;
305    n->cfGetNumerator = napGetNumerator;
306#ifdef LDEBUG
307    n->nDBTest        = naDBTest;
308#endif
309  }
310  #endif
311#ifdef HAVE_RINGS
312  /* -------------- Z/2^m ----------------------- */
313  else if (nField_is_Ring_2toM(r))
314  {
315    nr2mCoeffInit(n, c, r->cf);
316  }
317  /* -------------- Z/n ----------------------- */
318  else if (nField_is_Ring_ModN(r) || nField_is_Ring_PtoM(r))
319  {
320    nrnCoeffInit(n, c, r->cf);
321  }
322  /* -------------- Z ----------------------- */
323  else if (nField_is_Ring_Z(r))
324  {
325     n->cfInit  = nrzInit;
326     n->cfDelete= nrzDelete;
327     n->cfCopy  = nrzCopy;
328     n->cfCopy = cfrzCopy;
329     n->nSize  = nrzSize;
330     n->n_Int  = nrzInt;
331     n->nAdd   = nrzAdd;
332     n->nSub   = nrzSub;
333     n->nMult  = nrzMult;
334     n->nDiv   = nrzDiv;
335     n->nIntDiv = nrzIntDiv;
336     n->nIntMod = nrzIntMod;
337     n->nExactDiv= nrzDiv;
338     n->nNeg   = nrzNeg;
339     n->nInvers= nrzInvers;
340     n->nDivBy = nrzDivBy;
341     n->nDivComp = nrzDivComp;
342     n->nGreater = nrzGreater;
343     n->nEqual = nrzEqual;
344     n->nIsZero = nrzIsZero;
345     n->nIsOne = nrzIsOne;
346     n->nIsMOne = nrzIsMOne;
347     n->nGreaterZero = nrzGreaterZero;
348     n->cfWrite = nrzWrite;
349     n->nRead = nrzRead;
350     n->nPower = nrzPower;
351     n->cfSetMap = nrzSetMap;
352     n->nNormalize = ndNormalize;
353     n->nLcm          = nrzLcm;
354     n->nGcd          = nrzGcd;
355     n->nIsUnit = nrzIsUnit;
356     n->nGetUnit = nrzGetUnit;
357     n->nExtGcd = nrzExtGcd;
358     n->nName= ndName;
359#ifdef LDEBUG
360     n->nDBTest=ndDBTest; // not yet implemented: nrzDBTest;
361#endif
362  }
363#endif
364  else if (nField_is_Q(r))
365  {
366    n->cfDelete= nlDelete;
367    n->nNormalize=nlNormalize;
368    n->cfInit = nlInit;
369    n->n_Int  = nlInt;
370    n->nAdd   = nlAdd;
371    n->nSub   = nlSub;
372    n->nMult  = nlMult;
373    n->nInpMult=nlInpMult;
374    n->nDiv   = nlDiv;
375    n->nExactDiv= nlExactDiv;
376    n->nIntDiv= nlIntDiv;
377    n->nIntMod= nlIntMod;
378    n->nNeg   = nlNeg;
379    n->nInvers= nlInvers;
380    n->cfCopy  = nlCopy;
381    n->nGreater = nlGreater;
382    n->nEqual = nlEqual;
383    n->nIsZero = nlIsZero;
384    n->nIsOne = nlIsOne;
385    n->nIsMOne = nlIsMOne;
386    n->nGreaterZero = nlGreaterZero;
387    n->cfWrite = nlWrite;
388    n->nRead = nlRead;
389    n->nPower = nlPower;
390    n->nGcd  = nlGcd;
391    n->nLcm  = nlLcm;
392    n->cfSetMap = nlSetMap;
393    n->nSize  = nlSize;
394    n->cfGetDenom = nlGetDenom;
395    n->cfGetNumerator = nlGetNumerator;
396#ifdef LDEBUG
397    n->nDBTest=nlDBTest;
398#endif
399  }
400  else if (nField_is_Zp(r))
401  /*----------------------char. p----------------*/
402  {
403    /* never again:
404    npInitChar(c,r);
405    n->cfInit = npInit;
406    n->n_Int  = npInt;
407    n->nAdd   = npAdd;
408    n->nSub   = npSub;
409    n->nMult  = npMult;
410    n->nDiv   = npDiv;
411    n->nExactDiv= npDiv;
412    n->nNeg   = npNeg;
413    n->nInvers= npInvers;
414    n->nCopy  = ndCopy;
415    n->nGreater = npGreater;
416    n->nEqual = npEqual;
417    n->nIsZero = npIsZero;
418    n->nIsOne = npIsOne;
419    n->nIsMOne = npIsMOne;
420    n->nGreaterZero = npGreaterZero;
421    n->cfWrite = npWrite;
422    n->nRead = npRead;
423    n->nPower = npPower;
424    n->cfSetMap = npSetMap;
425    // nName= ndName;
426    // nSize  = ndSize;
427#ifdef LDEBUG
428    n->nDBTest=npDBTest;
429#endif
430#ifdef NV_OPS
431    if (c>NV_MAX_PRIME)
432    {
433      n->nMult  = nvMult;
434      n->nDiv   = nvDiv;
435      n->nExactDiv= nvDiv;
436      n->nInvers= nvInvers;
437      n->nPower= nvPower;
438      n->nInpMult= nvInpMult;
439    }
440#endif
441    */
442    r->cfInitChar=npInitChar;
443    npInitChar(r,c);
444  }
445  /* -------------- GF(p^m) -----------------------*/
446  else if (nField_is_GF(r))
447  {
448    //nfSetChar(c,r->parameter);
449    n->cfInit = nfInit;
450    n->nPar   = nfPar;
451    n->nParDeg= nfParDeg;
452    n->n_Int  = nfInt;
453    n->nAdd   = nfAdd;
454    n->nSub   = nfSub;
455    n->nMult  = nfMult;
456    n->nDiv   = nfDiv;
457    n->nExactDiv= nfDiv;
458    n->nNeg   = nfNeg;
459    n->nInvers= nfInvers;
460    n->cfCopy  = ndCopy;
461    n->nGreater = nfGreater;
462    n->nEqual = nfEqual;
463    n->nIsZero = nfIsZero;
464    n->nIsOne = nfIsOne;
465    n->nIsMOne = nfIsMOne;
466    n->nGreaterZero = nfGreaterZero;
467    n->cfWrite = nfWrite;
468    n->nRead = nfRead;
469    n->nPower = nfPower;
470    n->cfSetMap = nfSetMap;
471    n->nName= nfName;
472    /*nSize  = ndSize;*/
473#ifdef LDEBUG
474    n->nDBTest=nfDBTest;
475#endif
476  }
477  /* -------------- R -----------------------*/
478  //if (c==(-1))
479  else if (nField_is_R(r))
480  {
481    n->cfInit = nrInit;
482    n->n_Int  = nrInt;
483    n->nAdd   = nrAdd;
484    n->nSub   = nrSub;
485    n->nMult  = nrMult;
486    n->nDiv   = nrDiv;
487    n->nExactDiv= nrDiv;
488    n->nNeg   = nrNeg;
489    n->nInvers= nrInvers;
490    n->cfCopy  = ndCopy;
491    n->nGreater = nrGreater;
492    n->nEqual = nrEqual;
493    n->nIsZero = nrIsZero;
494    n->nIsOne = nrIsOne;
495    n->nIsMOne = nrIsMOne;
496    n->nGreaterZero = nrGreaterZero;
497    n->cfWrite = nrWrite;
498    n->nRead = nrRead;
499    n->nPower = nrPower;
500    n->cfSetMap=nrSetMap;
501    /* nName= ndName; */
502    n->nSize = nrSize;
503#ifdef LDEBUG
504    n->nDBTest=ndDBTest; // not yet implemented: nrDBTest;
505#endif
506  }
507  /* -------------- long R -----------------------*/
508  else if (nField_is_long_R(r))
509  {
510    n->cfDelete= ngfDelete;
511    n->cfInit = ngfInit;
512    n->n_Int  = ngfInt;
513    n->nAdd   = ngfAdd;
514    n->nSub   = ngfSub;
515    n->nMult  = ngfMult;
516    n->nDiv   = ngfDiv;
517    n->nExactDiv= ngfDiv;
518    n->nNeg   = ngfNeg;
519    n->nInvers= ngfInvers;
520    n->cfCopy  = ngfCopy;
521    n->nGreater = ngfGreater;
522    n->nEqual = ngfEqual;
523    n->nIsZero = ngfIsZero;
524    n->nIsOne = ngfIsOne;
525    n->nIsMOne = ngfIsMOne;
526    n->nGreaterZero = ngfGreaterZero;
527    n->cfWrite = ngfWrite;
528    n->nRead = ngfRead;
529    n->nPower = ngfPower;
530    n->cfSetMap=ngfSetMap;
531    n->nName= ndName;
532    n->nSize  = ngfSize;
533#ifdef LDEBUG
534    n->nDBTest=ndDBTest; // not yet implemented: ngfDBTest
535#endif
536  }
537  /* -------------- long C -----------------------*/
538  else if (nField_is_long_C(r))
539  {
540    n->cfDelete= ngcDelete;
541    n->nNormalize=ndNormalize;
542    n->cfInit = ngcInit;
543    n->n_Int  = ngcInt;
544    n->nAdd   = ngcAdd;
545    n->nSub   = ngcSub;
546    n->nMult  = ngcMult;
547    n->nDiv   = ngcDiv;
548    n->nExactDiv= ngcDiv;
549    n->nNeg   = ngcNeg;
550    n->nInvers= ngcInvers;
551    n->cfCopy  = ngcCopy;
552    n->nGreater = ngcGreater;
553    n->nEqual = ngcEqual;
554    n->nIsZero = ngcIsZero;
555    n->nIsOne = ngcIsOne;
556    n->nIsMOne = ngcIsMOne;
557    n->nGreaterZero = ngcGreaterZero;
558    n->cfWrite = ngcWrite;
559    n->nRead = ngcRead;
560    n->nPower = ngcPower;
561    n->cfSetMap=ngcSetMap;
562    n->nPar=ngcPar;
563    n->nRePart=ngcRePart;
564    n->nImPart=ngcImPart;
565    n->nSize = ngcSize;
566#ifdef LDEBUG
567    n->nDBTest=ndDBTest; // not yet implemented: ngcDBTest
568#endif
569  }
570#ifdef TEST
571  else
572  {
573    WerrorS("unknown field");
574  }
575#endif
576#ifdef HAVE_RINGS
577  if (n->nGetUnit==(nMapFunc)NULL) n->nGetUnit=n->cfCopy;
578#endif
579  if (!errorreported)
580  {
581    n->nNULL=n->cfInit(0,r);
582    if (n->nRePart==NULL)
583      n->nRePart=n->cfCopy;
584    if (n->nIntDiv==NULL)
585      n->nIntDiv=n->nDiv;
586  }
587}
588
589void nKillChar(coeffs r)
590{
591  if (r!=NULL)
592  {
593    r->ref--;
594    if (r->ref<=0)
595    {
596      n_Procs_s tmp;
597      n_Procs_s* n=&tmp;
598      tmp.next=cf_root;
599      while((n->next!=NULL) && (n->next!=r)) n=n->next;
600      if (n->next==r)
601      {
602        n->next=n->next->next;
603        if (cf_root==r) cf_root=n->next;
604        r->cfDelete(&(r->nNULL),r);
605        if (r->cfKillChar!=NULL) r->cfKillChar(r);
606        /* was:
607        switch(r->type)
608        {
609          case n_Zp_a:
610          case n_Q_a:
611               {
612                 number n=r->minpoly;
613                 if (n!=NULL)
614                 {
615                   r->minpoly=NULL;
616                   naDelete(&n,r);
617                 }
618               }
619               break;
620
621            default:
622                 break;
623          }
624          */
625          omFreeSize((void *)r, sizeof(n_Procs_s));
626          r=NULL;
627        }
628        else
629        {
630          WarnS("cf_root list destroyed");
631        }
632      }
633      r->cf=NULL;
634    }
635    //if (r->algring!=NULL)
636    //{
637    //  rKill(r->algring);
638    //  r->algring=NULL;
639    //}
640  }
641}
Note: See TracBrowser for help on using the repository browser.