86 GF(
int qvalue,
int inexp) { m = 0;
set(qvalue, inexp); }
88 GF(
const GF &ingf) { m = ingf.m; value = ingf.value; }
91 void set(
int qvalue,
int inexp) {
93 it_assert_debug(inexp >= -1 && inexp < qvalue - 1,
"GF::set, out of range");
101 void set(
int qvalue,
const bvec &vectorspace);
105 int get_size()
const {
return ((m != 0) ? q[m] : 0); }
140 friend std::ostream &
operator<<(std::ostream &os,
const GF &ingf);
152 GFX
operator*(
const GF &ingf,
const GFX &ingfx);
154 GFX
operator*(
const GFX &ingfx,
const GF &ingf);
156 GFX
operator/(
const GFX &ingfx,
const GF &ingf);
169 GFX(
int qvalue,
int indegree);
171 GFX(
int qvalue,
const ivec &invalues);
173 GFX(
int qvalue,
char *invalues);
175 GFX(
int qvalue, std::string invalues);
185 void set_degree(
int indegree,
bool copy =
false);
189 void set(
int qvalue,
const char *invalues);
191 void set(
int qvalue,
const std::string invalues);
193 void set(
int qvalue,
const ivec &invalues);
199 return coeffs(index);
204 return coeffs(index);
230 friend std::ostream &
operator<<(std::ostream &os,
const GFX &ingfx);
244 GFX
divgfx(
const GFX &c,
const GFX &g);
250 GFX
modgfx(
const GFX &a,
const GFX &b);
256 inline void GF::set(
int qvalue,
const bvec &vectorspace)
260 value = logalpha(m)(
bin2dec(vectorspace));
269 temp =
dec2bin(m, alphapow(m)(value));
280 if (value == -1 && ingf.value == -1)
282 if (m == ingf.m && value == ingf.value)
291 return !(tmp == ingf);
302 it_assert_debug(m > 0 && inexp >= -1 && inexp < (q[m] - 1),
"GF::op=, out of range");
312 else if (ingf.value != -1) {
314 value = logalpha(m)(alphapow(m)(value) ^ alphapow(m)(ingf.value));
339 if (value == -1 || ingf.value == -1)
343 value = (value + ingf.value) % (q[m] - 1);
356 it_assert(ingf.value != -1,
"GF::operator/: division by zero element");
361 value = (value - ingf.value + q[m] - 1) % (q[m] - 1);
385 inline void GFX::set(
int qvalue,
const ivec &invalues)
388 degree = invalues.size() - 1;
390 for (
int i = 0;i < degree + 1;i++)
391 coeffs(i).set(qvalue, invalues(i));
395 inline void GFX::set(
int qvalue,
const char *invalues)
397 set(qvalue, ivec(invalues));
400 inline void GFX::set(
int qvalue,
const std::string invalues)
402 set(qvalue, invalues.c_str());
407 it_assert_debug(qvalue > 0 && indegree >= 0,
"GFX::GFX, out of range");
409 coeffs.
set_size(indegree + 1,
false);
411 for (
int i = 0;i < degree + 1;i++)
412 coeffs(i).set(q, -1);
416 set(qvalue, invalues);
421 set(qvalue, invalues);
426 set(qvalue, invalues.c_str());
431 degree = ingfx.degree;
432 coeffs = ingfx.coeffs;
449 coeffs.
set_size(indegree + 1, copy);
456 while (coeffs(i).get_value() == -1) {
467 for (
int i = 0;i < degree + 1;i++)
468 coeffs(i).set(q, -1);
473 degree = ingfx.degree;
474 coeffs = ingfx.coeffs;
481 if (ingfx.degree > degree) {
482 coeffs.
set_size(ingfx.degree + 1,
true);
484 for (
int j = degree + 1; j < coeffs.
size(); j++) { coeffs(j).set(q, -1); }
485 degree = ingfx.degree;
487 for (
int i = 0;i < ingfx.degree + 1;i++) { coeffs(i) += ingfx.coeffs(i); }
514 coeffs.
set_size(degree + ingfx.degree + 1,
false);
515 for (j = 0; j < coeffs.
size(); j++)
516 coeffs(j).set(q, -1);
517 for (i = 0;i < degree + 1;i++)
518 for (j = 0;j < ingfx.degree + 1;j++)
519 coeffs(i + j) += tempcoeffs(i) * ingfx.coeffs(j);
520 degree = coeffs.
size() - 1;
534 for (
int i = 0;i < ingfx.degree + 1;i++)
535 temp.coeffs(i) *= ingf;
548 for (
int i = 0;i < ingfx.degree + 1;i++)
549 temp.coeffs(i) /= ingf;
556 GF temp(coeffs(0)), ingfpower(ingf);
557 for (
int i = 1; i < degree + 1; i++) {
558 temp += coeffs(i) * ingfpower;
566 #endif // #ifndef GALOIS_H