My Project  UNKNOWN_GIT_VERSION
cf_generator.cc
Go to the documentation of this file.
1 /* emacs edit mode for this file is -*- C++ -*- */
2 
3 
4 #include "config.h"
5 
6 
7 #include "cf_assert.h"
8 
9 #include "cf_defs.h"
10 #include "cf_generator.h"
11 #include "imm.h"
12 #include "gfops.h"
13 #include "ffops.h"
14 
16 {
17  return 1;
18 }
19 
21 {
22  return mapinto (CanonicalForm (current));
23 }
24 
26 {
27  current++;
28 }
29 
31 {
32  return new IntGenerator();
33 }
34 
36 {
37  return current < ff_prime;
38 }
39 
41 {
42  ASSERT( current < ff_prime, "no more items" );
43  return CanonicalForm( int2imm_p( current ) );
44 }
45 
47 {
48  ASSERT( current < ff_prime, "no more items" );
49  current++;
50 }
51 
53 {
54  return new FFGenerator();
55 }
56 
58 {
59  current = gf_zero();
60 }
61 
63 {
64  return ( current != gf_q + 1 );
65 }
66 
68 {
69  current = gf_zero();
70 }
71 
73 {
74  ASSERT( current != gf_q + 1, "no more items" );
75  return CanonicalForm( int2imm_gf( current ) );
76 }
77 
79 {
80  ASSERT( current != gf_q + 1, "no more items" );
81  if ( gf_iszero( current ) )
82  current = 0;
83  else if ( current == gf_q1 - 1 )
84  current = gf_q + 1;
85  else
86  current++;
87 }
88 
90 {
91  return new GFGenerator();
92 }
93 
95 {
96  ASSERT( 0, "not a valid generator" );
97 }
98 
100 {
101  ASSERT( 0, "not a valid generator" );
102 }
103 
105 {
106  ASSERT( 0, "not a valid generator" );
107  return *this;
108 }
109 
111 {
112  ASSERT( a.level() < 0, "not an algebraic extension" );
113  ASSERT( getCharacteristic() > 0, "not a finite field" );
114  algext = a;
115  n = degree( getMipo( a ) );
116  if ( getGFDegree() > 1 )
117  {
118  gensg = new GFGenerator * [n];
119  for ( int i = 0; i < n; i++ )
120  gensg[i] = new GFGenerator();
121  }
122  else
123  {
124  gensf = new FFGenerator * [n];
125  for ( int i = 0; i < n; i++ )
126  gensf[i] = new FFGenerator();
127  }
128  nomoreitems = false;
129 }
130 
132 {
133  if ( getGFDegree() > 1 )
134  {
135  for ( int i = 0; i < n; i++ )
136  delete gensg[i];
137  delete [] gensg;
138  }
139  else
140  {
141  for ( int i = 0; i < n; i++ )
142  delete gensf[i];
143  delete [] gensf;
144  }
145 }
146 
148 {
149  if ( getGFDegree() > 1 )
150  {
151  for ( int i = 0; i < n; i++ )
152  gensg[i]->reset();
153  }
154  else
155  {
156  for ( int i = 0; i < n; i++ )
157  gensf[i]->reset();
158  }
159  nomoreitems = false;
160 }
161 
163 {
164  ASSERT( ! nomoreitems, "no more items" );
165  CanonicalForm result = 0;
166  if ( getGFDegree() > 1 )
167  {
168  for ( int i = 0; i < n; i++ )
169  result += power( algext, i ) * gensg[i]->item();
170  }
171  else
172  {
173  for ( int i = 0; i < n; i++ )
174  result += power( algext, i ) * gensf[i]->item();
175  }
176  return result;
177 }
178 
180 {
181  ASSERT( ! nomoreitems, "no more items" );
182  int i = 0;
183  bool stop = false;
184  if ( getGFDegree() > 1 )
185  {
186  while ( ! stop && i < n )
187  {
188  gensg[i]->next();
189  if ( ! gensg[i]->hasItems() )
190  {
191  gensg[i]->reset();
192  i++;
193  }
194  else
195  stop = true;
196  }
197  }
198  else
199  {
200  while ( ! stop && i < n )
201  {
202  gensf[i]->next();
203  if ( ! gensf[i]->hasItems() )
204  {
205  gensf[i]->reset();
206  i++;
207  }
208  else
209  stop = true;
210  }
211  }
212  if ( ! stop )
213  nomoreitems = true;
214 }
215 
217 {
218  return new AlgExtGenerator(algext);
219 }
220 
222 {
223  if (getCharacteristic() == 0)
224  return new IntGenerator();
225  else if ( getGFDegree() > 1 )
226  return new GFGenerator();
227  else
228  return new FFGenerator();
229 }
AlgExtGenerator::nomoreitems
bool nomoreitems
Definition: cf_generator.h:100
IntGenerator
generate integers starting from 0
Definition: cf_generator.h:37
AlgExtGenerator::n
int n
Definition: cf_generator.h:99
result
return result
Definition: facAbsBiFact.cc:76
GFGenerator::next
void next()
Definition: cf_generator.cc:78
AlgExtGenerator::hasItems
bool hasItems() const
Definition: cf_generator.h:108
gf_zero
int gf_zero()
Definition: gfops.h:99
AlgExtGenerator::gensg
GFGenerator ** gensg
Definition: cf_generator.h:98
AlgExtGenerator::algext
Variable algext
Definition: cf_generator.h:96
power
CanonicalForm power(const CanonicalForm &f, int n)
exponentiation
Definition: canonicalform.cc:1837
AlgExtGenerator::~AlgExtGenerator
~AlgExtGenerator()
Definition: cf_generator.cc:131
gf_q1
int gf_q1
Definition: gfops.cc:50
FFGenerator::hasItems
bool hasItems() const
Definition: cf_generator.cc:35
IntGenerator::IntGenerator
IntGenerator()
Definition: cf_generator.h:41
CFGenerator
virtual class for generators
Definition: cf_generator.h:22
getCharacteristic
int getCharacteristic()
Definition: cf_char.cc:51
FFGenerator::reset
void reset()
Definition: cf_generator.h:63
GFGenerator::GFGenerator
GFGenerator()
Definition: cf_generator.cc:57
CanonicalForm
factory's main class
Definition: canonicalform.h:83
i
int i
Definition: cfEzgcd.cc:125
AlgExtGenerator::next
void next()
Definition: cf_generator.cc:179
getMipo
CanonicalForm getMipo(const Variable &alpha, const Variable &x)
Definition: variable.cc:207
ASSERT
#define ASSERT(expression, message)
Definition: cf_assert.h:99
AlgExtGenerator::item
CanonicalForm item() const
Definition: cf_generator.cc:162
FFGenerator::FFGenerator
FFGenerator()
Definition: cf_generator.h:60
cf_defs.h
factory switches.
FFGenerator
generate all elements in F_p starting from 0
Definition: cf_generator.h:56
gfops.h
Operations in GF, where GF is a finite field of size less than 2^16 represented by a root of Conway p...
FFGenerator::item
CanonicalForm item() const
Definition: cf_generator.cc:40
IntGenerator::current
int current
Definition: cf_generator.h:39
gf_q
int gf_q
Definition: gfops.cc:47
GFGenerator::item
CanonicalForm item() const
Definition: cf_generator.cc:72
Variable::level
int level() const
Definition: factory.h:134
GFGenerator::reset
void reset()
Definition: cf_generator.cc:67
FFGenerator::next
void next()
Definition: cf_generator.cc:46
AlgExtGenerator::gensf
FFGenerator ** gensf
Definition: cf_generator.h:97
imm.h
operations on immediates, that is elements of F_p, GF, Z, Q that fit into intrinsic int,...
gf_iszero
bool gf_iszero(int a)
Definition: gfops.h:43
getGFDegree
int getGFDegree()
Definition: cf_char.cc:56
FFGenerator::current
int current
Definition: cf_generator.h:58
AlgExtGenerator::reset
void reset()
Definition: cf_generator.cc:147
AlgExtGenerator::operator=
AlgExtGenerator & operator=(const AlgExtGenerator &)
Definition: cf_generator.cc:104
Variable
factory's class for variables
Definition: factory.h:118
IntGenerator::next
void next()
Definition: cf_generator.cc:25
GFGenerator::current
int current
Definition: cf_generator.h:77
int2imm_p
InternalCF * int2imm_p(long i)
Definition: imm.h:101
IntGenerator::item
CanonicalForm item() const
Definition: cf_generator.cc:20
mapinto
CanonicalForm mapinto(const CanonicalForm &f)
Definition: canonicalform.h:348
ff_prime
int ff_prime
Definition: ffops.cc:14
AlgExtGenerator::AlgExtGenerator
AlgExtGenerator()
Definition: cf_generator.cc:94
GFGenerator::clone
CFGenerator * clone() const
Definition: cf_generator.cc:89
cf_assert.h
assertions for Factory
IntGenerator::hasItems
bool hasItems() const
Definition: cf_generator.cc:15
int2imm_gf
InternalCF * int2imm_gf(long i)
Definition: imm.h:106
AlgExtGenerator::clone
CFGenerator * clone() const
Definition: cf_generator.cc:216
GFGenerator
generate all elements in GF starting from 0
Definition: cf_generator.h:75
CFGenFactory::generate
static CFGenerator * generate()
Definition: cf_generator.cc:221
GFGenerator::hasItems
bool hasItems() const
Definition: cf_generator.cc:62
degree
int degree(const CanonicalForm &f)
Definition: canonicalform.h:309
cf_generator.h
generate integers, elements of finite fields
ffops.h
operations in a finite prime field F_p.
IntGenerator::clone
CFGenerator * clone() const
Definition: cf_generator.cc:30
FFGenerator::clone
CFGenerator * clone() const
Definition: cf_generator.cc:52
AlgExtGenerator
generate all elements in F_p(alpha) starting from 0
Definition: cf_generator.h:94