source: git/Singular/numbers.cc @ 50cbdc

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