source: git/factory/gfops.h @ 2adb1c

spielwiese
Last change on this file since 2adb1c was 2adb1c, checked in by Jens Schmidt <schmidt@…>, 26 years ago
* gfops.h: functions reordered git-svn-id: file:///usr/local/Singular/svn/trunk@913 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.9 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id: gfops.h,v 1.6 1997-11-19 11:43:24 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
29//{{{ predicates
30inline bool gf_iszero ( int a )
31{
32    return gf_q == a;
33}
34
35inline bool gf_isone ( int a )
36{
37    return 0 == a;
38}
39//}}}
40
41//{{{ conversion functions
42inline int gf_int2gf ( int i )
43{
44    while ( i < 0 )
45        i += gf_p;
46    while ( i >= gf_p )
47        i -= gf_p;
48    if ( i == 0 )
49        return gf_q;
50    int c = 0;
51    while ( i > 1 ) {
52        c = gf_table[c];
53        i--;
54    }
55    return c;
56}
57//}}}
58
59//{{{ zero and one
60inline int gf_zero()
61{
62    return gf_q;
63}
64
65inline int gf_one()
66{
67    return 0;
68}
69//}}}
70
71//{{{ inline int gf_sign ( int a )
72// docu: see imm_sign()
73inline
74int gf_sign ( int a )
75{
76    if ( gf_iszero( a ) )
77        return 0;
78    else
79        return 1;
80}
81//}}}
82
83//{{{ arithmetic operators
84inline int gf_neg ( int a )
85{
86    // -z^a=z^a*(-1)=z^a*gf_m1;
87    if ( a == gf_q ) return a;
88    int i = a + gf_m1;
89    if ( i >= gf_q1 )
90        i -= gf_q1;
91    return i;
92}
93
94inline int gf_add ( int a, int b )
95{
96    // z^a+z^b=z^b*(z^(a-b)+1), if a>=b;
97    //        =z^a*(z^(b-a)+1), if a<b;
98    if ( a == gf_q ) return b;
99    if ( b == gf_q ) return a;
100    int zb, zab, r;
101    if ( a >= b ) {
102        zb = b;
103        zab = a - b;
104    }
105    else {
106        zb = a;
107        zab = b - a;
108    }
109    if ( gf_table[zab] == gf_q )
110        r = gf_q; /*if z^(a-b)+1 =0*/
111    else {
112        r= zb + gf_table[zab];
113        if ( r >= gf_q1 )
114            r -= gf_q1;
115    }
116    return r;
117}
118
119inline int gf_sub ( int a, int b )
120{
121    return gf_add( a, gf_neg( b ) );
122}
123
124inline int gf_mul ( int a, int b )
125{
126    if ( a == gf_q || b == gf_q )
127        return gf_q;
128    else {
129        int i = a + b;
130        if ( i >= gf_q1 ) i -= gf_q1;
131        return i;
132    }
133}
134
135inline int gf_div ( int a, int b )
136{
137    ASSERT( b != gf_q, "divide by zero" );
138    if ( a == gf_q )
139        return gf_q;
140    else {
141        int s = a - b;
142        if (s < 0)
143            s += gf_q1;
144        return s;
145    }
146}
147
148inline int gf_inv ( int a )
149{
150    ASSERT( a != gf_q, "divide by zero" );
151    return gf_q1 - a;
152}
153//}}}
154
155//{{{ input/output
156#ifndef NOSTREAMIO
157inline void gf_print ( ostream & os, int a )
158{
159    if ( a == gf_q )
160        os << "0";
161    else  if ( a == 0 )
162        os << "1";
163    else  if ( a == 1 )
164        os << gf_name;
165    else
166        os << gf_name << "^" << a;
167}
168#endif /* NOSTREAMIO */
169//}}}
170
171//{{{ exponentation
172inline int gf_power ( int a, int n )
173{
174    if ( n == 0 )
175        return 0;
176    else if ( n == 1 )
177        return a;
178    else
179        return gf_mul( a, gf_power( a, n-1 ) );
180}
181//}}}
182
183void gf_setcharacteristic ( int p, int n, char name );
184
185// Singular needs this
186/*BEGINPUBLIC*/
187
188int gf_gf2ff ( int a );
189
190bool gf_isff ( int a );
191
192/*ENDPUBLIC*/
193
194#endif /* ! INCL_GFOPS_H */
Note: See TracBrowser for help on using the repository browser.