source: git/kernel/modulop.h @ f2f460

spielwiese
Last change on this file since f2f460 was 8ce2038, checked in by Hans Schönemann <hannes@…>, 18 years ago
*hannes: bigint stuff git-svn-id: file:///usr/local/Singular/svn/trunk@9090 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.4 KB
Line 
1#ifndef MODULOP_H
2#define MODULOP_H
3/****************************************
4*  Computer Algebra System SINGULAR     *
5****************************************/
6/* $Id: modulop.h,v 1.4 2006-05-02 16:24:22 Singular Exp $ */
7/*
8* ABSTRACT: numbers modulo p (<=32003)
9*/
10#include "structs.h"
11
12// defines are in struct.h
13// define if a*b is with mod instead of tables
14//#define HAVE_MULT_MOD
15// define if a/b is with mod instead of tables
16//#define HAVE_DIV_MOD
17// define if an if should be used
18//#define HAVE_GENERIC_ADD
19
20// enable large primes (32003 < p < 2^31-)
21#define NV_OPS
22#define NV_MAX_PRIME 32003
23
24extern long npPrimeM;
25extern int npGen;
26extern long npMapPrime;
27
28BOOLEAN npGreaterZero (number k);
29number  npMult        (number a, number b);
30number  npInit        (int i);
31int     npInt         (number &n);
32number  npAdd         (number a, number b);
33number  npSub         (number a, number b);
34void    npPower       (number a, int i, number * result);
35BOOLEAN npIsZero      (number a);
36BOOLEAN npIsOne       (number a);
37BOOLEAN npIsMOne       (number a);
38number  npDiv         (number a, number b);
39number  npNeg         (number c);
40number  npInvers      (number c);
41BOOLEAN npGreater     (number a, number b);
42BOOLEAN npEqual       (number a, number b);
43void    npWrite       (number &a);
44char *  npRead        (char *s, number *a);
45#ifdef LDEBUG
46BOOLEAN npDBTest      (number a, char *f, int l);
47#endif
48void    npSetChar(int c, ring r);
49void    npInitChar(int c, ring r);
50
51//int     npGetChar();
52
53nMapFunc npSetMap(ring src, ring dst);
54number  npMapP(number from);
55number  npMap0(number from);
56/*-------specials for spolys, do NOT use otherwise--------------------------*/
57/* for npMultM, npSubM, npNegM, npEqualM : */
58#ifdef HAVE_DIV_MOD
59extern CARDINAL *npInvTable;
60#else
61#ifndef HAVE_MULT_MOD
62extern long npPminus1M;
63extern CARDINAL *npExpTable;
64extern CARDINAL *npLogTable;
65#endif
66#endif
67
68#if 0
69inline number npMultM(number a, number b)
70// return (a*b)%n
71{
72   double ab;
73   long q, res;
74
75   ab = ((double) ((int)a)) * ((double) ((int)b));
76   q  = (long) (ab/((double) npPrimeM));  // q could be off by (+/-) 1
77   res = (long) (ab - ((double) q)*((double) npPrimeM));
78   res += (res >> 31) & npPrimeM;
79   res -= npPrimeM;
80   res += (res >> 31) & npPrimeM;
81   return (number)res;
82}
83#endif
84#ifdef HAVE_MULT_MOD
85static inline number npMultM(number a, number b)
86{
87  return (number) 
88    ((((unsigned long) a)*((unsigned long) b)) % ((unsigned long) npPrimeM));
89}
90#else
91static inline number npMultM(number a, number b)
92{
93  long x = (long)npLogTable[(long)a]+npLogTable[(long)b];
94  return (number)(long)npExpTable[x<npPminus1M ? x : x-npPminus1M];
95}
96#endif
97
98#if 0
99inline number npAddAsm(number a, number b, int m)
100{
101  number r;
102    asm ("addl %2, %1; cmpl %3, %1; jb 0f; subl %3, %1; 0:"
103         : "=&r" (r)
104         : "%0" (a), "g" (b), "g" (m)
105         : "cc");
106  return r;
107}
108inline number npSubAsm(number a, number b, int m)
109{
110  number r;
111  asm ("subl %2, %1; jnc 0f; addl %3, %1; 0:"
112        : "=&r" (r)
113        : "%0" (a), "g" (b), "g" (m)
114        : "cc");
115  return r;
116}
117#endif
118#ifdef HAVE_GENERIC_ADD
119static inline number npAddM(number a, number b)
120{
121  long r = (long)a + (long)b;
122  return (number)(r >= npPrimeM ? r - npPrimeM : r);
123}
124static inline number npSubM(number a, number b)
125{
126  return (number)((long)a<(long)b ?
127                       npPrimeM-(long)b+(long)a : (long)a-(long)b);
128}
129#else
130static inline number npAddM(number a, number b)
131{
132   long res = ((long)a + (long)b);
133   res -= npPrimeM;
134#if SIZEOF_LONG == 8
135   res += (res >> 63) & npPrimeM;
136#else
137   res += (res >> 31) & npPrimeM;
138#endif
139   return (number)res;
140}
141static inline number npSubM(number a, number b)
142{
143   long res = ((long)a - (long)b);
144#if SIZEOF_LONG == 8
145   res += (res >> 63) & npPrimeM;
146#else
147   res += (res >> 31) & npPrimeM;
148#endif
149   return (number)res;
150}
151#endif
152
153static inline BOOLEAN npIsZeroM (number  a)
154{
155  return 0 == (long)a;
156}
157
158/*
159*inline number npMultM(number a, number b)
160*{
161*  return (number)(((long)a*(long)b) % npPrimeM);
162*}
163*/
164
165#define npNegM(A)      (number)(npPrimeM-(long)(A))
166#define npEqualM(A,B)  ((A)==(B))
167
168
169#ifdef NV_OPS
170static inline number nvMultM(number a, number b)
171{
172#if SIZEOF_LONG == 4
173#define ULONG64 unsigned long long
174#else
175#define ULONG64 unsigned long
176#endif
177  return (number) 
178    ((((ULONG64) a)*((ULONG64) b)) % ((ULONG64) npPrimeM));
179}
180number  nvMult        (number a, number b);
181number  nvDiv         (number a, number b);
182number  nvInvers      (number c);
183#endif
184
185#endif
Note: See TracBrowser for help on using the repository browser.