source: git/Singular/numbers.cc @ 416465

spielwiese
Last change on this file since 416465 was 416465, checked in by Olaf Bachmann <obachman@…>, 24 years ago
* bug-fixes from work with Thomas git-svn-id: file:///usr/local/Singular/svn/trunk@3826 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 9.7 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id: numbers.cc,v 1.22 1999-11-15 17:20:36 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);
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
65void   nDummy1(number* d) { *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
77int    ndParDeg(number n) { return 0; }
78
79number ndGcd(number a, number b) { return nInit(1); }
80
81number ndIntMod(number a, number b) { return nInit(0); }
82
83number ndGetDenom(number &n) { return nInit(1); }
84
85int    nGetChar() { return nChar; }
86
87int ndSize(number a) { return (int)nIsZero(a)==FALSE; }
88
89number ndCopy(number a) { return a; }
90
91/*2
92* init operations for characteristic c (complete==TRUE)
93* init nDelete    for characteristic c (complete==FALSE)
94*/
95void nSetChar(ring r, BOOLEAN complete)
96{
97  int c=rInternalChar(r);
98
99  if (nNULL!=NULL)
100  {
101    nDelete(&nNULL);nNULL=NULL;
102  }
103  if (complete)
104  {
105    nChar=c;
106    nPar   = ndPar;
107    nParDeg= ndParDeg;
108    nSize  = ndSize;
109    nGetDenom = ndGetDenom;
110    nName = ndName;
111  }
112  //Print("n:c=%d compl=%d param=%d\n",c,complete,r->parameter);
113  //if ((c == 1) || (c< (-1)))
114  if (rField_is_Extension(r))
115  {
116    naSetChar(c,complete,r->parameter,rPar(r));
117#ifdef LDEBUG
118    nDBDelete= naDBDelete;
119#else
120    nDelete= naDelete;
121#endif
122    if (complete)
123    {
124      test |= Sy_bit(OPT_INTSTRATEGY); /*intStrategy*/
125      test &= ~Sy_bit(OPT_REDTAIL); /*noredTail*/
126      nNew   = naNew;
127      nNormalize=naNormalize;
128      nInit  = naInit;
129      nPar   = naPar;
130      nParDeg= naParDeg;
131      nInt   = naInt;
132      nAdd   = naAdd;
133      nSub   = naSub;
134      nMult  = naMult;
135      nDiv   = naDiv;
136      nExactDiv= naDiv;
137      nIntDiv= naIntDiv;
138      nIntMod= ndIntMod; /* dummy !! */
139      nNeg   = naNeg;
140      nInvers= naInvers;
141      nCopy  = naCopy;
142      nGreater = naGreater;
143      nEqual = naEqual;
144      nIsZero = naIsZero;
145      nIsOne = naIsOne;
146      nIsMOne = naIsMOne;
147      nGreaterZero = naGreaterZero;
148      nWrite = naWrite;
149      nRead = naRead;
150      nPower = naPower;
151      nGcd  = naGcd;
152      nLcm  = naLcm;
153      nSetMap = naSetMap;
154      nName= naName;
155      nSize  = naSize;
156      nGetDenom = naGetDenom;
157#ifdef LDEBUG
158      nDBTest=naDBTest;
159#endif
160    }
161  }
162  else if (rField_is_Q(r))
163  {
164#ifdef LDEBUG
165    nDBDelete= nlDBDelete;
166#else
167    nDelete= nlDelete;
168#endif
169    if (complete)
170    {
171      test |= Sy_bit(OPT_INTSTRATEGY); /*26*/
172      nNew   = nlNew;
173      nNormalize=nlNormalize;
174      nInit  = nlInit;
175      nInt   = nlInt;
176      nAdd   = nlAdd;
177      nSub   = nlSub;
178      nMult  = nlMult;
179      nDiv   = nlDiv;
180      nExactDiv= nlExactDiv;
181      nIntDiv= nlIntDiv;
182      nIntMod= nlIntMod;
183      nNeg   = nlNeg;
184      nInvers= nlInvers;
185      nCopy  = nlCopy;
186      nGreater = nlGreater;
187      nEqual = nlEqual;
188      nIsZero = nlIsZero;
189      nIsOne = nlIsOne;
190      nIsMOne = nlIsMOne;
191      nGreaterZero = nlGreaterZero;
192      nWrite = nlWrite;
193      nRead = nlRead;
194      nPower = nlPower;
195      nGcd  = nlGcd;
196      nLcm  = nlLcm;
197      nSetMap = nlSetMap;
198      nSize  = nlSize;
199      nGetDenom = nlGetDenom;
200#ifdef LDEBUG
201      nDBTest=nlDBTest;
202#endif
203    }
204  }
205  else if (rField_is_Zp(r))
206  /*----------------------char. p----------------*/
207  {
208#ifdef LDEBUG
209    nDBDelete= nDBDummy1;
210#else
211    nDelete= nDummy1;
212#endif
213    if (complete)
214    {
215      npSetChar(c);
216      test &= ~Sy_bit(OPT_INTSTRATEGY); /*26*/
217      nNew   = nDummy1;
218      nNormalize=nDummy2;
219      nInit  = npInit;
220      nInt   = npInt;
221      nAdd   = npAdd;
222      nSub   = npSub;
223      nMult  = npMult;
224      nDiv   = npDiv;
225      nExactDiv= npDiv;
226      nIntDiv= npDiv;
227      nIntMod= ndIntMod; /* dummy !! */
228      nNeg   = npNeg;
229      nInvers= npInvers;
230      nCopy  = ndCopy;
231      nGreater = npGreater;
232      nEqual = npEqual;
233      nIsZero = npIsZero;
234      nIsOne = npIsOne;
235      nIsMOne = npIsMOne;
236      nGreaterZero = npGreaterZero;
237      nWrite = npWrite;
238      nRead = npRead;
239      nPower = npPower;
240      nGcd  = ndGcd;
241      nLcm  = ndGcd; /* tricky, isn't it ?*/
242      nSetMap = npSetMap;
243      /* nName= ndName; */
244      /*nSize  = ndSize;*/
245#ifdef LDEBUG
246      nDBTest=npDBTest;
247#endif
248    }
249  }
250  /* -------------- GF(p^m) -----------------------*/
251  else if (rField_is_GF(r))
252  {
253#ifdef LDEBUG
254    nDBDelete= nDBDummy1;
255#else
256    nDelete= nDummy1;
257#endif
258    if (complete)
259    {
260      test &= ~Sy_bit(OPT_INTSTRATEGY); /*26*/
261      nfSetChar(c,r->parameter);
262      nNew   = nDummy1;
263      nNormalize=nDummy2;
264      nInit  = nfInit;
265      nPar   = nfPar;
266      nParDeg= nfParDeg;
267      nInt   = nfInt;
268      nAdd   = nfAdd;
269      nSub   = nfSub;
270      nMult  = nfMult;
271      nDiv   = nfDiv;
272      nExactDiv= nfDiv;
273      nIntDiv= nfDiv;
274      nIntMod= ndIntMod; /* dummy !! */
275      nNeg   = nfNeg;
276      nInvers= nfInvers;
277      nCopy  = ndCopy;
278      nGreater = nfGreater;
279      nEqual = nfEqual;
280      nIsZero = nfIsZero;
281      nIsOne = nfIsOne;
282      nIsMOne = nfIsMOne;
283      nGreaterZero = nfGreaterZero;
284      nWrite = nfWrite;
285      nRead = nfRead;
286      nPower = nfPower;
287      nGcd  = ndGcd;
288      nLcm  = ndGcd; /* tricky, isn't it ?*/
289      nSetMap = nfSetMap;
290      nName= nfName;
291      /*nSize  = ndSize;*/
292#ifdef LDEBUG
293      nDBTest=nfDBTest;
294#endif
295    }
296  }
297  /* -------------- R -----------------------*/
298  //if (c==(-1))
299  else if (rField_is_R(r))
300  {
301#ifdef LDEBUG
302    nDBDelete= nDBDummy1;
303#else
304    nDelete= nDummy1;
305#endif
306    if (complete)
307    {
308      nNew=nDummy1;
309      nNormalize=nDummy2;
310      nInit  = nrInit;
311      nInt   = nrInt;
312      nAdd   = nrAdd;
313      nSub   = nrSub;
314      nMult  = nrMult;
315      nDiv   = nrDiv;
316      nExactDiv= nrDiv;
317      nIntDiv= nrDiv;
318      nIntMod= ndIntMod; /* dummy !! */
319      nNeg   = nrNeg;
320      nInvers= nrInvers;
321      nCopy  = ndCopy;
322      nGreater = nrGreater;
323      nEqual = nrEqual;
324      nIsZero = nrIsZero;
325      nIsOne = nrIsOne;
326      nIsMOne = nrIsMOne;
327      nGreaterZero = nrGreaterZero;
328      nWrite = nrWrite;
329      nRead = nrRead;
330      nPower = nrPower;
331      nGcd  = ndGcd;
332      nLcm  = ndGcd; /* tricky, isn't it ?*/
333      nSetMap=nrSetMap;
334      /* nName= ndName; */
335      /*nSize  = ndSize;*/
336#ifdef LDEBUG
337      nDBTest=nrDBTest;
338#endif
339    }
340  }
341  /* -------------- long R -----------------------*/
342  else if (rField_is_long_R(r))
343  {
344    setGMPFloatDigits(r->ch_flags);
345#ifdef LDEBUG
346    nDBDelete= ngfDBDelete;
347#else
348    nDelete= ngfDelete;
349#endif
350    if (complete)
351    {
352      nNew=ngfNew;
353      nNormalize=nDummy2;
354      nInit  = ngfInit;
355      nInt   = ngfInt;
356      nAdd   = ngfAdd;
357      nSub   = ngfSub;
358      nMult  = ngfMult;
359      nDiv   = ngfDiv;
360      nExactDiv= ngfDiv;
361      nIntDiv= ngfDiv;
362      nIntMod= ndIntMod; /* dummy !! */
363      nNeg   = ngfNeg;
364      nInvers= ngfInvers;
365      nCopy  = ngfCopy;
366      nGreater = ngfGreater;
367      nEqual = ngfEqual;
368      nIsZero = ngfIsZero;
369      nIsOne = ngfIsOne;
370      nIsMOne = ngfIsMOne;
371      nGreaterZero = ngfGreaterZero;
372      nWrite = ngfWrite;
373      nRead = ngfRead;
374      nPower = ngfPower;
375      nGcd  = ndGcd;
376      nLcm  = ndGcd; /* tricky, isn't it ?*/
377      nSetMap=ngfSetMap;
378      nName= ndName;
379      nSize  = ndSize;
380#ifdef LDEBUG
381      nDBTest=ngfDBTest;
382#endif
383    }
384  }
385  /* -------------- long C -----------------------*/
386  else if (rField_is_long_C(r))
387  {
388    setGMPFloatDigits(r->ch_flags);
389#ifdef LDEBUG
390    nDBDelete= ngcDBDelete;
391#else
392    nDelete= ngcDelete;
393#endif
394    if (complete)
395    {
396      nNew=ngcNew;
397      nNormalize=nDummy2;
398      nInit  = ngcInit;
399      nInt   = ngcInt;
400      nAdd   = ngcAdd;
401      nSub   = ngcSub;
402      nMult  = ngcMult;
403      nDiv   = ngcDiv;
404      nExactDiv= ngcDiv;
405      nIntDiv= ngcDiv;
406      nIntMod= ndIntMod; /* dummy !! */
407      nNeg   = ngcNeg;
408      nInvers= ngcInvers;
409      nCopy  = ngcCopy;
410      nGreater = ngcGreater;
411      nEqual = ngcEqual;
412      nIsZero = ngcIsZero;
413      nIsOne = ngcIsOne;
414      nIsMOne = ngcIsMOne;
415      nGreaterZero = ngcGreaterZero;
416      nWrite = ngcWrite;
417      nRead = ngcRead;
418      nPower = ngcPower;
419      nGcd  = ndGcd;
420      nLcm  = ndGcd; /* tricky, isn't it ?*/
421      nSetMap=ngcSetMap;
422      nPar=ngcPar;
423      /*nSize  = ndSize;*/
424#ifdef LDEBUG
425      nDBTest=ngcDBTest;
426#endif
427    }
428  }
429#ifdef TEST
430  else
431  {
432    WerrorS("unknown field");
433  }
434#endif
435  if (complete&&(!errorreported)) nNULL=nInit(0);
436}
437
Note: See TracBrowser for help on using the repository browser.