source: git/factory/gfops.h @ 25c3c2b

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