source: git/Singular/numbers.cc @ 3095a1

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