/**
         * 状態遷移パラメータとテンパリングパラメータを探索する。
         *
         * @param lg テンパリングパラメータ計算可能な疑似乱数生成器
         * @param st1 テンパリングパラメータ探索アルゴリズム
         * @param st2 テンパリングパラメータ探索アルゴリズム(LSB)
         * @param verbose 余分な情報を出力するフラグ
         * @param os 出力ストリーム
         * @param no_lsb LSBからのテンパリングをしない
         * @return 原始多項式を発見した
         */
        bool search(TemperingCalculatable<T>& lg,
                    AlgorithmTempering<T>& st1,
                    AlgorithmTempering<T>& st2,
                    bool verbose = false,
                    std::ostream& os = std::cout,
                    bool no_lsb = false) {
            using namespace NTL;
            using namespace std;
            using namespace std::tr1;

            out = &os;
            int veq[bit_size<T>()];
            AlgorithmRecursionSearch<T> search(lg, *baseGenerator);
            int mexp = lg.bitSize();
            bool found = false;
            for (int i = 0;; i++) {
                if (search.start(1000 * mexp)) {
                    found = true;
                    break;
                }
                if (verbose) {
                    *out << "not found in " << (i + 1) * 10000 << endl;
                }
            }
            if (!found) {
                return false;
            }
            if (verbose) {
                time_t t = time(NULL);
                *out << "irreducible parameter is found at " << ctime(&t);
            }
            if (verbose) {
                *out << "count = " << search.getCount() << endl;
                *out << lg.getParamString() << endl;
            }
            poly = search.getMinPoly();
            weight = NTL::weight(poly);
            if (verbose) {
                AlgorithmEquidistribution<T> sb(lg, bit_size<T>());
                //print_binary(*out, poly);
                int delta = sb.get_all_equidist(veq);
                print_kv(veq, mexp, bit_size<T>());
                *out << "delta = " << dec << delta << endl;
            }
            if (! no_lsb) {
                st2(lg, verbose);
                if (verbose) {
                    if (st2.isLSBTempering()) {
                        lg.setReverseOutput();
                    }
                    AlgorithmEquidistribution<T> sc(lg, bit_size<T>());
                    delta = sc.get_all_equidist(veq);
                    lg.resetReverseOutput();
                    time_t t = time(NULL);
                    *out << "lsb tempering parameters are found at "
                         << ctime(&t) << endl;
                    print_kv(veq, mexp, bit_size<T>());
                    *out << "lsb delta = " << dec << delta << endl;
                }
            }
            st1(lg, verbose);
            AlgorithmEquidistribution<T> sc(lg, bit_size<T>());
            delta = sc.get_all_equidist(veq);
            if (verbose) {
                time_t t = time(NULL);
                *out << "tempering parameters are found at " << ctime(&t)
                     << endl;
                *out << lg.getParamString() << endl;
                print_kv(veq, mexp, bit_size<T>());
                *out << "delta = " << dec << delta << endl;
            }
            return true;
        }