mols-generator
All Classes Files
MOLS_generator.hpp
Go to the documentation of this file.
1 // Copyright 2020 Matthew Henderson
2 
3 #ifndef SRC_MOLS_MOLS_GENERATOR_HPP_
4 #define SRC_MOLS_MOLS_GENERATOR_HPP_
5 
6 #include <LiDIA/galois_field.h>
7 #include <LiDIA/gf_element.h>
8 #include <LiDIA/galois_field_iterator.h>
9 
10 #include <set>
11 #include <vector>
12 #include <cmath>
13 
14 #include <boost/range/functions.hpp>
15 #include <boost/range/metafunctions.hpp>
16 
17 #include <boost/numeric/ublas/matrix.hpp>
18 
19 #include <boost/assign/std/vector.hpp>
20 #include <boost/assert.hpp>
21 
22 #include "Fields.hpp"
23 
39 template <class Field, class Matrix>
40 Matrix aXpY(const Field& F,
41  const typename FieldTraits<Field>::element& p,
42  const typename FieldTraits<Field>::element& a) {
43  int size;
44  LiDIA::bigint no_of_elem(F.number_of_elements());
45  no_of_elem.intify(size);
46  Matrix L(size, size);
47  for (int i = 0; i < L.size1(); ++i)
48  for (int j = 0; j < L.size2(); ++j) {
49  typename FieldTraits<Field>::element x, y;
50  if (i == 0) {
51  x.assign_zero(F);
52  } else {
53  LiDIA::bigint I(i);
54  LiDIA::power(x, p, I);
55  }
56  if (j == 0) {
57  y.assign_zero(F);
58  } else {
59  LiDIA::bigint J(j);
60  LiDIA::power(y, p, J);
61  }
62  L(i, j) = a*x + y;
63  }
64  return L;
65 }
66 
79 template <class Field, class Matrix>
81  Field F;
82  int i;
83  typename FieldTraits<Field>::element a, b;
84  public:
85  aXpYGenerator(const Field& F,
86  const typename FieldTraits<Field>::element& a) : F(F), a(a), i(0) {}
87  Matrix operator()() {
88  LiDIA::bigint I(i);
89  LiDIA::power(b, a, I);
90  ++i;
91  return aXpY<Field, Matrix>(F, a, b);
92  }
93 };
94 
100 template<class Matrix, class Field>
101 class MOLRange {
102  typedef typename FieldTraits<Field>::characteristic_type characteristic_t;
103  typedef typename FieldTraits<Field>::degree_type degree_t;
104  typedef typename FieldTraits<Field>::order_type order_t;
105  typedef typename FieldTraits<Field>::element FieldElement;
106  typedef std::vector<Matrix> Range;
107  typedef typename Range::iterator iterator;
108  characteristic_t characteristic;
109  degree_t degree;
110  Range mol_range;
111 
112  public:
113  typedef Matrix value_type;
114  MOLRange(characteristic_t characteristic,
115  degree_t degree) : characteristic(characteristic), degree(degree) {
116  Field F(characteristic, degree);
117  FieldElement a(F.generator());
118  order_t order;
119  LiDIA::power(order, characteristic, degree);
120  int order_;
121  order.intify(order_);
122  mol_range.resize(order_ - 1);
123  std::generate(mol_range.begin(),
124  mol_range.end(),
126  }
127  iterator begin() { return mol_range.begin(); }
128  iterator end() { return mol_range.end(); }
129 };
130 
131 #endif // SRC_MOLS_MOLS_GENERATOR_HPP_
Definition: MOLS_generator.hpp:101
Parent class??
Definition: Fields.hpp:23
Traits functions for fields.
Definition: MOLS_generator.hpp:80