source: git/Singular/numbers.cc @ 4508ce5

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