source: git/Singular/numbers.cc @ 47c8f1

spielwiese
Last change on this file since 47c8f1 was 47c8f1, checked in by Hans Schönemann <hannes@…>, 22 years ago
*hannes: 2-0-2 merge git-svn-id: file:///usr/local/Singular/svn/trunk@5609 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 13.6 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id: numbers.cc,v 1.42 2001-08-24 13:54:03 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 "tok.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
26//static int characteristic = 0;
27extern int IsPrime(int p);
28
29void   (*nNew)(number *a);
30number (*nInit)(int i);
31number (*nPar)(int i);
32int    (*nParDeg)(number n);
33int    (*nSize)(number n);
34int    (*nInt)(number &n);
35numberfunc nMult, nSub, nAdd, nDiv, nIntDiv, nIntMod, nExactDiv;
36number (*nNeg)(number a);
37number (*nInvers)(number a);
38void   (*nNormalize)(number &a);
39number (*nCopy)(number a);
40number (*nRePart)(number a);
41number (*nImPart)(number a);
42BOOLEAN (*nGreater)(number a,number b);
43BOOLEAN (*nEqual)(number a,number b);
44BOOLEAN (*nIsZero)(number a);
45BOOLEAN (*nIsOne)(number a);
46BOOLEAN (*nIsMOne)(number a);
47BOOLEAN (*nGreaterZero)(number a);
48void    (*nWrite)(number &a);
49char *  (*nRead)(char *s,number *a);
50void    (*nPower)(number a, int i, number * result);
51number  (*nGetDenom)(number &n);
52number  (*nGcd)(number a, number b, ring r);
53number  (*nLcm)(number a, number b, ring r);
54char * (*nName)(number n);
55void   (*n__Delete)(number *a, ring r);
56
57/*0 implementation*/
58number nNULL; /* the 0 as constant */
59int    nChar;
60
61
62n_Procs_s *cf_root=NULL;
63
64void   nDummy1(number* d) { *d=NULL; }
65void   ndDelete(number* d, ring r) { *d=NULL; }
66
67#ifdef LDEBUG
68void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
69#endif
70
71void   nDummy2(number& d) { }
72
73char * ndName(number n) { return NULL; }
74
75number ndPar(int i) { return nInit(0); }
76
77number ndReturn0(number n) { return nInit(0); }
78
79int    ndParDeg(number n) { return 0; }
80
81number ndGcd(number a, number b, ring r) { return r->cf->nInit(1); }
82
83number ndIntMod(number a, number b) { return nInit(0); }
84
85number ndGetDenom(number &n) { return nInit(1); }
86
87int    nGetChar() { return nChar; }
88
89int ndSize(number a) { return (int)nIsZero(a)==FALSE; }
90
91number ndCopy(number a) { return a; }
92
93/*2
94* init operations for characteristic c (complete==TRUE)
95* init nDelete    for characteristic c (complete==FALSE)
96*/
97void nSetChar(ring r)
98{
99  int c=rInternalChar(r);
100
101  nChar=c;
102  n__Delete= r->cf->cfDelete;
103  if (rField_is_Extension(r))
104  {
105    naSetChar(c,r);
106  }
107  else if (rField_is_Zp(r))
108  /*----------------------char. p----------------*/
109  {
110    npSetChar(c, r);
111  }
112  /* -------------- GF(p^m) -----------------------*/
113  else if (rField_is_GF(r))
114  {
115    nfSetChar(c,r->parameter);
116  }
117  /* -------------- R -----------------------*/
118  //if (c==(-1))
119  else if (rField_is_R(r))
120  {
121  }
122  /* -------------- long R -----------------------*/
123  /* -------------- long C -----------------------*/
124  else if ((rField_is_long_R(r))
125  || (rField_is_long_C(r)))
126  {
127    setGMPFloatDigits(r->float_len,r->float_len2);
128  }
129#ifdef TEST
130  /* -------------- R -----------------------*/
131  //if (c==(-1))
132  else if (!rField_is_R(r) && !rField_is_Q(r))
133  {
134    WerrorS("unknown field");
135  }
136#endif
137  nNew   = r->cf->nNew;
138  nNormalize=r->cf->nNormalize;
139  nInit  = r->cf->nInit;
140  nPar   = r->cf->nPar;
141  nParDeg= r->cf->nParDeg;
142  nInt   = r->cf->nInt;
143  nAdd   = r->cf->nAdd;
144  nSub   = r->cf->nSub;
145  nMult  = r->cf->nMult;
146  nDiv   = r->cf->nDiv;
147  nExactDiv= r->cf->nExactDiv;
148  nIntDiv= r->cf->nIntDiv;
149  nIntMod= r->cf->nIntMod;
150  nNeg   = r->cf->nNeg;
151  nInvers= r->cf->nInvers;
152  nCopy  = r->cf->nCopy;
153  nGreater = r->cf->nGreater;
154  nEqual = r->cf->nEqual;
155  nIsZero = r->cf->nIsZero;
156  nIsOne = r->cf->nIsOne;
157  nIsMOne = r->cf->nIsMOne;
158  nGreaterZero = r->cf->nGreaterZero;
159  nWrite = r->cf->nWrite;
160  nRead = r->cf->nRead;
161  nPower = r->cf->nPower;
162  nGcd  = r->cf->nGcd;
163  nLcm  = r->cf->nLcm;
164  nName= r->cf->nName;
165  nSize  = r->cf->nSize;
166  nGetDenom = r->cf->nGetDenom;
167  nRePart = r->cf->nRePart;
168  nImPart = r->cf->nImPart;
169  if (!errorreported) nNULL=r->cf->nNULL;
170}
171
172/*2
173* init operations for ring r
174*/
175void nInitChar(ring r)
176{
177  int c=rInternalChar(r);
178  n_coeffType t=rFieldType(r);
179
180  if (rField_is_Extension(r))
181  {
182    if (r->algring==NULL)
183    {
184      int ch=-c;
185      if (c==1) ch=0;
186      r->algring=(ring) rDefault(ch,r->P,r->parameter);
187      //r->algring->ShortOut=r->ShortOut;
188      // includes: nInitChar(r->algring);
189    }
190  }
191
192  n_Procs_s *n=cf_root;
193  while((n!=NULL)
194    && ((n->nChar!=c) || (n->type!=t)))
195      n=n->next;
196  if (n==NULL)
197  {
198    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
199    n->next=cf_root;
200    n->ref=1;
201    n->nChar=c;
202    n->type=t;
203    cf_root=n;
204  }
205  else if ((n->nChar==c) && (n->type==t))
206  {
207    n->ref++;
208    r->cf=n;
209    return;
210  }
211  else
212  {
213    WerrorS("nInitChar failed");
214  }
215  r->cf=n;
216  r->cf->nChar = c;
217  r->cf->nPar  = ndPar;
218  r->cf->nParDeg=ndParDeg;
219  r->cf->nSize = ndSize;
220  r->cf->nGetDenom= ndGetDenom;
221  r->cf->nName =  ndName;
222  r->cf->nImPart=ndReturn0;
223  r->cf->cfDelete= ndDelete;
224  r->cf->nNew=nDummy1;
225  if (rField_is_Extension(r))
226  {
227    //naInitChar(c,TRUE,r);
228    r->cf->cfDelete = naDelete;
229    r->cf-> nNew       = naNew;
230    r->cf-> nNormalize = naNormalize;
231    r->cf->nInit       = naInit;
232    r->cf->nPar        = naPar;
233    r->cf->nParDeg     = naParDeg;
234    r->cf->nInt        = naInt;
235    r->cf->nAdd        = naAdd;
236    r->cf->nSub        = naSub;
237    r->cf->nMult       = naMult;
238    r->cf->nDiv        = naDiv;
239    r->cf->nExactDiv   = naDiv;
240    r->cf->nIntDiv     = naIntDiv;
241    r->cf->nIntMod     = ndIntMod; /* dummy !! */
242    r->cf->nNeg        = naNeg;
243    r->cf->nInvers     = naInvers;
244    r->cf->nCopy       = naCopy;
245    r->cf->nGreater    = naGreater;
246    r->cf->nEqual      = naEqual;
247    r->cf->nIsZero     = naIsZero;
248    r->cf->nIsOne      = naIsOne;
249    r->cf->nIsMOne     = naIsMOne;
250    r->cf->nGreaterZero= naGreaterZero;
251    r->cf->nWrite      = naWrite;
252    r->cf->nRead       = naRead;
253    r->cf->nPower      = naPower;
254    r->cf->nGcd        = naGcd;
255    r->cf->nLcm        = naLcm;
256    r->cf->cfSetMap    = naSetMap;
257    r->cf->nName       = naName;
258    r->cf->nSize       = naSize;
259    r->cf->nGetDenom   = naGetDenom;
260#ifdef LDEBUG
261    //r->cf->nDBTest     = naDBTest;
262#endif
263  }
264  else if (rField_is_Q(r))
265  {
266    r->cf->cfDelete= nlDelete;
267    r->cf->nNew   = nlNew;
268    r->cf->nNormalize=nlNormalize;
269    r->cf->nInit  = nlInit;
270    r->cf->nInt   = nlInt;
271    r->cf->nAdd   = nlAdd;
272    r->cf->nSub   = nlSub;
273    r->cf->nMult  = nlMult;
274    r->cf->nDiv   = nlDiv;
275    r->cf->nExactDiv= nlExactDiv;
276    r->cf->nIntDiv= nlIntDiv;
277    r->cf->nIntMod= nlIntMod;
278    r->cf->nNeg   = nlNeg;
279    r->cf->nInvers= nlInvers;
280    r->cf->nCopy  = nlCopy;
281    r->cf->nGreater = nlGreater;
282    r->cf->nEqual = nlEqual;
283    r->cf->nIsZero = nlIsZero;
284    r->cf->nIsOne = nlIsOne;
285    r->cf->nIsMOne = nlIsMOne;
286    r->cf->nGreaterZero = nlGreaterZero;
287    r->cf->nWrite = nlWrite;
288    r->cf->nRead = nlRead;
289    r->cf->nPower = nlPower;
290    r->cf->nGcd  = nlGcd;
291    r->cf->nLcm  = nlLcm;
292    r->cf->cfSetMap = nlSetMap;
293    r->cf->nSize  = nlSize;
294    r->cf->nGetDenom = nlGetDenom;
295#ifdef LDEBUG
296    //r->cf->nDBTest=nlDBTest;
297#endif
298  }
299  else if (rField_is_Zp(r))
300  /*----------------------char. p----------------*/
301  {
302    npInitChar(c,r);
303    r->cf->nNormalize=nDummy2;
304    r->cf->nInit  = npInit;
305    r->cf->nInt   = npInt;
306    r->cf->nAdd   = npAdd;
307    r->cf->nSub   = npSub;
308    r->cf->nMult  = npMult;
309    r->cf->nDiv   = npDiv;
310    r->cf->nExactDiv= npDiv;
311    r->cf->nIntDiv= npDiv;
312    r->cf->nIntMod= ndIntMod; /* dummy !! */
313    r->cf->nNeg   = npNeg;
314    r->cf->nInvers= npInvers;
315    r->cf->nCopy  = ndCopy;
316    r->cf->nGreater = npGreater;
317    r->cf->nEqual = npEqual;
318    r->cf->nIsZero = npIsZero;
319    r->cf->nIsOne = npIsOne;
320    r->cf->nIsMOne = npIsMOne;
321    r->cf->nGreaterZero = npGreaterZero;
322    r->cf->nWrite = npWrite;
323    r->cf->nRead = npRead;
324    r->cf->nPower = npPower;
325    r->cf->nGcd  = ndGcd;
326    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
327    r->cf->cfSetMap = npSetMap;
328    /* nName= ndName; */
329    /*nSize  = ndSize;*/
330#ifdef LDEBUG
331    //r->cf->nDBTest=npDBTest;
332#endif
333  }
334  /* -------------- GF(p^m) -----------------------*/
335  else if (rField_is_GF(r))
336  {
337    //nfSetChar(c,r->parameter);
338    r->cf->nNormalize=nDummy2;
339    r->cf->nInit  = nfInit;
340    r->cf->nPar   = nfPar;
341    r->cf->nParDeg= nfParDeg;
342    r->cf->nInt   = nfInt;
343    r->cf->nAdd   = nfAdd;
344    r->cf->nSub   = nfSub;
345    r->cf->nMult  = nfMult;
346    r->cf->nDiv   = nfDiv;
347    r->cf->nExactDiv= nfDiv;
348    r->cf->nIntDiv= nfDiv;
349    r->cf->nIntMod= ndIntMod; /* dummy !! */
350    r->cf->nNeg   = nfNeg;
351    r->cf->nInvers= nfInvers;
352    r->cf->nCopy  = ndCopy;
353    r->cf->nGreater = nfGreater;
354    r->cf->nEqual = nfEqual;
355    r->cf->nIsZero = nfIsZero;
356    r->cf->nIsOne = nfIsOne;
357    r->cf->nIsMOne = nfIsMOne;
358    r->cf->nGreaterZero = nfGreaterZero;
359    r->cf->nWrite = nfWrite;
360    r->cf->nRead = nfRead;
361    r->cf->nPower = nfPower;
362    r->cf->nGcd  = ndGcd;
363    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
364    r->cf->cfSetMap = nfSetMap;
365    r->cf->nName= nfName;
366    /*nSize  = ndSize;*/
367#ifdef LDEBUG
368    //r->cf->nDBTest=nfDBTest;
369#endif
370  }
371  /* -------------- R -----------------------*/
372  //if (c==(-1))
373  else if (rField_is_R(r))
374  {
375    r->cf->nNormalize=nDummy2;
376    r->cf->nInit  = nrInit;
377    r->cf->nInt   = nrInt;
378    r->cf->nAdd   = nrAdd;
379    r->cf->nSub   = nrSub;
380    r->cf->nMult  = nrMult;
381    r->cf->nDiv   = nrDiv;
382    r->cf->nExactDiv= nrDiv;
383    r->cf->nIntDiv= nrDiv;
384    r->cf->nIntMod= ndIntMod; /* dummy !! */
385    r->cf->nNeg   = nrNeg;
386    r->cf->nInvers= nrInvers;
387    r->cf->nCopy  = ndCopy;
388    r->cf->nGreater = nrGreater;
389    r->cf->nEqual = nrEqual;
390    r->cf->nIsZero = nrIsZero;
391    r->cf->nIsOne = nrIsOne;
392    r->cf->nIsMOne = nrIsMOne;
393    r->cf->nGreaterZero = nrGreaterZero;
394    r->cf->nWrite = nrWrite;
395    r->cf->nRead = nrRead;
396    r->cf->nPower = nrPower;
397    r->cf->nGcd  = ndGcd;
398    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
399    r->cf->cfSetMap=nrSetMap;
400    /* nName= ndName; */
401    /*nSize  = ndSize;*/
402#ifdef LDEBUG
403    //r->cf->nDBTest=nrDBTest;
404#endif
405  }
406  /* -------------- long R -----------------------*/
407  else if (rField_is_long_R(r))
408  {
409    r->cf->cfDelete= ngfDelete;
410    r->cf->nNew=ngfNew;
411    r->cf->nNormalize=nDummy2;
412    r->cf->nInit  = ngfInit;
413    r->cf->nInt   = ngfInt;
414    r->cf->nAdd   = ngfAdd;
415    r->cf->nSub   = ngfSub;
416    r->cf->nMult  = ngfMult;
417    r->cf->nDiv   = ngfDiv;
418    r->cf->nExactDiv= ngfDiv;
419    r->cf->nIntDiv= ngfDiv;
420    r->cf->nIntMod= ndIntMod; /* dummy !! */
421    r->cf->nNeg   = ngfNeg;
422    r->cf->nInvers= ngfInvers;
423    r->cf->nCopy  = ngfCopy;
424    r->cf->nGreater = ngfGreater;
425    r->cf->nEqual = ngfEqual;
426    r->cf->nIsZero = ngfIsZero;
427    r->cf->nIsOne = ngfIsOne;
428    r->cf->nIsMOne = ngfIsMOne;
429    r->cf->nGreaterZero = ngfGreaterZero;
430    r->cf->nWrite = ngfWrite;
431    r->cf->nRead = ngfRead;
432    r->cf->nPower = ngfPower;
433    r->cf->nGcd  = ndGcd;
434    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
435    r->cf->cfSetMap=ngfSetMap;
436    r->cf->nName= ndName;
437    r->cf->nSize  = ndSize;
438#ifdef LDEBUG
439    //r->cf->nDBTest=ngfDBTest;
440#endif
441  }
442  /* -------------- long C -----------------------*/
443  else if (rField_is_long_C(r))
444  {
445    r->cf->cfDelete= ngcDelete;
446    r->cf->nNew=ngcNew;
447    r->cf->nNormalize=nDummy2;
448    r->cf->nInit  = ngcInit;
449    r->cf->nInt   = ngcInt;
450    r->cf->nAdd   = ngcAdd;
451    r->cf->nSub   = ngcSub;
452    r->cf->nMult  = ngcMult;
453    r->cf->nDiv   = ngcDiv;
454    r->cf->nExactDiv= ngcDiv;
455    r->cf->nIntDiv= ngcDiv;
456    r->cf->nIntMod= ndIntMod; /* dummy !! */
457    r->cf->nNeg   = ngcNeg;
458    r->cf->nInvers= ngcInvers;
459    r->cf->nCopy  = ngcCopy;
460    r->cf->nGreater = ngcGreater;
461    r->cf->nEqual = ngcEqual;
462    r->cf->nIsZero = ngcIsZero;
463    r->cf->nIsOne = ngcIsOne;
464    r->cf->nIsMOne = ngcIsMOne;
465    r->cf->nGreaterZero = ngcGreaterZero;
466    r->cf->nWrite = ngcWrite;
467    r->cf->nRead = ngcRead;
468    r->cf->nPower = ngcPower;
469    r->cf->nGcd  = ndGcd;
470    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
471    r->cf->cfSetMap=ngcSetMap;
472    r->cf->nPar=ngcPar;
473    r->cf->nRePart=ngcRePart;
474    r->cf->nImPart=ngcImPart;
475    /*nSize  = ndSize;*/
476#ifdef LDEBUG
477    //r->cf->nDBTest=ngcDBTest;
478#endif
479  }
480#ifdef TEST
481  else
482  {
483    WerrorS("unknown field");
484  }
485#endif
486  if (!errorreported)
487  {
488    r->cf->nNULL=r->cf->nInit(0);
489    if (r->cf->nRePart==NULL)
490      r->cf->nRePart=r->cf->nCopy;
491  }
492}
493
494void nKillChar(ring r)
495{
496  if (r!=NULL)
497  {
498    if (r->cf!=NULL)
499    {
500      r->cf->ref--;
501      if (r->cf->ref<=0)
502      {
503        n_Procs_s tmp;
504        n_Procs_s* n=&tmp;
505        tmp.next=cf_root;
506        while((n->next!=NULL) && (n->next!=r->cf)) n=n->next;
507        if (n->next==r->cf)
508        {
509          n->next=n->next->next;
510          cf_root=tmp.next;
511          r->cf->cfDelete(&(r->cf->nNULL),r);
512          switch(r->cf->type)
513          {
514            case n_Zp:
515                 #ifdef HAVE_DIV_MOD
516                 omFreeSize( (ADDRESS)r->cf->npInvTable,
517                             r->cf->npPrimeM*sizeof(CARDINAL) );
518                 #else
519                 omFreeSize( (ADDRESS)r->cf->npExpTable,
520                             r->cf->npPrimeM*sizeof(CARDINAL) );
521                 omFreeSize( (ADDRESS)r->cf->npLogTable,
522                             r->cf->npPrimeM*sizeof(CARDINAL) );
523                 #endif
524                 break;
525
526            default:
527                 break;
528          }
529          omFreeSize((ADDRESS)r->cf, sizeof(n_Procs_s));
530          r->cf=NULL;
531        }
532        else
533        {
534          WarnS("cf_root list destroyed");
535        }
536      }
537    }
538    if (r->algring!=NULL)
539    {
540      rKill(r->algring);
541      r->algring=NULL;
542    }
543  }
544}
Note: See TracBrowser for help on using the repository browser.