2016-11-19 21:01:10 +01:00
|
|
|
#ifndef _KNOTKIT_PERIODICITY_H
|
|
|
|
#define _KNOTKIT_PERIODICITY_H
|
|
|
|
|
|
|
|
#include <knotkit.h>
|
|
|
|
#include <sstream>
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
extern bool verbose;
|
|
|
|
extern const char* knot;
|
|
|
|
|
|
|
|
extern std::string periodicity_test;
|
|
|
|
|
|
|
|
const std::vector<int> primes_list = {5, 7, 11, 13, 17, 19};
|
|
|
|
|
2016-11-28 09:26:41 +01:00
|
|
|
const unsigned eval_index = 1;
|
|
|
|
const unsigned invert_index = 2;
|
2016-11-19 21:01:10 +01:00
|
|
|
|
|
|
|
template<class T>
|
|
|
|
class periodic_congruence_checker {
|
2016-11-28 09:26:41 +01:00
|
|
|
protected:
|
2016-11-19 21:01:10 +01:00
|
|
|
using polynomial = multivariate_laurentpoly<T>;
|
|
|
|
using monomial = multivariate_laurent_monomial;
|
|
|
|
|
|
|
|
int prime;
|
|
|
|
unsigned index;
|
|
|
|
|
|
|
|
polynomial prepare_polynomial(const polynomial& pol) const {
|
2016-11-28 09:26:41 +01:00
|
|
|
polynomial inv = invert_variable(pol, index);
|
|
|
|
return pol - inv;
|
2016-11-19 21:01:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool reduce(const polynomial& pol) const;
|
|
|
|
|
|
|
|
public:
|
|
|
|
periodic_congruence_checker(int pprime = 5,
|
2016-11-28 09:26:41 +01:00
|
|
|
unsigned ind = invert_index) :
|
2016-11-19 21:01:10 +01:00
|
|
|
prime(pprime),
|
|
|
|
index(ind)
|
|
|
|
{}
|
|
|
|
|
2016-11-28 09:26:41 +01:00
|
|
|
virtual ~periodic_congruence_checker() {};
|
2016-11-19 21:01:10 +01:00
|
|
|
|
|
|
|
bool operator() (const polynomial& pol) const {
|
|
|
|
return reduce(prepare_polynomial(pol));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
bool periodic_congruence_checker<T>::reduce(const multivariate_laurentpoly<T>& pol) const {
|
|
|
|
polynomial res;
|
|
|
|
for(typename map<monomial, T>::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);
|
|
|
|
}
|
2016-11-28 09:26:41 +01:00
|
|
|
// if(verbose)
|
|
|
|
// std::cout << "reduced = " << res << "\n";
|
2016-11-19 21:01:10 +01:00
|
|
|
return res == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Przytycki_periodicity_checker {
|
2016-11-28 09:26:41 +01:00
|
|
|
using polynomial = multivariate_laurentpoly<Z>;
|
2016-11-19 21:01:10 +01:00
|
|
|
using monomial = multivariate_laurent_monomial;
|
|
|
|
|
2016-11-28 09:26:41 +01:00
|
|
|
polynomial jones_pol;
|
|
|
|
|
|
|
|
bool check(int period) const;
|
2016-11-19 21:01:10 +01:00
|
|
|
|
|
|
|
public:
|
2016-11-28 09:26:41 +01:00
|
|
|
Przytycki_periodicity_checker(polynomial j) : jones_pol(j) {}
|
2016-11-19 21:01:10 +01:00
|
|
|
|
|
|
|
~Przytycki_periodicity_checker() {}
|
|
|
|
|
2016-11-28 09:26:41 +01:00
|
|
|
std::string operator() (int period) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
class polynomial_iterator {
|
|
|
|
using polynomial = multivariate_laurentpoly<T>;
|
|
|
|
using monomial = multivariate_laurent_monomial;
|
|
|
|
|
|
|
|
std::vector<monomial> monomials;
|
|
|
|
std::vector<T> bounds;
|
|
|
|
std::vector<T> current_pos;
|
|
|
|
unsigned level;
|
|
|
|
|
|
|
|
void check_current_pos();
|
|
|
|
|
|
|
|
public:
|
|
|
|
enum class start_pos { begin, end };
|
|
|
|
|
|
|
|
polynomial_iterator(const polynomial& init,
|
|
|
|
start_pos sp = start_pos::begin);
|
|
|
|
polynomial_iterator(const polynomial_iterator& pi) =default;
|
|
|
|
polynomial_iterator(polynomial_iterator&& pi) =default;
|
|
|
|
|
|
|
|
~polynomial_iterator() {}
|
|
|
|
|
|
|
|
polynomial_iterator& operator = (const polynomial_iterator& pi) =default;
|
|
|
|
polynomial_iterator& operator = (polynomial_iterator&& pi) =default;
|
|
|
|
|
|
|
|
polynomial_iterator& operator ++();
|
|
|
|
|
|
|
|
bool operator == (const polynomial_iterator& pi) const {
|
|
|
|
if(level == monomials.size() || pi.level == pi.monomials.size()) {
|
|
|
|
return level == pi.level &&
|
|
|
|
monomials == pi.monomials &&
|
|
|
|
bounds == pi.bounds;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return level == pi.level &&
|
|
|
|
bounds == pi.bounds &&
|
|
|
|
monomials == pi.monomials &&
|
|
|
|
current_pos == pi.current_pos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bool operator != (const polynomial_iterator& pi) const {
|
|
|
|
return !(*this == pi);
|
|
|
|
}
|
|
|
|
polynomial operator*() const;
|
|
|
|
|
|
|
|
T get_count() const {
|
|
|
|
Z res = 1;
|
|
|
|
for(auto& v : bounds)
|
|
|
|
res *= (v + 1);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string write_self() const;
|
|
|
|
friend inline std::ostream& operator << (std::ostream& os, const polynomial_iterator& pi) {
|
|
|
|
return os << pi.write_self();
|
2016-11-19 21:01:10 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-11-28 09:26:41 +01:00
|
|
|
template<class T>
|
|
|
|
std::ostream& operator << (std::ostream& os, const polynomial_iterator<T>& pi) {
|
|
|
|
return os << *pi;
|
|
|
|
}
|
|
|
|
|
2016-11-19 21:01:10 +01:00
|
|
|
class Kh_periodicity_checker {
|
|
|
|
using polynomial = multivariate_laurentpoly<Z>;
|
|
|
|
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<polynomial, polynomial> compute_quotient_and_remainder(const polynomial& p,
|
|
|
|
int period) const;
|
2016-11-28 09:26:41 +01:00
|
|
|
// std::list<polynomial> generate_candidates(const polynomial& q) const;
|
2016-11-19 21:01:10 +01:00
|
|
|
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;
|
2016-11-28 09:26:41 +01:00
|
|
|
|
|
|
|
polynomial get_KhP() const {
|
|
|
|
return khp;
|
|
|
|
}
|
|
|
|
|
|
|
|
polynomial get_LeeP() const {
|
|
|
|
return leep;
|
|
|
|
}
|
2016-11-19 21:01:10 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _KNOTKIT_PERIODICITY_H
|