source: git/Singular/numbers.cc @ 584f84d

spielwiese
Last change on this file since 584f84d was 24d587, checked in by Olaf Bachmann <obachman@…>, 23 years ago
* clean-up[ of LDeg/FDeg stuff * tailRing for local homg git-svn-id: file:///usr/local/Singular/svn/trunk@4960 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.36 2000-12-20 11:15:46 obachman 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  }
114  else if (rField_is_Zp(r))
115  /*----------------------char. p----------------*/
116  {
117    npSetChar(c, r);
118  }
119  /* -------------- GF(p^m) -----------------------*/
120  else if (rField_is_GF(r))
121  {
122    nfSetChar(c,r->parameter);
123  }
124  /* -------------- long R -----------------------*/
125  else if (rField_is_long_R(r))
126  {
127    setGMPFloatDigits(r->ch_flags,r->ch_flags);
128  }
129  /* -------------- long C -----------------------*/
130  else if (rField_is_long_C(r))
131  {
132    setGMPFloatDigits(r->ch_flags,r->ch_flags);
133  }
134#ifdef TEST
135  /* -------------- R -----------------------*/
136  //if (c==(-1))
137  else if (!rField_is_R(r) && !rField_is_Q(r))
138  {
139    WerrorS("unknown field");
140  }
141#endif
142  nNew   = r->cf->nNew;
143  nNormalize=r->cf->nNormalize;
144  nInit  = r->cf->nInit;
145  nPar   = r->cf->nPar;
146  nParDeg= r->cf->nParDeg;
147  nInt   = r->cf->nInt;
148  nAdd   = r->cf->nAdd;
149  nSub   = r->cf->nSub;
150  nMult  = r->cf->nMult;
151  nDiv   = r->cf->nDiv;
152  nExactDiv= r->cf->nExactDiv;
153  nIntDiv= r->cf->nIntDiv;
154  nIntMod= r->cf->nIntMod;
155  nNeg   = r->cf->nNeg;
156  nInvers= r->cf->nInvers;
157  nCopy  = r->cf->nCopy;
158  nGreater = r->cf->nGreater;
159  nEqual = r->cf->nEqual;
160  nIsZero = r->cf->nIsZero;
161  nIsOne = r->cf->nIsOne;
162  nIsMOne = r->cf->nIsMOne;
163  nGreaterZero = r->cf->nGreaterZero;
164  nWrite = r->cf->nWrite;
165  nRead = r->cf->nRead;
166  nPower = r->cf->nPower;
167  nGcd  = r->cf->nGcd;
168  nLcm  = r->cf->nLcm;
169  nName= r->cf->nName;
170  nSize  = r->cf->nSize;
171  nGetDenom = r->cf->nGetDenom;
172  nRePart = r->cf->nRePart;
173  nImPart = r->cf->nImPart;
174#ifdef LDEBUG
175  nDBTest=r->cf->nDBTest;
176#endif
177  if (!errorreported) nNULL=r->cf->nNULL;
178}
179
180/*2
181* init operations for ring r
182*/
183void nInitChar(ring r)
184{
185  int c=rInternalChar(r);
186  n_coeffType t=rFieldType(r);
187
188  if (rField_is_Extension(r))
189  {
190    if (r->algring==NULL)
191    {
192      int ch=-c;
193      if (c==1) ch=0;
194      r->algring=(ring) rDefault(ch,r->P,r->parameter);
195      // includes: nInitChar(r->algring);
196    }
197  }
198
199  n_Procs_s *n=cf_root;
200  while((n!=NULL)
201    && ((n->nChar!=c) || (n->type!=t)))
202      n=n->next;
203  if (n==NULL)
204  {
205    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
206    n->next=cf_root;
207    n->ref=1;
208    n->nChar=c;
209    n->type=t;
210    cf_root=n;
211  }
212  else if ((n->nChar==c) && (n->type==t))
213  {
214    n->ref++;
215    r->cf=n;
216    return;
217  }
218  else
219  {
220    WerrorS("nInitChar failed");
221  } 
222  r->cf=n;
223  r->cf->nChar = c;
224  r->cf->nPar  = ndPar;
225  r->cf->nParDeg=ndParDeg;
226  r->cf->nSize = ndSize;
227  r->cf->nGetDenom= ndGetDenom;
228  r->cf->nName =  ndName;
229  r->cf->nImPart=ndReturn0;
230  if (rField_is_Extension(r))
231  {
232    //naInitChar(c,TRUE,r);
233#ifdef LDEBUG
234    r->cf->nDBDelete = naDBDelete;
235#else
236    r->cf->nDelete = naDelete;
237#endif
238    r->cf-> nNew       = naNew;
239    r->cf-> nNormalize = naNormalize;
240    r->cf->nInit       = naInit;
241    r->cf->nPar        = naPar;
242    r->cf->nParDeg     = naParDeg;
243    r->cf->nInt        = naInt;
244    r->cf->nAdd        = naAdd;
245    r->cf->nSub        = naSub;
246    r->cf->nMult       = naMult;
247    r->cf->nDiv        = naDiv;
248    r->cf->nExactDiv   = naDiv;
249    r->cf->nIntDiv     = naIntDiv;
250    r->cf->nIntMod     = ndIntMod; /* dummy !! */
251    r->cf->nNeg        = naNeg;
252    r->cf->nInvers     = naInvers;
253    r->cf->nCopy       = naCopy;
254    r->cf->nGreater    = naGreater;
255    r->cf->nEqual      = naEqual;
256    r->cf->nIsZero     = naIsZero;
257    r->cf->nIsOne      = naIsOne;
258    r->cf->nIsMOne     = naIsMOne;
259    r->cf->nGreaterZero= naGreaterZero;
260    r->cf->nWrite      = naWrite;
261    r->cf->nRead       = naRead;
262    r->cf->nPower      = naPower;
263    r->cf->nGcd        = naGcd;
264    r->cf->nLcm        = naLcm;
265    r->cf->nSetMap     = naSetMap;
266    r->cf->nName       = naName;
267    r->cf->nSize       = naSize;
268    r->cf->nGetDenom   = naGetDenom;
269#ifdef LDEBUG
270    r->cf->nDBTest     = naDBTest;
271#endif
272  }
273  else if (rField_is_Q(r))
274  {
275#ifdef LDEBUG
276    r->cf->nDBDelete= nlDBDelete;
277#else
278    r->cf->nDelete= nlDelete;
279#endif
280    r->cf->nNew   = nlNew;
281    r->cf->nNormalize=nlNormalize;
282    r->cf->nInit  = nlInit;
283    r->cf->nInt   = nlInt;
284    r->cf->nAdd   = nlAdd;
285    r->cf->nSub   = nlSub;
286    r->cf->nMult  = nlMult;
287    r->cf->nDiv   = nlDiv;
288    r->cf->nExactDiv= nlExactDiv;
289    r->cf->nIntDiv= nlIntDiv;
290    r->cf->nIntMod= nlIntMod;
291    r->cf->nNeg   = nlNeg;
292    r->cf->nInvers= nlInvers;
293    r->cf->nCopy  = nlCopy;
294    r->cf->nGreater = nlGreater;
295    r->cf->nEqual = nlEqual;
296    r->cf->nIsZero = nlIsZero;
297    r->cf->nIsOne = nlIsOne;
298    r->cf->nIsMOne = nlIsMOne;
299    r->cf->nGreaterZero = nlGreaterZero;
300    r->cf->nWrite = nlWrite;
301    r->cf->nRead = nlRead;
302    r->cf->nPower = nlPower;
303    r->cf->nGcd  = nlGcd;
304    r->cf->nLcm  = nlLcm;
305    r->cf->nSetMap = nlSetMap;
306    r->cf->nSize  = nlSize;
307    r->cf->nGetDenom = nlGetDenom;
308#ifdef LDEBUG
309    r->cf->nDBTest=nlDBTest;
310#endif
311  }
312  else if (rField_is_Zp(r))
313  /*----------------------char. p----------------*/
314  {
315#ifdef LDEBUG
316    r->cf->nDBDelete= nDBDummy1;
317#else
318    r->cf->nDelete= nDummy1;
319#endif
320    npInitChar(c,r);
321    r->cf->nNew   = nDummy1;
322    r->cf->nNormalize=nDummy2;
323    r->cf->nInit  = npInit;
324    r->cf->nInt   = npInt;
325    r->cf->nAdd   = npAdd;
326    r->cf->nSub   = npSub;
327    r->cf->nMult  = npMult;
328    r->cf->nDiv   = npDiv;
329    r->cf->nExactDiv= npDiv;
330    r->cf->nIntDiv= npDiv;
331    r->cf->nIntMod= ndIntMod; /* dummy !! */
332    r->cf->nNeg   = npNeg;
333    r->cf->nInvers= npInvers;
334    r->cf->nCopy  = ndCopy;
335    r->cf->nGreater = npGreater;
336    r->cf->nEqual = npEqual;
337    r->cf->nIsZero = npIsZero;
338    r->cf->nIsOne = npIsOne;
339    r->cf->nIsMOne = npIsMOne;
340    r->cf->nGreaterZero = npGreaterZero;
341    r->cf->nWrite = npWrite;
342    r->cf->nRead = npRead;
343    r->cf->nPower = npPower;
344    r->cf->nGcd  = ndGcd;
345    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
346    r->cf->nSetMap = npSetMap;
347    /* nName= ndName; */
348    /*nSize  = ndSize;*/
349#ifdef LDEBUG
350    r->cf->nDBTest=npDBTest;
351#endif
352  }
353  /* -------------- GF(p^m) -----------------------*/
354  else if (rField_is_GF(r))
355  {
356#ifdef LDEBUG
357    r->cf->nDBDelete= nDBDummy1;
358#else
359    r->cf->nDelete= nDummy1;
360#endif
361    //nfSetChar(c,r->parameter);
362    r->cf->nNew   = nDummy1;
363    r->cf->nNormalize=nDummy2;
364    r->cf->nInit  = nfInit;
365    r->cf->nPar   = nfPar;
366    r->cf->nParDeg= nfParDeg;
367    r->cf->nInt   = nfInt;
368    r->cf->nAdd   = nfAdd;
369    r->cf->nSub   = nfSub;
370    r->cf->nMult  = nfMult;
371    r->cf->nDiv   = nfDiv;
372    r->cf->nExactDiv= nfDiv;
373    r->cf->nIntDiv= nfDiv;
374    r->cf->nIntMod= ndIntMod; /* dummy !! */
375    r->cf->nNeg   = nfNeg;
376    r->cf->nInvers= nfInvers;
377    r->cf->nCopy  = ndCopy;
378    r->cf->nGreater = nfGreater;
379    r->cf->nEqual = nfEqual;
380    r->cf->nIsZero = nfIsZero;
381    r->cf->nIsOne = nfIsOne;
382    r->cf->nIsMOne = nfIsMOne;
383    r->cf->nGreaterZero = nfGreaterZero;
384    r->cf->nWrite = nfWrite;
385    r->cf->nRead = nfRead;
386    r->cf->nPower = nfPower;
387    r->cf->nGcd  = ndGcd;
388    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
389    r->cf->nSetMap = nfSetMap;
390    r->cf->nName= nfName;
391    /*nSize  = ndSize;*/
392#ifdef LDEBUG
393    r->cf->nDBTest=nfDBTest;
394#endif
395  }
396  /* -------------- R -----------------------*/
397  //if (c==(-1))
398  else if (rField_is_R(r))
399  {
400#ifdef LDEBUG
401    r->cf->nDBDelete= nDBDummy1;
402#else
403    r->cf->nDelete= nDummy1;
404#endif
405    r->cf->nNew=nDummy1;
406    r->cf->nNormalize=nDummy2;
407    r->cf->nInit  = nrInit;
408    r->cf->nInt   = nrInt;
409    r->cf->nAdd   = nrAdd;
410    r->cf->nSub   = nrSub;
411    r->cf->nMult  = nrMult;
412    r->cf->nDiv   = nrDiv;
413    r->cf->nExactDiv= nrDiv;
414    r->cf->nIntDiv= nrDiv;
415    r->cf->nIntMod= ndIntMod; /* dummy !! */
416    r->cf->nNeg   = nrNeg;
417    r->cf->nInvers= nrInvers;
418    r->cf->nCopy  = ndCopy;
419    r->cf->nGreater = nrGreater;
420    r->cf->nEqual = nrEqual;
421    r->cf->nIsZero = nrIsZero;
422    r->cf->nIsOne = nrIsOne;
423    r->cf->nIsMOne = nrIsMOne;
424    r->cf->nGreaterZero = nrGreaterZero;
425    r->cf->nWrite = nrWrite;
426    r->cf->nRead = nrRead;
427    r->cf->nPower = nrPower;
428    r->cf->nGcd  = ndGcd;
429    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
430    r->cf->nSetMap=nrSetMap;
431    /* nName= ndName; */
432    /*nSize  = ndSize;*/
433#ifdef LDEBUG
434    r->cf->nDBTest=nrDBTest;
435#endif
436  }
437  /* -------------- long R -----------------------*/
438  else if (rField_is_long_R(r))
439  {
440    //setGMPFloatDigits(r->ch_flags);
441#ifdef LDEBUG
442    r->cf->nDBDelete= ngfDBDelete;
443#else
444    r->cf->nDelete= ngfDelete;
445#endif
446    r->cf->nNew=ngfNew;
447    r->cf->nNormalize=nDummy2;
448    r->cf->nInit  = ngfInit;
449    r->cf->nInt   = ngfInt;
450    r->cf->nAdd   = ngfAdd;
451    r->cf->nSub   = ngfSub;
452    r->cf->nMult  = ngfMult;
453    r->cf->nDiv   = ngfDiv;
454    r->cf->nExactDiv= ngfDiv;
455    r->cf->nIntDiv= ngfDiv;
456    r->cf->nIntMod= ndIntMod; /* dummy !! */
457    r->cf->nNeg   = ngfNeg;
458    r->cf->nInvers= ngfInvers;
459    r->cf->nCopy  = ngfCopy;
460    r->cf->nGreater = ngfGreater;
461    r->cf->nEqual = ngfEqual;
462    r->cf->nIsZero = ngfIsZero;
463    r->cf->nIsOne = ngfIsOne;
464    r->cf->nIsMOne = ngfIsMOne;
465    r->cf->nGreaterZero = ngfGreaterZero;
466    r->cf->nWrite = ngfWrite;
467    r->cf->nRead = ngfRead;
468    r->cf->nPower = ngfPower;
469    r->cf->nGcd  = ndGcd;
470    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
471    r->cf->nSetMap=ngfSetMap;
472    r->cf->nName= ndName;
473    r->cf->nSize  = ndSize;
474#ifdef LDEBUG
475    r->cf->nDBTest=ngfDBTest;
476#endif
477  }
478  /* -------------- long C -----------------------*/
479  else if (rField_is_long_C(r))
480  {
481    //setGMPFloatDigits(r->ch_flags);
482#ifdef LDEBUG
483    r->cf->nDBDelete= ngcDBDelete;
484#else
485    r->cf->nDelete= ngcDelete;
486#endif
487    r->cf->nNew=ngcNew;
488    r->cf->nNormalize=nDummy2;
489    r->cf->nInit  = ngcInit;
490    r->cf->nInt   = ngcInt;
491    r->cf->nAdd   = ngcAdd;
492    r->cf->nSub   = ngcSub;
493    r->cf->nMult  = ngcMult;
494    r->cf->nDiv   = ngcDiv;
495    r->cf->nExactDiv= ngcDiv;
496    r->cf->nIntDiv= ngcDiv;
497    r->cf->nIntMod= ndIntMod; /* dummy !! */
498    r->cf->nNeg   = ngcNeg;
499    r->cf->nInvers= ngcInvers;
500    r->cf->nCopy  = ngcCopy;
501    r->cf->nGreater = ngcGreater;
502    r->cf->nEqual = ngcEqual;
503    r->cf->nIsZero = ngcIsZero;
504    r->cf->nIsOne = ngcIsOne;
505    r->cf->nIsMOne = ngcIsMOne;
506    r->cf->nGreaterZero = ngcGreaterZero;
507    r->cf->nWrite = ngcWrite;
508    r->cf->nRead = ngcRead;
509    r->cf->nPower = ngcPower;
510    r->cf->nGcd  = ndGcd;
511    r->cf->nLcm  = ndGcd; /* tricky, isn't it ?*/
512    r->cf->nSetMap=ngcSetMap;
513    r->cf->nPar=ngcPar;
514    r->cf->nRePart=ngcRePart;
515    r->cf->nImPart=ngcImPart;
516    /*nSize  = ndSize;*/
517#ifdef LDEBUG
518    r->cf->nDBTest=ngcDBTest;
519#endif
520  }
521#ifdef TEST
522  else
523  {
524    WerrorS("unknown field");
525  }
526#endif
527  if (!errorreported) 
528  {
529    r->cf->nNULL=r->cf->nInit(0);
530    if (r->cf->nRePart==NULL)
531      r->cf->nRePart=r->cf->nCopy;
532  }   
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.