source: git/factory/gfops.h @ e4fe2b

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