MTToolBox  0.2.10
AlgorithmReducibleRT.hpp
[詳解]
1 #ifndef MTTOOLBOX_ALGORITHM_REDUCIBLE_RT_HPP
2 #define MTTOOLBOX_ALGORITHM_REDUCIBLE_RT_HPP
3 
30 #include <iostream>
31 #include <ostream>
32 #include <iomanip>
33 #include <vector>
34 #include <cstdlib>
35 #include <cerrno>
36 #include <unistd.h>
37 #include <time.h>
43 #include <MTToolBox/util.hpp>
44 
45 namespace MTToolBox {
75  template<typename U, typename G>
77  public:
95  baseGenerator = &bg;
96  }
97 
126  bool search(G& rg,
129  bool verbose = false,
130  std::ostream& os = std::cout,
131  bool no_lsb = false) {
132  using namespace NTL;
133  using namespace std;
134 
135  out = &os;
136  int veq[bit_size<U>()];
137  AlgorithmReducibleRecursionSearch<U> search(rg, *baseGenerator);
139  int mexp = rg.bitSize();
140  bool found = false;
141  for (int i = 0;; i++) {
142  if (search.start(1000 * mexp)) {
143  found = true;
144  break;
145  }
146  if (verbose) {
147  *out << "not found in " << (i + 1) * 10000 << endl;
148  }
149  }
150  if (!found) {
151  return false;
152  }
153  if (verbose) {
154  time_t t = time(NULL);
155  *out << "irreducible parameter is found at " << ctime(&t);
156  }
157  if (verbose) {
158  *out << "count = " << search.getCount() << endl;
159  *out << rg.getParamString() << endl;
160  }
161  poly = search.getIrreducibleFactor();
162  parity = cp.searchParity(rg, poly);
163  weight = NTL::weight(poly);
164  GF2X lcm(0, 1);
166  NTL::GF2X quotient = lcm / poly;
167  annihilate(&rg, quotient);
168  if (verbose) {
169  AlgorithmEquidistribution<U> sb(rg, bit_size<U>());
170  int delta = sb.get_all_equidist(veq);
171  print_kv(veq, mexp, bit_size<U>());
172  *out << "delta = " << dec << delta << endl;
173  }
174  if (! no_lsb) {
175  st2(rg, verbose);
176  if (verbose) {
177  if (st2.isLSBTempering()) {
178  rg.setReverseOutput();
179  }
180  AlgorithmEquidistribution<U> sc(rg, bit_size<U>());
181  delta = sc.get_all_equidist(veq);
182  rg.resetReverseOutput();
183  time_t t = time(NULL);
184  *out << "lsb tempering parameters are found at "
185  << ctime(&t) << endl;
186  print_kv(veq, mexp, bit_size<U>());
187  *out << "lsb delta = " << dec << delta << endl;
188  }
189  }
190  st1(rg, verbose);
191  AlgorithmEquidistribution<U> sc(rg, bit_size<U>());
192  delta = sc.get_all_equidist(veq);
193  if (verbose) {
194  time_t t = time(NULL);
195  *out << "tempering parameters are found at " << ctime(&t)
196  << endl;
197  *out << rg.getParamString() << endl;
198  print_kv(veq, mexp, bit_size<U>());
199  *out << "delta = " << dec << delta << endl;
200  }
201  return true;
202  }
203 
235  bool verbose = false,
236  std::ostream& os = std::cout) {
237  return search(rg, st, st, verbose, os, true);
238  }
239 
252  int getDelta() {
253  return delta;
254  }
255 
269  const NTL::GF2X& getIrreducibleFactor() {
270  return poly;
271  }
272 
284  U getParity() const {
285  return parity;
286  }
287 
288  private:
289  int weight;
290  int delta;
291  U parity;
292  NTL::GF2X poly;
293  //NTL::GF2X characteristic;
294  std::ostream * out;
295  AbstractGenerator<U> * baseGenerator;
296 
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_Reducible_RT_HPP
可約ジェネレータの均等分布次元を計算する。
U getParity() const
可約ジェネレータの周期保証ベクトル(パリティチェックベクトル)を返す。
Definition: AlgorithmReducibleRT.hpp:284
疑似乱数生成器
Definition: AbstractGenerator.hpp:48
可約ジェネレータのパリティチェックベクトルを求める。
Definition: AlgorithmCalculateParity.hpp:91
const NTL::GF2X & getIrreducibleFactor()
状態遷移関数の特性多項式のmexp次の既約因子を返す。
Definition: AlgorithmReducibleRT.hpp:269
可約ジェネレータの状態遷移関数のパラメータを探索する。
void calcCharacteristicPolynomial(RecursionSearchable< U, V > *rand, NTL::GF2X &poly)
疑似乱数生成器の均等分布次元を計算する
Definition: AlgorithmEquidistribution.hpp:238
ユーティリティ関数群
bool search(TemperingCalculatable< U > &rg, AlgorithmTempering< U > &st, bool verbose=false, std::ostream &os=std::cout)
MSBからの均等分布次元のみを向上させたい場合の探索を行う。 状態遷移関数のパラメータは探索する。 ...
Definition: AlgorithmReducibleRT.hpp:233
可約ジェネレータの状態遷移関数のパラメータを探索する。
Definition: AlgorithmReducibleRecursionSearch.hpp:84
int get_all_equidist(int veq[])
vビット精度の均等分布次元を計算する。 v = bit_len から 1までの均等分布次元を計算して、veq[] に入れる...
Definition: AlgorithmEquidistribution.hpp:470
Definition: AlgorithmReducibleRT.hpp:76
可約ジェネレータのパリティチェックベクトルを求める。
テンパリングパラメータ探索アルゴリズムのための抽象クラス
void annihilate(EquidistributionCalculatable< U, V > *rg, const NTL::GF2X &poly)
可約疑似乱数生成器の状態空間を多項式で殲滅する。
Definition: ReducibleGenerator.hpp:148
可約ジェネレータのテンパリングパラメータ探索用の抽象クラス
bool search(G &rg, AlgorithmTempering< U > &st1, AlgorithmTempering< U > &st2, bool verbose=false, std::ostream &os=std::cout, bool no_lsb=false)
状態遷移パラメータとテンパリングパラメータを探索する。
Definition: AlgorithmReducibleRT.hpp:126
U searchParity(G &g, const NTL::GF2X &f)
qによってannihilateされる空間の基底を求め、パリティチェック用の定数を求める
Definition: AlgorithmCalculateParity.hpp:110
AlgorithmReducibleRecursionAndTempering(AbstractGenerator< U > &bg)
コンストラクタ
Definition: AlgorithmReducibleRT.hpp:94
int getDelta()
均等分布次元の理論値との差の総和を返す。
Definition: AlgorithmReducibleRT.hpp:252
疑似乱数生成器の高次元均等分布性を改善するために、テンパ リングパラメータを探索するアルゴリズム ...
Definition: AlgorithmTempering.hpp:62
virtual bool isLSBTempering() const
LSB からのテンパリングをするのか
Definition: AlgorithmTempering.hpp:107
MTToolBox の名前空間