source: git/Singular/numbers.cc @ 0d7217

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