source: git/factory/gfops.h @ 987a48

spielwiese
Last change on this file since 987a48 was 987a48, checked in by Jens Schmidt <schmidt@…>, 27 years ago
* gfops.h (gf_sign): doc fix git-svn-id: file:///usr/local/Singular/svn/trunk@692 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.4 1997-09-10 14:14:39 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
65//{{{ inline int gf_sign ( int a )
66//{{{ docu
67//
68// gf_sign() - return 0 if a=0, 1 otherwise.
69//
70//}}}
71inline
72int gf_sign ( int a )
73{
74    if ( gf_iszero( a ) )
75        return 0;
76    else
77        return 1;
78}
79//}}}
80
81inline int gf_neg ( int a )
82{
83    // -z^a=z^a*(-1)=z^a*gf_m1;
84    if ( a == gf_q ) return a;
85    int i = a + gf_m1;
86    if ( i >= gf_q1 )
87        i -= gf_q1;
88    return i;
89}
90
91inline int gf_add ( int a, int b )
92{
93    // z^a+z^b=z^b*(z^(a-b)+1), if a>=b;
94    //        =z^a*(z^(b-a)+1), if a<b;
95    if ( a == gf_q ) return b;
96    if ( b == gf_q ) return a;
97    int zb, zab, r;
98    if ( a >= b ) {
99        zb = b;
100        zab = a - b;
101    }
102    else {
103        zb = a;
104        zab = b - a;
105    }
106    if ( gf_table[zab] == gf_q )
107        r = gf_q; /*if z^(a-b)+1 =0*/
108    else {
109        r= zb + gf_table[zab];
110        if ( r >= gf_q1 )
111            r -= gf_q1;
112    }
113    return r;
114}
115
116inline int gf_sub ( int a, int b )
117{
118    return gf_add( a, gf_neg( b ) );
119}
120
121inline int gf_mul ( int a, int b )
122{
123    if ( a == gf_q || b == gf_q )
124        return gf_q;
125    else {
126        int i = a + b;
127        if ( i >= gf_q1 ) i -= gf_q1;
128        return i;
129    }
130}
131
132inline int gf_div ( int a, int b )
133{
134    ASSERT( b != gf_q, "divide by zero" );
135    if ( a == gf_q )
136        return gf_q;
137    else {
138        int s = a - b;
139        if (s < 0)
140            s += gf_q1;
141        return s;
142    }
143}
144
145inline int gf_inv ( int a )
146{
147    ASSERT( a != gf_q, "divide by zero" );
148    return gf_q1 - a;
149}
150
151#ifndef NOSTREAMIO
152inline void gf_print ( ostream & os, int a )
153{
154    if ( a == gf_q )
155        os << "0";
156    else  if ( a == 0 )
157        os << "1";
158    else  if ( a == 1 )
159        os << gf_name;
160    else
161        os << gf_name << "^" << a;
162}
163#endif /* NOSTREAMIO */
164
165inline int gf_power ( int a, int n )
166{
167    if ( n == 0 )
168        return 0;
169    else if ( n == 1 )
170        return a;
171    else
172        return gf_mul( a, gf_power( a, n-1 ) );
173}
174
175void gf_setcharacteristic ( int p, int n, char name );
176
177// Singular needs this
178/*BEGINPUBLIC*/
179
180int gf_gf2ff ( int a );
181
182bool gf_isff ( int a );
183
184/*ENDPUBLIC*/
185
186#endif /* ! INCL_GFOPS_H */
Note: See TracBrowser for help on using the repository browser.