MTToolBox  0.2.10
AlgorithmRecursionAndTempering.hpp
[詳解]
1 #ifndef MTTOOLBOX_ALGORITHM_RECURSION_AND_TEMPERING_HPP
2 #define MTTOOLBOX_ALGORITHM_RECURSION_AND_TEMPERING_HPP
3 
33 #include <iostream>
34 #include <ostream>
35 #include <iomanip>
36 #include <vector>
37 #include <cstdlib>
38 #include <cerrno>
39 #include <unistd.h>
40 #include <time.h>
45 #include <MTToolBox/util.hpp>
46 
47 namespace MTToolBox {
80  template<typename U, typename V = U>
82  public:
104  const AlgorithmPrimitivity& primitivity = MersennePrimitivity) {
105  baseGenerator = &bg;
106  isPrime = &primitivity;
107  }
139  bool verbose = false,
140  std::ostream& os = std::cout,
141  bool no_lsb = false) {
142  using namespace NTL;
143  using namespace std;
144 
145  out = &os;
146  int veq[bit_size<U>()];
147  AlgorithmRecursionSearch<U, V> search(lg, *baseGenerator, *isPrime);
148  int mexp = lg.bitSize();
149  bool found = false;
150  for (int i = 0;; i++) {
151  if (search.start(1000 * mexp)) {
152  found = true;
153  break;
154  }
155  if (verbose) {
156  *out << "not found in " << (i + 1) * 10000 << endl;
157  }
158  }
159  if (!found) {
160  return false;
161  }
162  if (verbose) {
163  time_t t = time(NULL);
164  *out << "irreducible parameter is found at " << ctime(&t);
165  }
166  if (verbose) {
167  *out << "count = " << search.getCount() << endl;
168  *out << lg.getParamString() << endl;
169  }
170  poly = search.getMinPoly();
171  weight = NTL::weight(poly);
172  if (verbose) {
173  AlgorithmEquidistribution<U, V> sb(lg, bit_size<U>());
174  int delta = sb.get_all_equidist(veq);
175  print_kv(veq, mexp, bit_size<U>());
176  *out << "delta = " << dec << delta << endl;
177  }
178  if (! no_lsb) {
179  st2(lg, verbose);
180  if (verbose) {
181  if (st2.isLSBTempering()) {
182  lg.setReverseOutput();
183  }
184  AlgorithmEquidistribution<U, V> sc(lg, bit_size<U>());
185  delta = sc.get_all_equidist(veq);
186  lg.resetReverseOutput();
187  time_t t = time(NULL);
188  *out << "lsb tempering parameters are found at "
189  << ctime(&t) << endl;
190  print_kv(veq, mexp, bit_size<U>());
191  *out << "lsb delta = " << dec << delta << endl;
192  }
193  }
194  st1(lg, verbose);
195  AlgorithmEquidistribution<U, V> sc(lg, bit_size<U>());
196  delta = sc.get_all_equidist(veq);
197  if (verbose) {
198  time_t t = time(NULL);
199  *out << "tempering parameters are found at " << ctime(&t)
200  << endl;
201  *out << lg.getParamString() << endl;
202  print_kv(veq, mexp, bit_size<U>());
203  *out << "delta = " << dec << delta << endl;
204  }
205  return true;
206  }
207 
239  bool verbose = false,
240  std::ostream& os = std::cout) {
241  return search(lg, st, st, verbose, os, true);
242  }
243 
256  int getWeight() {
257  return weight;
258  }
259 
272  int getDelta() {
273  return delta;
274  }
275 
287  const NTL::GF2X& getCharacteristicPolynomial() {
288  return poly;
289  }
290  private:
291  int weight;
292  int delta;
293  NTL::GF2X poly;
294  std::ostream * out;
295  AbstractGenerator<V> * baseGenerator;
297  void print_kv(int veq[], int mexp, int size) {
298  using namespace std;
299  for (int i = 0; i < size; i++) {
300  *out << dec << i + 1 << ":" << veq[i]
301  << "(" << mexp / (i + 1) - veq[i] << ")"
302  << endl;
303  }
304  }
305  };
306 
307 }
308 #endif //MTTOOLBOX_ALGORITHM_RECURSION_AND_TEMPERING_HPP
テンパリングパラメータ探索用の抽象クラス
virtual void resetReverseOutput()=0
出力の上位ビットと下位ビットの並びを元に戻す。
bool search(TemperingCalculatable< U, V > &lg, AlgorithmTempering< U, V > &st, bool verbose=false, std::ostream &os=std::cout)
MSBからの均等分布次元のみを向上させたい場合の探索を行う。 状態遷移関数のパラメータは探索する。 ...
Definition: AlgorithmRecursionAndTempering.hpp:237
bool search(TemperingCalculatable< U, V > &lg, AlgorithmTempering< U, V > &st1, AlgorithmTempering< U, V > &st2, bool verbose=false, std::ostream &os=std::cout, bool no_lsb=false)
状態遷移パラメータとテンパリングパラメータを探索する。
Definition: AlgorithmRecursionAndTempering.hpp:136
原始多項式かどうか判定するアルゴリズムを提供するクラス
Definition: AlgorithmPrimitivity.hpp:42
const AlgorithmPrimitivity MersennePrimitivity
状態空間のビットサイズがメルセンヌ指数の疑似乱数生成器の 最小多項式の原始性を判定するアルゴリズム ...
virtual void setReverseOutput()=0
出力の上位ビットと下位ビットを反転する。 これは下位ビットから見た均等分布次元を計測またはテンパリング...
virtual int bitSize() const =0
内部状態空間のビットサイズを返す。
Definition: AlgorithmRecursionAndTempering.hpp:81
状態遷移関数のパラメータを探索する。
テンパリングを行う可約ジェネレータは、このクラスを継承す ることによって、TemperingAlgorithmを使用した...
Definition: TemperingCalculatable.hpp:54
状態遷移関数のパラメータを探索する。
Definition: AlgorithmRecursionSearch.hpp:74
const NTL::GF2X & getCharacteristicPolynomial()
状態遷移関数の特性多項式を返す。
Definition: AlgorithmRecursionAndTempering.hpp:287
疑似乱数生成器の均等分布次元を計算する
Definition: AlgorithmEquidistribution.hpp:238
ユーティリティ関数群
int get_all_equidist(int veq[])
vビット精度の均等分布次元を計算する。 v = bit_len から 1までの均等分布次元を計算して、veq[] に入れる...
Definition: AlgorithmEquidistribution.hpp:470
int getDelta()
均等分布次元の理論値との差の総和を返す。
Definition: AlgorithmRecursionAndTempering.hpp:272
疑似乱数生成器の出力の均等分布次元を計算する。
テンパリングパラメータ探索アルゴリズムのための抽象クラス
virtual const std::string getParamString()=0
パラメータの文字列表現を返す。
int getWeight()
特性多項式のハミングウェイトを返す
Definition: AlgorithmRecursionAndTempering.hpp:256
AlgorithmRecursionAndTempering(AbstractGenerator< V > &bg, const AlgorithmPrimitivity &primitivity=MersennePrimitivity)
コンストラクタ
Definition: AlgorithmRecursionAndTempering.hpp:103
疑似乱数生成器の高次元均等分布性を改善するために、テンパ リングパラメータを探索するアルゴリズム ...
Definition: AlgorithmTempering.hpp:62
virtual bool isLSBTempering() const
LSB からのテンパリングをするのか
Definition: AlgorithmTempering.hpp:107
bool isPrime(const NTL::GF2X &poly)
原始性判定
MTToolBox の名前空間