source: git/factory/gfops.h @ 493c477

spielwiese
Last change on this file since 493c477 was 493c477, checked in by Jens Schmidt <schmidt@…>, 27 years ago
o header fixed git-svn-id: file:///usr/local/Singular/svn/trunk@404 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.7 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id: gfops.h,v 1.3 1997-06-19 12:22:57 schmidt Exp $ */
3
4#ifndef INCL_GFOPS_H
5#define INCL_GFOPS_H
6
7#include <config.h>
8
9#ifndef NOSTREAMIO
10#include <iostream.h>
11#endif /* NOSTREAMIO */
12
13#include "assert.h"
14
15#include "cf_defs.h"
16#include "canonicalform.h"
17
18extern int gf_q;
19extern int gf_p;
20extern int gf_n;
21extern int gf_q1;
22extern int gf_m1;
23extern char gf_name;
24
25extern unsigned short * gf_table;
26
27extern CanonicalForm gf_mipo;
28
29inline int gf_int2gf ( int i )
30{
31    while ( i < 0 )
32        i += gf_p;
33    while ( i >= gf_p )
34        i -= gf_p;
35    if ( i == 0 )
36        return gf_q;
37    int c = 0;
38    while ( i > 1 ) {
39        c = gf_table[c];
40        i--;
41    }
42    return c;
43}
44
45inline bool gf_iszero ( int a )
46{
47    return gf_q == a;
48}
49
50inline int gf_zero()
51{
52    return gf_q;
53}
54
55inline bool gf_isone ( int a )
56{
57    return 0 == a;
58}
59
60inline int gf_one()
61{
62    return 0;
63}
64
65inline int gf_sign ( int a )
66{
67    if ( gf_iszero( a ) )
68        return 0;
69    else
70        return 1;
71}
72
73inline int gf_neg ( int a )
74{
75    // -z^a=z^a*(-1)=z^a*gf_m1;
76    if ( a == gf_q ) return a;
77    int i = a + gf_m1;
78    if ( i >= gf_q1 )
79        i -= gf_q1;
80    return i;
81}
82
83inline int gf_add ( int a, int b )
84{
85    // z^a+z^b=z^b*(z^(a-b)+1), if a>=b;
86    //        =z^a*(z^(b-a)+1), if a<b;
87    if ( a == gf_q ) return b;
88    if ( b == gf_q ) return a;
89    int zb, zab, r;
90    if ( a >= b ) {
91        zb = b;
92        zab = a - b;
93    }
94    else {
95        zb = a;
96        zab = b - a;
97    }
98    if ( gf_table[zab] == gf_q )
99        r = gf_q; /*if z^(a-b)+1 =0*/
100    else {
101        r= zb + gf_table[zab];
102        if ( r >= gf_q1 )
103            r -= gf_q1;
104    }
105    return r;
106}
107
108inline int gf_sub ( int a, int b )
109{
110    return gf_add( a, gf_neg( b ) );
111}
112
113inline int gf_mul ( int a, int b )
114{
115    if ( a == gf_q || b == gf_q )
116        return gf_q;
117    else {
118        int i = a + b;
119        if ( i >= gf_q1 ) i -= gf_q1;
120        return i;
121    }
122}
123
124inline int gf_div ( int a, int b )
125{
126    ASSERT( b != gf_q, "divide by zero" );
127    if ( a == gf_q )
128        return gf_q;
129    else {
130        int s = a - b;
131        if (s < 0)
132            s += gf_q1;
133        return s;
134    }
135}
136
137inline int gf_inv ( int a )
138{
139    ASSERT( a != gf_q, "divide by zero" );
140    return gf_q1 - a;
141}
142
143#ifndef NOSTREAMIO
144inline void gf_print ( ostream & os, int a )
145{
146    if ( a == gf_q )
147        os << "0";
148    else  if ( a == 0 )
149        os << "1";
150    else  if ( a == 1 )
151        os << gf_name;
152    else
153        os << gf_name << "^" << a;
154}
155#endif /* NOSTREAMIO */
156
157inline int gf_power ( int a, int n )
158{
159    if ( n == 0 )
160        return 0;
161    else if ( n == 1 )
162        return a;
163    else
164        return gf_mul( a, gf_power( a, n-1 ) );
165}
166
167void gf_setcharacteristic ( int p, int n, char name );
168
169// Singular needs this
170/*BEGINPUBLIC*/
171
172int gf_gf2ff ( int a );
173
174bool gf_isff ( int a );
175
176/*ENDPUBLIC*/
177
178#endif /* ! INCL_GFOPS_H */
Note: See TracBrowser for help on using the repository browser.