source: git/factory/gfops.h @ 362fc67

jengelh-datetimespielwiese
Last change on this file since 362fc67 was 362fc67, checked in by Martin Lee <martinlee84@…>, 11 years ago
chg: remove $Id$
  • Property mode set to 100644
File size: 3.0 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_isone ( int a )
41{
42    return 0 == a;
43}
44//}}}
45
46//{{{ conversion functions
47inline int gf_int2gf ( int i )
48{
49    while ( i < 0 )
50        i += gf_p;
51    while ( i >= gf_p )
52        i -= gf_p;
53    if ( i == 0 )
54        return gf_q;
55    int c = 0;
56    while ( i > 1 ) {
57        c = gf_table[c];
58        i--;
59    }
60    return c;
61}
62//}}}
63
64//{{{ zero and one
65inline int gf_zero()
66{
67    return gf_q;
68}
69
70inline int gf_one()
71{
72    return 0;
73}
74//}}}
75
76//{{{ inline int gf_sign ( int a )
77// docu: see imm_sign()
78inline
79int gf_sign ( int a )
80{
81    if ( gf_iszero( a ) )
82        return 0;
83    else
84        return 1;
85}
86//}}}
87
88//{{{ arithmetic operators
89inline int gf_neg ( int a )
90{
91    // -z^a=z^a*(-1)=z^a*gf_m1;
92    if ( a == gf_q ) return a;
93    int i = a + gf_m1;
94    if ( i >= gf_q1 )
95        i -= gf_q1;
96    return i;
97}
98
99inline int gf_add ( int a, int b )
100{
101    // z^a+z^b=z^b*(z^(a-b)+1), if a>=b;
102    //        =z^a*(z^(b-a)+1), if a<b;
103    if ( a == gf_q ) return b;
104    if ( b == gf_q ) return a;
105    int zb, zab, r;
106    if ( a >= b ) {
107        zb = b;
108        zab = a - b;
109    }
110    else {
111        zb = a;
112        zab = b - a;
113    }
114    if ( gf_table[zab] == gf_q )
115        r = gf_q; /*if z^(a-b)+1 =0*/
116    else {
117        r= zb + gf_table[zab];
118        if ( r >= gf_q1 )
119            r -= gf_q1;
120    }
121    return r;
122}
123
124inline int gf_sub ( int a, int b )
125{
126    return gf_add( a, gf_neg( b ) );
127}
128
129inline int gf_mul ( int a, int b )
130{
131    if ( a == gf_q || b == gf_q )
132        return gf_q;
133    else {
134        int i = a + b;
135        if ( i >= gf_q1 ) i -= gf_q1;
136        return i;
137    }
138}
139
140inline int gf_div ( int a, int b )
141{
142    ASSERT( b != gf_q, "divide by zero" );
143    if ( a == gf_q )
144        return gf_q;
145    else {
146        int s = a - b;
147        if (s < 0)
148            s += gf_q1;
149        return s;
150    }
151}
152
153inline int gf_inv ( int a )
154{
155    ASSERT( a != gf_q, "divide by zero" );
156    return gf_q1 - a;
157}
158//}}}
159
160//{{{ input/output
161#ifndef NOSTREAMIO
162inline void gf_print ( OSTREAM & os, int a )
163{
164    if ( a == gf_q )
165        os << "0";
166    else  if ( a == 0 )
167        os << "1";
168    else  if ( a == 1 )
169        os << gf_name;
170    else
171        os << gf_name << "^" << a;
172}
173#endif /* NOSTREAMIO */
174//}}}
175
176//{{{ exponentation
177inline int gf_power ( int a, int n )
178{
179    if ( n == 0 )
180        return 0;
181    else if ( n == 1 )
182        return a;
183    else
184        return gf_mul( a, gf_power( a, n-1 ) );
185}
186//}}}
187
188void gf_setcharacteristic ( int p, int n, char name );
189
190// Singular needs this
191/*BEGINPUBLIC*/
192
193int gf_gf2ff ( int a );
194
195bool gf_isff ( int a );
196
197/*ENDPUBLIC*/
198
199#endif /* ! INCL_GFOPS_H */
Note: See TracBrowser for help on using the repository browser.