#ifndef _KNOTKIT_PERIODICITY_H #define _KNOTKIT_PERIODICITY_H #include #include #include #include #include #include #include extern bool verbose; extern const char* knot; extern std::string periodicity_test; const std::vector primes_list = {5, 7, 11, 13, 17, 19}; enum class Test_type { Przytycki_criterion, BKP_criterion, all }; template class periodic_congruence_checker { public: using polynomial = multivariate_laurentpoly; using monomial = multivariate_laurent_monomial; int prime; unsigned index; polynomial prepare_polynomial(const polynomial& pol) const { return (pol - invert_variable(pol, index)); } bool reduce(const polynomial& pol) const; public: periodic_congruence_checker(int pprime = 5, unsigned ind = 2) : prime(pprime), index(ind) {} ~periodic_congruence_checker() {}; bool operator() (const polynomial& pol) const { return reduce(prepare_polynomial(pol)); } }; template bool periodic_congruence_checker::reduce(const multivariate_laurentpoly& pol) const { polynomial res; for(typename map::const_iter i = pol.coeffs; i; i++) { int c = i.key().m[index] % (2 * prime); if(c < 0) c += (2 * prime); monomial mon = monomial(VARIABLE, index, c); res += polynomial(i.val(), mon); } if(verbose) std::cout << "reduced = " << res << "\n"; return res == 0; } template class Przytycki_periodicity_checker { using polynomial = multivariate_laurentpoly>; using monomial = multivariate_laurent_monomial; periodic_congruence_checker> cong_checker; public: Przytycki_periodicity_checker() : cong_checker(p) {} ~Przytycki_periodicity_checker() {} std::string operator() (const polynomial& pol) const { std::ostringstream out; out << knot << ": period = " << p << ": " << (cong_checker(pol) ? "Maybe" : "No"); return out.str(); } }; class Kh_periodicity_checker { using polynomial = multivariate_laurentpoly; using monomial = multivariate_laurent_monomial; unsigned ev_index; unsigned index; polynomial khp, leep, quot; polynomial mul; void compute_knot_polynomials(knot_diagram& kd); void compute_quot(); std::pair compute_quotient_and_remainder(const polynomial& p, int period) const; std::list generate_candidates(const polynomial& q) const; bool check(const polynomial& q, const polynomial& r, int period) const; public: Kh_periodicity_checker(knot_diagram& kd) { ev_index = 1; index = 2; mul = polynomial(Z(1)) + polynomial(1, VARIABLE, ev_index) * polynomial(1, VARIABLE, index, 2); compute_knot_polynomials(kd); compute_quot(); } ~Kh_periodicity_checker() {} std::string operator () (int period) const; }; #endif // _KNOTKIT_PERIODICITY_H