source: git/factory/gfops.h @ 2537fa0

spielwiese
Last change on this file since 2537fa0 was 8710ff0, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: 64bit integers in factory by Adi Popescu
  • Property mode set to 100644
File size: 3.6 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3#ifndef INCL_GFOPS_H
4#define INCL_GFOPS_H
5
6// #include "config.h"
7
8#ifndef NOSTREAMIO
9#ifdef HAVE_IOSTREAM
10#include <iostream>
11#define OSTREAM std::ostream
12#elif defined(HAVE_IOSTREAM_H)
13#include <iostream.h>
14#define OSTREAM ostream
15#endif
16#endif /* NOSTREAMIO */
17
18#include "cf_assert.h"
19
20#include "cf_defs.h"
21#include "canonicalform.h"
22
23extern int gf_q;
24extern int gf_p;
25extern int gf_n;
26extern int gf_q1;
27extern int gf_m1;
28extern char gf_name;
29
30extern unsigned short * gf_table;
31
32extern CanonicalForm gf_mipo;
33
34//{{{ predicates
35inline bool gf_iszero ( int a )
36{
37    return gf_q == a;
38}
39
40inline bool gf_iszero ( long a )
41{
42    return gf_q == a;
43}
44
45inline bool gf_isone ( int a )
46{
47    return 0 == a;
48}
49
50inline bool gf_isone ( long a )
51{
52    return 0 == a;
53}
54//}}}
55
56//{{{ conversion functions
57inline int gf_int2gf ( int i )
58{
59    while ( i < 0 )
60        i += gf_p;
61    while ( i >= gf_p )
62        i -= gf_p;
63    if ( i == 0 )
64        return gf_q;
65    int c = 0;
66    while ( i > 1 ) {
67        c = gf_table[c];
68        i--;
69    }
70    return c;
71}
72
73inline long gf_int2gf ( long i )
74{
75    while ( i < 0 )
76        i += gf_p;
77    while ( i >= gf_p )
78        i -= gf_p;
79    if ( i == 0 )
80        return gf_q;
81    long c = 0;
82    while ( i > 1 ) {
83        c = gf_table[c];
84        i--;
85    }
86    return c;
87}
88//}}}
89
90//{{{ zero and one
91inline int gf_zero()
92{
93    return gf_q;
94}
95
96inline int gf_one()
97{
98    return 0;
99}
100//}}}
101
102//{{{ inline int gf_sign ( int a )
103// docu: see imm_sign()
104inline
105int gf_sign ( int a )
106{
107    if ( gf_iszero( a ) )
108        return 0;
109    else
110        return 1;
111}
112//}}}
113
114//{{{ arithmetic operators
115inline int gf_neg ( int a )
116{
117    // -z^a=z^a*(-1)=z^a*gf_m1;
118    if ( a == gf_q ) return a;
119    int i = a + gf_m1;
120    if ( i >= gf_q1 )
121        i -= gf_q1;
122    return i;
123}
124
125inline int gf_add ( int a, int b )
126{
127    // z^a+z^b=z^b*(z^(a-b)+1), if a>=b;
128    //        =z^a*(z^(b-a)+1), if a<b;
129    if ( a == gf_q ) return b;
130    if ( b == gf_q ) return a;
131    int zb, zab, r;
132    if ( a >= b ) {
133        zb = b;
134        zab = a - b;
135    }
136    else {
137        zb = a;
138        zab = b - a;
139    }
140    if ( gf_table[zab] == gf_q )
141        r = gf_q; /*if z^(a-b)+1 =0*/
142    else {
143        r= zb + gf_table[zab];
144        if ( r >= gf_q1 )
145            r -= gf_q1;
146    }
147    return r;
148}
149
150inline int gf_sub ( int a, int b )
151{
152    return gf_add( a, gf_neg( b ) );
153}
154
155inline int gf_mul ( int a, int b )
156{
157    if ( a == gf_q || b == gf_q )
158        return gf_q;
159    else {
160        int i = a + b;
161        if ( i >= gf_q1 ) i -= gf_q1;
162        return i;
163    }
164}
165
166inline long gf_mul ( long a, int b )
167{
168    if ( a == gf_q || b == gf_q )
169        return gf_q;
170    else {
171        long i = a + b;
172        if ( i >= gf_q1 ) i -= gf_q1;
173        return i;
174    }
175}
176
177inline int gf_div ( int a, int b )
178{
179    ASSERT( b != gf_q, "divide by zero" );
180    if ( a == gf_q )
181        return gf_q;
182    else {
183        int s = a - b;
184        if (s < 0)
185            s += gf_q1;
186        return s;
187    }
188}
189
190inline int gf_inv ( int a )
191{
192    ASSERT( a != gf_q, "divide by zero" );
193    return gf_q1 - a;
194}
195//}}}
196
197//{{{ input/output
198#ifndef NOSTREAMIO
199inline void gf_print ( OSTREAM & os, int a )
200{
201    if ( a == gf_q )
202        os << "0";
203    else  if ( a == 0 )
204        os << "1";
205    else  if ( a == 1 )
206        os << gf_name;
207    else
208        os << gf_name << "^" << a;
209}
210#endif /* NOSTREAMIO */
211//}}}
212
213//{{{ exponentation
214inline int gf_power ( int a, int n )
215{
216    if ( n == 0 )
217        return 0;
218    else if ( n == 1 )
219        return a;
220    else
221        return gf_mul( a, gf_power( a, n-1 ) );
222}
223
224inline long gf_power ( long a, int n )
225{
226    if ( n == 0 )
227        return 0;
228    else if ( n == 1 )
229        return a;
230    else
231        return gf_mul( a, gf_power( a, n-1 ) );
232}
233//}}}
234
235void gf_setcharacteristic ( int p, int n, char name );
236
237// Singular needs this
238/*BEGINPUBLIC*/
239
240long gf_gf2ff ( long a );
241int gf_gf2ff ( int a );
242
243bool gf_isff ( long a );
244bool gf_isff ( int a );
245
246/*ENDPUBLIC*/
247
248#endif /* ! INCL_GFOPS_H */
Note: See TracBrowser for help on using the repository browser.