source: git/libpolys/coeffs/rintegers.cc @ 9bb5457

spielwiese
Last change on this file since 9bb5457 was 9bb5457, checked in by Hans Schoenemann <hannes@…>, 13 years ago
fixed warning about unused paramaters in coeffs
  • Property mode set to 100644
File size: 9.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id$ */
5/*
6* ABSTRACT: numbers modulo n
7*/
8#include "config.h"
9#include <misc/auxiliary.h>
10
11#ifdef HAVE_RINGS
12
13#include <string.h>
14#include <misc/mylimits.h>
15#include <coeffs/coeffs.h>
16#include <reporter/reporter.h>
17#include <omalloc/omalloc.h>
18#include <coeffs/numbers.h>
19#include <coeffs/longrat.h>
20#include <coeffs/mpr_complex.h>
21#include <coeffs/rintegers.h>
22#include "si_gmp.h"
23
24/// Our Type!
25static const n_coeffType ID = n_Z;
26
27omBin gmp_nrz_bin = omGetSpecBin(sizeof(mpz_t));
28
29/*
30 * Multiply two numbers
31 */
32number nrzMult (number a, number b, const coeffs)
33{
34  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
35  mpz_init(erg);
36  mpz_mul(erg, (int_number) a, (int_number) b);
37  return (number) erg;
38}
39
40/*
41 * Give the smallest non unit k, such that a * x = k = b * y has a solution
42 */
43number nrzLcm (number a,number b,const coeffs)
44{
45  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
46  mpz_init(erg);
47  mpz_lcm(erg, (int_number) a, (int_number) b);
48  return (number) erg;
49}
50
51/*
52 * Give the largest non unit k, such that a = x * k, b = y * k has
53 * a solution.
54 */
55number nrzGcd (number a,number b,const coeffs)
56{
57  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
58  mpz_init(erg);
59  mpz_gcd(erg, (int_number) a, (int_number) b);
60  return (number) erg;
61}
62
63/*
64 * Give the largest non unit k, such that a = x * k, b = y * k has
65 * a solution and r, s, s.t. k = s*a + t*b
66 */
67number  nrzExtGcd (number a, number b, number *s, number *t, const coeffs)
68{
69  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
70  int_number bs = (int_number) omAllocBin(gmp_nrz_bin);
71  int_number bt = (int_number) omAllocBin(gmp_nrz_bin);
72  mpz_init(erg);
73  mpz_init(bs);
74  mpz_init(bt);
75  mpz_gcdext(erg, bs, bt, (int_number) a, (int_number) b);
76  *s = (number) bs;
77  *t = (number) bt;
78  return (number) erg;
79}
80
81void nrzPower (number a, int i, number * result, const coeffs)
82{
83  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
84  mpz_init(erg);
85  mpz_pow_ui(erg, (int_number) a, i);
86  *result = (number) erg;
87}
88
89/*
90 * create a number from int
91 */
92number nrzInit (int i, const coeffs)
93{
94  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
95  mpz_init_set_si(erg, i);
96  return (number) erg;
97}
98
99void nrzDelete(number *a, const coeffs)
100{
101  if (*a == NULL) return;
102  mpz_clear((int_number) *a);
103  omFreeBin((ADDRESS) *a, gmp_nrz_bin);
104  *a = NULL;
105}
106
107number nrzCopy(number a, const coeffs)
108{
109  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
110  mpz_init_set(erg, (int_number) a);
111  return (number) erg;
112}
113
114number nrzCopyMap(number a, const coeffs /*src*/, const coeffs dst)
115{
116  return nrzCopy(a,dst);
117}
118
119int nrzSize(number a, const coeffs)
120{
121  if (a == NULL) return 0;
122  return sizeof(mpz_t);
123}
124
125/*
126 * convert a number to int
127 */
128int nrzInt(number &n, const coeffs)
129{
130  return (int) mpz_get_si( (int_number)n);
131}
132
133number nrzAdd (number a, number b, const coeffs)
134{
135  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
136  mpz_init(erg);
137  mpz_add(erg, (int_number) a, (int_number) b);
138  return (number) erg;
139}
140
141number nrzSub (number a, number b, const coeffs)
142{
143  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
144  mpz_init(erg);
145  mpz_sub(erg, (int_number) a, (int_number) b);
146  return (number) erg;
147}
148
149number  nrzGetUnit (number, const coeffs r)
150{
151  return nrzInit(1, r);
152}
153
154BOOLEAN nrzIsUnit (number a, const coeffs)
155{
156  return 0 == mpz_cmpabs_ui((int_number) a, 1);
157}
158
159BOOLEAN nrzIsZero (number  a, const coeffs)
160{
161  return 0 == mpz_cmpabs_ui((int_number) a, 0);
162}
163
164BOOLEAN nrzIsOne (number a, const coeffs)
165{
166  return (a!=NULL) && (0 == mpz_cmp_si((int_number) a, 1));
167}
168
169BOOLEAN nrzIsMOne (number a, const coeffs)
170{
171  return (a!=NULL) && (0 == mpz_cmp_si((int_number) a, -1));
172}
173
174BOOLEAN nrzEqual (number a,number b, const coeffs)
175{
176  return 0 == mpz_cmp((int_number) a, (int_number) b);
177}
178
179BOOLEAN nrzGreater (number a,number b, const coeffs)
180{
181  return 0 < mpz_cmp((int_number) a, (int_number) b);
182}
183
184BOOLEAN nrzGreaterZero (number k, const coeffs)
185{
186  return 0 < mpz_cmp_si((int_number) k, 0);
187}
188
189int nrzDivComp(number a, number b, const coeffs r)
190{
191  if (nrzDivBy(a, b, r))
192  {
193    if (nrzDivBy(b, a, r)) return 2;
194    return -1;
195  }
196  if (nrzDivBy(b, a, r)) return 1;
197  return 0;
198}
199
200BOOLEAN nrzDivBy (number a,number b, const coeffs)
201{
202  return mpz_divisible_p((int_number) a, (int_number) b) != 0;
203}
204
205number nrzDiv (number a,number b, const coeffs R)
206{
207  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
208  mpz_init(erg);
209  int_number r = (int_number) omAllocBin(gmp_nrz_bin);
210  mpz_init(r);
211  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
212  if (!nrzIsZero((number) r, R))
213  {
214    WerrorS("Division by non divisible element.");
215    WerrorS("Result is without remainder.");
216  }
217  mpz_clear(r);
218  omFreeBin(r, gmp_nrz_bin);
219  return (number) erg;
220}
221
222number nrzIntDiv (number a,number b, const coeffs)
223{
224  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
225  mpz_init(erg);
226  mpz_tdiv_q(erg, (int_number) a, (int_number) b);
227  return (number) erg;
228}
229
230number nrzIntMod (number a,number b, const coeffs)
231{
232  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
233  mpz_init(erg);
234  int_number r = (int_number) omAllocBin(gmp_nrz_bin);
235  mpz_init(r);
236  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
237  mpz_clear(erg);
238  return (number) r;
239}
240
241number  nrzInvers (number c, const coeffs r)
242{
243  if (!nrzIsUnit((number) c, r))
244  {
245    WerrorS("Non invertible element.");
246    return (number)0; //TODO
247  }
248  return nrzCopy(c,r);
249}
250
251number nrzNeg (number c, const coeffs)
252{
253// nNeg inplace !!!
254  mpz_mul_si((int_number) c, (int_number) c, -1);
255  return c;
256}
257
258number nrzMapMachineInt(number from, const coeffs /*src*/, const coeffs /*dst*/)
259{
260  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
261  mpz_init_set_ui(erg, (NATNUMBER) from);
262  return (number) erg;
263}
264
265number nrzMapZp(number from, const coeffs /*src*/, const coeffs /*dst*/)
266{
267  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
268  mpz_init_set_si(erg, (long) from);
269  return (number) erg;
270}
271
272number nrzMapQ(number from, const coeffs src, const coeffs /*dst*/)
273{
274  int_number erg = (int_number) omAllocBin(gmp_nrz_bin);
275  mpz_init(erg);
276  nlGMP(from, (number) erg, src);
277  return (number) erg;
278}
279
280nMapFunc nrzSetMap(const coeffs src, const coeffs dst)
281{
282  /* dst = currRing */
283  if (nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src))
284  {
285    return nrzCopyMap;
286  }
287  if (nCoeff_is_Ring_2toM(src))
288  {
289    return nrzMapMachineInt;
290  }
291  if (nCoeff_is_Zp(src))
292  {
293    return nrzMapZp;
294  }
295  if (nCoeff_is_Q(src))
296  {
297    return nrzMapQ;
298  }
299  return NULL;      // default
300}
301
302
303/*
304 * set the exponent (allocate and init tables) (TODO)
305 */
306
307void nrzSetExp(int, coeffs)
308{
309}
310
311void nrzInitExp(int, coeffs)
312{
313}
314
315#ifdef LDEBUG
316BOOLEAN nrzDBTest (number, const char *, const int, const coeffs)
317{
318  return TRUE;//TODO
319}
320#endif
321
322void nrzWrite (number &a, const coeffs)
323{
324  char *s,*z;
325  if (a==NULL)
326  {
327    StringAppendS("o");
328  }
329  else
330  {
331    int l=mpz_sizeinbase((int_number) a, 10) + 2;
332    s=(char*)omAlloc(l);
333    z=mpz_get_str(s,10,(int_number) a);
334    StringAppendS(z);
335    omFreeSize((ADDRESS)s,l);
336  }
337}
338
339/*2
340* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
341*/
342static const char * nlEatLongC(char *s, mpz_ptr i)
343{
344  const char * start=s;
345
346  if (*s<'0' || *s>'9')
347  {
348    mpz_set_si(i,1);
349    return s;
350  }
351  while (*s >= '0' && *s <= '9') s++;
352  if (*s=='\0')
353  {
354    mpz_set_str(i,start,10);
355  }
356  else
357  {
358    char c=*s;
359    *s='\0';
360    mpz_set_str(i,start,10);
361    *s=c;
362  }
363  return s;
364}
365
366const char * nrzRead (const char *s, number *a, const coeffs)
367{
368  int_number z = (int_number) omAllocBin(gmp_nrz_bin);
369  {
370    mpz_init(z);
371    s = nlEatLongC((char *) s, z);
372  }
373  *a = (number) z;
374  return s;
375}
376
377void    nrzCoeffWrite  (const coeffs)
378{
379  PrintS("//   characteristic : 0 (Integers)\n");
380}
381
382
383BOOLEAN nrzInitChar(coeffs r,  void *)
384{
385  assume( getCoeffType(r) == ID );
386  r->cfSetChar= NULL;
387  r->nCoeffIsEqual = ndCoeffIsEqual;
388  r->cfKillChar = ndKillChar;
389  r->cfMult  = nrzMult;
390  r->cfSub   = nrzSub;
391  r->cfAdd   = nrzAdd;
392  r->cfDiv   = nrzDiv;
393  r->cfIntDiv= nrzDiv;
394  r->cfIntMod= nrzIntMod;
395  r->cfExactDiv= nrzDiv;
396  r->cfInit = nrzInit;
397  r->cfSize  = nrzSize;
398  r->cfInt  = nrzInt;
399  //#ifdef HAVE_RINGS
400  r->cfDivComp = nrzDivComp; // only for ring stuff
401  r->cfIsUnit = nrzIsUnit; // only for ring stuff
402  r->cfGetUnit = nrzGetUnit; // only for ring stuff
403  r->cfExtGcd = nrzExtGcd; // only for ring stuff
404  r->cfDivBy = nrzDivBy; // only for ring stuff
405  //#endif
406  r->cfNeg   = nrzNeg;
407  r->cfInvers= nrzInvers;
408  r->cfCopy  = nrzCopy;
409  r->cfWrite = nrzWrite;
410  r->cfRead = nrzRead;
411  r->cfGreater = nrzGreater;
412  r->cfEqual = nrzEqual;
413  r->cfIsZero = nrzIsZero;
414  r->cfIsOne = nrzIsOne;
415  r->cfIsMOne = nrzIsMOne;
416  r->cfGreaterZero = nrzGreaterZero;
417  r->cfPower = nrzPower;
418  r->cfGcd  = nrzGcd;
419  r->cfLcm  = nrzGcd;
420  r->cfDelete= nrzDelete;
421  r->cfSetMap = nrzSetMap;
422  r->cfCoeffWrite = nrzCoeffWrite;
423  // debug stuff
424
425#ifdef LDEBUG
426  r->cfDBTest=nrzDBTest;
427#endif
428
429  r->nNULL = 0;
430  r->ch = 0;
431  r->ringtype = 4;
432  r->has_simple_Alloc=FALSE;
433  r->has_simple_Inverse=FALSE;
434  return FALSE;
435}
436
437#endif
Note: See TracBrowser for help on using the repository browser.