My Project
Toggle main menu visibility
Loading...
Searching...
No Matches
factory
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
15
bool
IntGenerator::hasItems
()
const
16
{
17
return
1;
18
}
19
20
CanonicalForm
IntGenerator::item
()
const
21
{
22
return
mapinto
(
CanonicalForm
(
current
));
23
}
24
25
void
IntGenerator::next
()
26
{
27
current
++;
28
}
29
30
CFGenerator
*
IntGenerator::clone
()
const
31
{
32
return
new
IntGenerator
();
33
}
34
35
bool
FFGenerator::hasItems
()
const
36
{
37
return
current
<
ff_prime
;
38
}
39
40
CanonicalForm
FFGenerator::item
()
const
41
{
42
ASSERT
(
current
<
ff_prime
,
"no more items"
);
43
return
CanonicalForm
(
int2imm_p
(
current
) );
44
}
45
46
void
FFGenerator::next
()
47
{
48
ASSERT
(
current
<
ff_prime
,
"no more items"
);
49
current
++;
50
}
51
52
CFGenerator
*
FFGenerator::clone
()
const
53
{
54
return
new
FFGenerator
();
55
}
56
57
GFGenerator::GFGenerator
()
58
{
59
current
=
gf_zero
();
60
}
61
62
bool
GFGenerator::hasItems
()
const
63
{
64
return
(
current
!=
gf_q
+ 1 );
65
}
66
67
void
GFGenerator::reset
()
68
{
69
current
=
gf_zero
();
70
}
71
72
CanonicalForm
GFGenerator::item
()
const
73
{
74
ASSERT
(
current
!=
gf_q
+ 1,
"no more items"
);
75
return
CanonicalForm
(
int2imm_gf
(
current
) );
76
}
77
78
void
GFGenerator::next
()
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
89
CFGenerator
*
GFGenerator::clone
()
const
90
{
91
return
new
GFGenerator
();
92
}
93
94
AlgExtGenerator::AlgExtGenerator
()
95
{
96
ASSERT
( 0,
"not a valid generator"
);
97
}
98
99
AlgExtGenerator::AlgExtGenerator
(
const
AlgExtGenerator
& )
100
{
101
ASSERT
( 0,
"not a valid generator"
);
102
}
103
104
AlgExtGenerator
&
AlgExtGenerator::operator=
(
const
AlgExtGenerator
& )
105
{
106
ASSERT
( 0,
"not a valid generator"
);
107
return
*
this
;
108
}
109
110
AlgExtGenerator::AlgExtGenerator
(
const
Variable
& a )
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
131
AlgExtGenerator::~AlgExtGenerator
()
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
147
void
AlgExtGenerator::reset
()
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
162
CanonicalForm
AlgExtGenerator::item
()
const
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
179
void
AlgExtGenerator::next
()
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
216
CFGenerator
*
AlgExtGenerator::clone
()
const
217
{
218
return
new
AlgExtGenerator
(
algext
);
219
}
220
221
CFGenerator
*
CFGenFactory::generate
()
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
}
i
int i
Definition
cfEzgcd.cc:132
cf_assert.h
assertions for Factory
ASSERT
#define ASSERT(expression, message)
Definition
cf_assert.h:99
cf_defs.h
factory switches.
cf_generator.h
generate integers, elements of finite fields
AlgExtGenerator::gensf
FFGenerator ** gensf
Definition
cf_generator.h:97
AlgExtGenerator::n
int n
Definition
cf_generator.h:99
AlgExtGenerator::reset
void reset()
Definition
cf_generator.cc:147
AlgExtGenerator::gensg
GFGenerator ** gensg
Definition
cf_generator.h:98
AlgExtGenerator::item
CanonicalForm item() const
Definition
cf_generator.cc:162
AlgExtGenerator::clone
CFGenerator * clone() const
Definition
cf_generator.cc:216
AlgExtGenerator::hasItems
bool hasItems() const
Definition
cf_generator.h:108
AlgExtGenerator::nomoreitems
bool nomoreitems
Definition
cf_generator.h:100
AlgExtGenerator::AlgExtGenerator
AlgExtGenerator()
Definition
cf_generator.cc:94
AlgExtGenerator::~AlgExtGenerator
~AlgExtGenerator()
Definition
cf_generator.cc:131
AlgExtGenerator::operator=
AlgExtGenerator & operator=(const AlgExtGenerator &)
Definition
cf_generator.cc:104
AlgExtGenerator::next
void next()
Definition
cf_generator.cc:179
AlgExtGenerator::algext
Variable algext
Definition
cf_generator.h:96
CFGenFactory::generate
static CFGenerator * generate()
Definition
cf_generator.cc:221
CFGenerator
virtual class for generators
Definition
cf_generator.h:22
CFGenerator::CFGenerator
CFGenerator()
Definition
cf_generator.h:24
CanonicalForm
factory's main class
Definition
canonicalform.h:86
FFGenerator
generate all elements in F_p starting from 0
Definition
cf_generator.h:56
FFGenerator::current
int current
Definition
cf_generator.h:58
FFGenerator::FFGenerator
FFGenerator()
Definition
cf_generator.h:60
FFGenerator::hasItems
bool hasItems() const
Definition
cf_generator.cc:35
FFGenerator::item
CanonicalForm item() const
Definition
cf_generator.cc:40
FFGenerator::clone
CFGenerator * clone() const
Definition
cf_generator.cc:52
FFGenerator::next
void next()
Definition
cf_generator.cc:46
GFGenerator
generate all elements in GF starting from 0
Definition
cf_generator.h:75
GFGenerator::hasItems
bool hasItems() const
Definition
cf_generator.cc:62
GFGenerator::item
CanonicalForm item() const
Definition
cf_generator.cc:72
GFGenerator::next
void next()
Definition
cf_generator.cc:78
GFGenerator::clone
CFGenerator * clone() const
Definition
cf_generator.cc:89
GFGenerator::current
int current
Definition
cf_generator.h:77
GFGenerator::GFGenerator
GFGenerator()
Definition
cf_generator.cc:57
GFGenerator::reset
void reset()
Definition
cf_generator.cc:67
IntGenerator
generate integers starting from 0
Definition
cf_generator.h:37
IntGenerator::clone
CFGenerator * clone() const
Definition
cf_generator.cc:30
IntGenerator::item
CanonicalForm item() const
Definition
cf_generator.cc:20
IntGenerator::next
void next()
Definition
cf_generator.cc:25
IntGenerator::current
int current
Definition
cf_generator.h:39
IntGenerator::hasItems
bool hasItems() const
Definition
cf_generator.cc:15
IntGenerator::IntGenerator
IntGenerator()
Definition
cf_generator.h:41
Variable
factory's class for variables
Definition
factory.h:127
Variable::level
int level() const
Definition
factory.h:143
result
return result
Definition
facAbsBiFact.cc:76
ff_prime
VAR int ff_prime
Definition
ffops.cc:23
ffops.h
operations in a finite prime field F_p.
gf_q
VAR int gf_q
Definition
gfops.cc:47
gf_q1
VAR int gf_q1
Definition
gfops.cc:50
gfops.h
Operations in GF, where GF is a finite field of size less than 2^16 represented by a root of Conway p...
gf_zero
int gf_zero()
Definition
gfops.h:99
gf_iszero
bool gf_iszero(int a)
Definition
gfops.h:43
imm.h
operations on immediates, that is elements of F_p, GF, Z, Q that fit into intrinsic int,...
int2imm_p
InternalCF * int2imm_p(long i)
Definition
imm.h:101
int2imm_gf
InternalCF * int2imm_gf(long i)
Definition
imm.h:106
mapinto
CanonicalForm mapinto(const CanonicalForm &f)
Definition
factory.h:496
degree
int degree(const CanonicalForm &f)
Definition
factory.h:457
getGFDegree
int getGFDegree()
Definition
cf_char.cc:75
getMipo
CanonicalForm getMipo(const Variable &alpha, const Variable &x)
Definition
variable.cc:207
power
CanonicalForm FACTORY_PUBLIC power(const CanonicalForm &f, int n)
exponentiation
Definition
canonicalform.cc:1896
getCharacteristic
int FACTORY_PUBLIC getCharacteristic()
Definition
cf_char.cc:70
Generated on
for My Project by
doxygen 1.17.0
for
Singular