MTToolBox  0.2.10
AlgorithmReducibleRecursionSearch.hpp
[詳解]
1 #ifndef MTTOOLBOX_ALGORITHM_REDUCIBLE_RECURSION_SEARCH_HPP
2 #define MTTOOLBOX_ALGORITHM_REDUCIBLE_RECURSION_SEARCH_HPP
3 
33 #if defined(DEBUG)
34 #include <iostream>
35 #endif
36 #include <NTL/GF2X.h>
37 #include <NTL/GF2XFactoring.h>
38 #include <MTToolBox/util.hpp>
41 #include <MTToolBox/period.hpp>
42 
43 namespace MTToolBox {
44  using namespace std;
45 
46  template<typename U, typename V = U>
47  void calcCharacteristicPolynomial(RecursionSearchable<U, V> *rand,
48  NTL::GF2X& poly);
83  template<typename U, typename V = U>
85  public:
113  AbstractGenerator<V>& bg) {
114  rand = &generator;
115  baseGenerator = &bg;
116  count = 0;
117  }
118 
122  bool start(int try_count) {
123  long degree;
124  long mexp = rand->getMexp();
125  for (int i = 0; i < try_count; i++) {
126  rand->setUpParam(*baseGenerator);
127  rand->seed(getOne<U>());
128 #if defined(DEBUG)
129  cout << "rand param:";
130  cout << rand->getParamString() << endl;
131 #endif
132  minpoly(poly, *rand);
133  irreducible = poly;
134  count++;
135  if (deg(irreducible) < mexp) {
136 #if defined(DEBUG)
137  cout << "irrepoly deg = " << deg(irreducible)
138  << " skip" << endl;
139 #endif
140  continue;
141  }
142  bool hasFactor = hasFactorOfDegree(irreducible, mexp);
143 #if defined(DEBUG)
144  cout << "has factor = " << hasFactor << endl;
145 #endif
146  if (!hasFactor) {
147 #if defined(DEBUG)
148  cout << "not has factor of degree irrepoly deg = "
149  << deg(irreducible) << " skip" << endl;
150 #endif
151  continue;
152  }
153  degree = deg(irreducible);
154  if (degree != mexp) {
155 #if defined(DEBUG)
156  cout << "degree:" << degree << "degree != mexp skip"
157  << endl;
158 #endif
159  continue;
160  }
161  return true;
162  }
163  return false;
164  }
165 
169  const std::string getParamString() {
170  return rand->getParamString();
171  }
172 
184  const NTL::GF2X& getCharacteristicPolynomial() {
185  return poly;
186  }
187 
203  const NTL::GF2X& getIrreducibleFactor() const {
204  return irreducible;
205  }
206 
218  long getCount() const {
219  return count;
220  }
221 
222  private:
224  AbstractGenerator<V> *baseGenerator;
225  NTL::GF2X poly;
226  NTL::GF2X irreducible;
227  long count;
228 
229  };
230 
251  template<typename U, typename V = U>
253  NTL::GF2X& poly)
254  {
255 #if defined(DEBUG)
256  cout << "calcCharacteristicPolynomial start" << endl;
257 #endif
258  int bitsize = bit_size<U>();
259  NTL::GF2X minpol;
260  NTL::GF2X lcmpoly = poly;
261  int size = rand->bitSize();
262  for (int i = 0; i < bitsize; i++) {
263  if (deg(lcmpoly) == size) {
264  poly = lcmpoly;
265 #if defined(DEBUG)
266  cout << "calcCharacteristicPolynomial end" << endl;
267 #endif
268  return;
269  }
270  minpoly(minpol, *rand, i);
271  LCM(lcmpoly, lcmpoly, minpol);
272  }
273  poly = lcmpoly;
274 #if defined(DEBUG)
275  cout << "calcCharacteristicPolynomial end" << endl;
276 #endif
277  }
278 }
279 #endif // MTTOOLBOX_ALGORITHM_REDUCIBLE_RECURSION_SEARCH_HPP
bool hasFactorOfDegree(NTL::GF2X &poly, long degree)
指定された次数の原始多項式がpolyの因数分解に含まれているか判定する。
AlgorithmReducibleRecursionSearch(ReducibleGenerator< U, V > &generator, AbstractGenerator< V > &bg)
コンストラクタ
Definition: AlgorithmReducibleRecursionSearch.hpp:112
void minpoly(NTL::GF2X &poly, AbstractGenerator< U > &generator, int pos=0, int stateSize=0)
最小多項式を求める
Definition: period.hpp:56
virtual int bitSize() const =0
内部状態空間のビットサイズを返す。
const std::string getParamString()
疑似乱数生成器のパラメータを表す文字列を返す このメソッドは start() が true を返した場合にのみ呼び出...
Definition: AlgorithmReducibleRecursionSearch.hpp:169
void calcCharacteristicPolynomial(RecursionSearchable< U, V > *rand, NTL::GF2X &poly)
const NTL::GF2X & getCharacteristicPolynomial()
最小多項式を返す このメソッドは start() が true を返した場合にのみ呼び出すべきである。 ...
Definition: AlgorithmReducibleRecursionSearch.hpp:184
このクラスは特性多項式が可約なGF(2)線形疑似乱数生成器を開 発するためのクラスである。 ...
Definition: ReducibleGenerator.hpp:57
ユーティリティ関数群
const NTL::GF2X & getIrreducibleFactor() const
特性多項式のメルセンヌ指数次の大きな既約因子を返す このメソッドは start() が true を返した場合にのみ...
Definition: AlgorithmReducibleRecursionSearch.hpp:203
可約ジェネレータの状態遷移関数のパラメータを探索する。
Definition: AlgorithmReducibleRecursionSearch.hpp:84
long getCount() const
このインスタンスが作られてからstart() が終了するまでに試行した回数を返す。
Definition: AlgorithmReducibleRecursionSearch.hpp:218
static void LCM(NTL::GF2X &lcm, const NTL::GF2X &x, const NTL::GF2X &y)
多項式の最小公倍数を求める。
Definition: util.hpp:509
最小多項式の計算と原始性の判定
原始多項式判定
bool start(int try_count)
状態遷移パラメータの探索を開始する
Definition: AlgorithmReducibleRecursionSearch.hpp:122
MTToolBox の名前空間