source: git/factory/gfops.h @ bb20e7

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