source: git/kernel/rintegers.cc @ af378f7

spielwiese
Last change on this file since af378f7 was af378f7, checked in by Oliver Wienand <wienand@…>, 16 years ago
anpassungen an gmp git-svn-id: file:///usr/local/Singular/svn/trunk@10538 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: rintegers.cc,v 1.6 2008-01-30 18:49:43 wienand Exp $ */
5/*
6* ABSTRACT: numbers modulo n
7*/
8
9#include <string.h>
10#include "mod2.h"
11#include <mylimits.h>
12#include "structs.h"
13#include "febase.h"
14#include "omalloc.h"
15#include "numbers.h"
16#include "longrat.h"
17#include "mpr_complex.h"
18#include "ring.h"
19#include "rintegers.h"
20#include "gmp.h"
21
22#ifdef HAVE_RINGZ
23
24typedef MP_INT *int_number;
25
26/*
27 * Multiply two numbers
28 */
29number nrzMult (number a, number b)
30{
31  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
32  mpz_init(erg);
33  mpz_mul(erg, (int_number) a, (int_number) b);
34  return (number) erg;
35}
36
37/*
38 * Give the smallest non unit k, such that a * x = k = b * y has a solution
39 */
40number nrzLcm (number a,number b,ring r)
41{
42  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
43  mpz_init(erg);
44  mpz_lcm(erg, (int_number) a, (int_number) b);
45  return (number) erg;
46}
47
48/*
49 * Give the largest non unit k, such that a = x * k, b = y * k has
50 * a solution.
51 */
52number nrzGcd (number a,number b,ring r)
53{
54  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
55  mpz_init(erg);
56  mpz_gcd(erg, (int_number) a, (int_number) b);
57  return (number) erg;
58}
59
60/*
61 * Give the largest non unit k, such that a = x * k, b = y * k has
62 * a solution and r, s, s.t. k = s*a + t*b
63 */
64number  nrzExtGcd (number a, number b, number *s, number *t)
65{
66  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
67  int_number bs = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
68  int_number bt = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
69  mpz_init(erg);
70  mpz_init(bs);
71  mpz_init(bt);
72  mpz_gcdext(erg, bs, bt, (int_number) a, (int_number) b);
73  *s = (number) bs;
74  *t = (number) bt;
75  return (number) erg;
76}
77
78void nrzPower (number a, int i, number * result)
79{
80  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
81  mpz_init(erg);
82  mpz_pow_ui(erg, (int_number) a, i);
83  *result = (number) erg;
84}
85
86/*
87 * create a number from int
88 */
89number nrzInit (int i)
90{
91  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
92  mpz_init_set_si(erg, i);
93  return (number) erg;
94}
95
96void nrzDelete(number *a, const ring r)
97{
98  mpz_clear((int_number) *a);
99  omFree((ADDRESS) *a);
100}
101
102/*
103 * convert a number to int (-p/2 .. p/2)
104 */
105int nrzInt(number &n)
106{
107  return (int) mpz_get_si( (int_number) &n);
108}
109
110number nrzAdd (number a, number b)
111{
112  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
113  mpz_init(erg);
114  mpz_add(erg, (int_number) a, (int_number) b);
115  return (number) erg;
116}
117
118number nrzSub (number a, number b)
119{
120  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
121  mpz_init(erg);
122  mpz_sub(erg, (int_number) a, (int_number) b);
123  return (number) erg;
124}
125
126number  nrzGetUnit (number a)
127{
128  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
129  mpz_init_set_si(erg, 1);
130  return (number) erg;
131}
132
133BOOLEAN nrzIsUnit (number a)
134{
135  return 0 == mpz_cmpabs_ui((int_number) a, 1);
136}
137
138BOOLEAN nrzIsZero (number  a)
139{
140  return 0 == mpz_cmpabs_ui((int_number) a, 0);
141}
142
143BOOLEAN nrzIsOne (number a)
144{
145  return 0 == mpz_cmp_si((int_number) a, 1);
146}
147
148BOOLEAN nrzIsMOne (number a)
149{
150  return 0 == mpz_cmp_si((int_number) a, -1);
151}
152
153BOOLEAN nrzEqual (number a,number b)
154{
155  return 0 == mpz_cmp((int_number) a, (int_number) b);
156}
157
158BOOLEAN nrzGreater (number a,number b)
159{
160  return 0 < mpz_cmp((int_number) a, (int_number) b);
161}
162
163BOOLEAN nrzGreaterZero (number k)
164{
165  return 0 <= mpz_cmp_si((int_number) k, 0);
166}
167
168int nrzComp(number a, number b)
169{
170  if (nrzEqual(a, b)) return 0;
171  if (nrzDivBy(a, b)) return -1;
172  if (nrzDivBy(b, a)) return 1;
173  return 2;
174}
175
176BOOLEAN nrzDivBy (number a,number b)
177{
178  return mpz_divisible_p((int_number) a, (int_number) b) != 0;
179}
180
181number nrzDiv (number a,number b)
182{
183  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
184  int_number r = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
185  mpz_init(erg);
186  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
187  if (!nrzIsZero((number) r))
188  {
189    WarnS("Division by non divisible element.");
190    WarnS("Result is without remainder.");
191  }
192  mpz_clear(r);
193  omFree(r);
194  return (number) erg;
195}
196
197number nrzIntDiv (number a,number b)
198{
199  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
200  mpz_init(erg);
201  mpz_tdiv_q(erg, (int_number) a, (int_number) b);
202  return (number) erg;
203}
204
205number  nrzInvers (number c)
206{
207  if (!nrzIsUnit((number) c))
208  {
209    WarnS("Non invertible element.");
210    return (number)0; //TODO
211  }
212  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
213  mpz_init(erg);
214  mpz_set(erg, (int_number) c);
215  return (number) erg;
216}
217
218number nrzNeg (number c)
219{
220  int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
221  mpz_init(erg);
222  mpz_mul_si(erg, (int_number) c, -1);
223  return (number) erg;
224}
225
226nMapFunc nrzSetMap(ring src, ring dst)
227{
228  return NULL;      /* default */
229}
230
231
232/*
233 * set the exponent (allocate and init tables) (TODO)
234 */
235
236void nrzSetExp(int m, ring r)
237{
238}
239
240void nrzInitExp(int m, ring r)
241{
242}
243
244#ifdef LDEBUG
245BOOLEAN nrzDBTest (number a, char *f, int l)
246{
247  return TRUE;//TODO
248}
249#endif
250
251void nrzWrite (number &a)
252{
253  char *s,*z;
254  if (a==NULL)
255  {
256    StringAppendS("o");
257  }
258  else
259  {
260    int l=mpz_sizeinbase((int_number) a, 10);
261    if (a->s<2) l=si_max(l,mpz_sizeinbase((int_number) a,10));
262    l+=2;
263    s=(char*)omAlloc(l);
264    z=mpz_get_str(s,10,(int_number) a);
265    StringAppendS(z);
266    omFreeSize((ADDRESS)s,l);
267  }
268}
269
270/*2
271* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
272*/
273char * nlEatLongC(char *s, MP_INT *i)
274{
275  char * start=s;
276  if (!(*s >= '0' && *s <= '9'))
277  {
278    mpz_init_set_si(i, 1);
279    return s;
280  }
281  mpz_init(i);
282  while (*s >= '0' && *s <= '9') s++;
283  if (*s=='\0')
284  {
285    mpz_set_str(i,start,10);
286  }
287  else
288  {
289    char c=*s;
290    *s='\0';
291    mpz_set_str(i,start,10);
292    *s=c;
293  }
294  return s;
295}
296
297
298char * nrzRead (char *s, number *a)
299{
300  int_number z = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin
301  {
302    mpz_init(z);
303    s = nlEatLongC(s, z);
304  }
305  *a = (number) z;
306  return s;
307}
308#endif
Note: See TracBrowser for help on using the repository browser.