source: git/coeffs/numbers.cc @ 6cee1d

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