First shot at periodicity congruences
This commit is contained in:
parent
df8f02f3ca
commit
cddb533519
@ -481,3 +481,55 @@ multivariate_laurentpoly<T>::show_self () const
|
||||
if (first)
|
||||
printf ("0");
|
||||
}
|
||||
|
||||
// functions below were added to verify several periodicity criteria
|
||||
|
||||
// function below inverts every occurence of a variable x_index
|
||||
// i.e. this means that x_index is replaced by x_index^{-1}
|
||||
template<class T>
|
||||
multivariate_laurentpoly<T> invert_variable(const multivariate_laurentpoly<T>& p, unsigned index = 1) {
|
||||
multivariate_laurentpoly<T> result;
|
||||
for (typename map<multivariate_laurent_monomial, T>::const_iter i = p.coeffs; i; i ++) {
|
||||
multivariate_laurent_monomial mon = i.key();
|
||||
T c = i.val();
|
||||
multivariate_laurent_monomial mon2;
|
||||
for(map<unsigned, int>::const_iter i = mon.m; i; i++) {
|
||||
if(i.key() == index) {
|
||||
mon2 *= multivariate_laurent_monomial(VARIABLE, i.key(), -i.val());
|
||||
}
|
||||
else {
|
||||
mon2 *= multivariate_laurent_monomial(VARIABLE, i.key(), i.val());
|
||||
}
|
||||
}
|
||||
result += multivariate_laurentpoly<T>(c, mon2);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
bool check_przytycki_cong(const multivariate_laurentpoly<T>& pol, const int prime,
|
||||
const int exponent = 1, const unsigned index = 1) {
|
||||
multivariate_laurentpoly<T> result;
|
||||
for(typename map<multivariate_laurent_monomial, T>::const_iter i = pol.coeffs; i; i++) {
|
||||
multivariate_laurent_monomial mon = i.key();
|
||||
T c = i.val();
|
||||
multivariate_laurent_monomial mon2;
|
||||
for(typename map<unsigned, int>::const_iter i = mon.m; i; i++) {
|
||||
// still need to handle the coefficient
|
||||
// i.e. we need to take c % p
|
||||
if(i.key() == index) {
|
||||
int v = i.val() % (2 * prime);
|
||||
if(v < 0) v += (2 * prime);
|
||||
mon2 *= multivariate_laurent_monomial(VARIABLE, i.key(), v);
|
||||
c.display_self();
|
||||
printf("Old: key = %d, val = %d\n", i.key(), i.val());
|
||||
printf("New: key = %d, val = %d\n", i.key(), v);
|
||||
}
|
||||
else
|
||||
mon2 *= multivariate_laurent_monomial(VARIABLE, i.key(), i.val());
|
||||
}
|
||||
result += multivariate_laurentpoly<T>(c, mon2);
|
||||
}
|
||||
result.display_self();
|
||||
return true;
|
||||
}
|
||||
|
88
kk.cpp
88
kk.cpp
@ -251,35 +251,43 @@ compute_gss ()
|
||||
tex_footer ();
|
||||
}
|
||||
|
||||
multivariate_laurentpoly<Q> compute_jones(const knot_diagram& k, bool reduced) {
|
||||
cube<Z2> c(kd, reduced);
|
||||
multivariate_laurentpoly<Q> jones;
|
||||
for(uint i = 1; i <= c.n_generators; ++i) {
|
||||
grading gr = c.compute_generator_grading(i);
|
||||
if(gr.h % 2 == 0) {
|
||||
jones += multivariate_laurentpoly<Q>(1, VARIABLE, 1, gr.q);
|
||||
}
|
||||
else {
|
||||
jones += multivariate_laurentpoly<Q>(-1, VARIABLE, 1, gr.q);
|
||||
}
|
||||
}
|
||||
return jones;
|
||||
}
|
||||
|
||||
void compute_khp(const knot_diagram& k, bool reduced) {
|
||||
cube<Z2> c(kd,reduced);
|
||||
multivariate_laurentpoly<Z> compute_jones(const knot_diagram& k, bool reduced) {
|
||||
cube<Z2> c(kd, reduced);
|
||||
ptr<const module<Z2> > C = c.khC;
|
||||
mod_map<Z2> d = c.compute_d(1, 0, 0, 0, 0);
|
||||
chain_complex_simplifier<Z2> s(C, d, maybe<int>(1), maybe<int>(0));
|
||||
C = s.new_C;
|
||||
d = s.new_d;
|
||||
C->show_self();
|
||||
//multivariate_laurentpoly<Q> khp;
|
||||
//for(uint i = 1; i <= c.n_generators; ++i) {
|
||||
// grading gr = c.compute_generator_grading(i);
|
||||
// khp += multivariate_laurentpoly<Q>(1, VARIABLE, gr.h, gr.q);
|
||||
//}
|
||||
printf("The Poincare polynomial \n");
|
||||
multivariate_laurentpoly<Z> jones;
|
||||
for(uint i = 1; i <= c.n_generators; ++i) {
|
||||
grading gr = c.compute_generator_grading(i);
|
||||
if(gr.h % 2 == 0) {
|
||||
jones += multivariate_laurentpoly<Z>(1, VARIABLE, 1, gr.q);
|
||||
}
|
||||
else {
|
||||
jones += multivariate_laurentpoly<Z>(-1, VARIABLE, 1, gr.q);
|
||||
}
|
||||
}
|
||||
return jones;
|
||||
}
|
||||
|
||||
template<class R>
|
||||
multivariate_laurentpoly<Z> compute_khp(const knot_diagram& k, bool reduced) {
|
||||
cube<R> c(kd,reduced);
|
||||
ptr<const module<R> > C = c.khC;
|
||||
mod_map<R> d = c.compute_d(1, 0, 0, 0, 0);
|
||||
chain_complex_simplifier<R> s(C, d, maybe<int>(1), maybe<int>(0));
|
||||
C = s.new_C;
|
||||
d = s.new_d;
|
||||
multivariate_laurentpoly<Z> khp;
|
||||
for(uint i = 1; i <= C->dim(); ++i) {
|
||||
grading gr = C->generator_grading(i);
|
||||
multivariate_laurentpoly<Z> p1 = multivariate_laurentpoly<Z>(1, VARIABLE, 0, gr.h);
|
||||
multivariate_laurentpoly<Z> p2 = multivariate_laurentpoly<Z>(1, VARIABLE, 1, gr.q);
|
||||
multivariate_laurentpoly<Z> p3 = p1 * p2;
|
||||
khp += p3;
|
||||
}
|
||||
return khp;
|
||||
}
|
||||
|
||||
template<class R> void
|
||||
@ -733,16 +741,36 @@ main (int argc, char **argv)
|
||||
compute_gss ();
|
||||
}
|
||||
else if(!strcmp(invariant, "jones")) {
|
||||
multivariate_laurentpoly<Q> jones_pol = compute_jones(kd, reduced);
|
||||
printf("Jones polynomial of %s is equal to:\n", knot);
|
||||
jones_pol.show_self();
|
||||
printf("\n");
|
||||
multivariate_laurentpoly<Z> jones_pol = compute_jones(kd, reduced);
|
||||
printf("Jones polynomial of %s is equal to (coefficients in %s):\n", knot, field);
|
||||
jones_pol.display_self();
|
||||
}
|
||||
else if(!strcmp(invariant, "przytycki_cong")) {
|
||||
multivariate_laurentpoly<Q> jones_pol = compute_jones(kd, reduced);
|
||||
// need to add a commandline switch to be able to read
|
||||
// symmetry order
|
||||
multivariate_laurentpoly<Z> jones_pol = compute_jones(kd, reduced);
|
||||
multivariate_laurentpoly<Z> inv_jones_pol = invert_variable(jones_pol,1);
|
||||
jones_pol.display_self();
|
||||
inv_jones_pol.display_self();
|
||||
multivariate_laurentpoly<Z> diff = jones_pol - inv_jones_pol;
|
||||
diff.display_self();
|
||||
check_przytycki_cong(diff, 3);
|
||||
}
|
||||
else if(!strcmp(invariant, "khp")) {
|
||||
compute_khp(kd, reduced);
|
||||
multivariate_laurentpoly<Z> khp;
|
||||
if(!strcmp(field, "Z2"))
|
||||
khp = compute_khp<Z2>(kd, reduced);
|
||||
else if(!strcmp(field, "Z3"))
|
||||
khp = compute_khp<Zp<3> >(kd, reduced);
|
||||
else if(!strcmp(field, "Q"))
|
||||
khp = compute_khp<Q>(kd, reduced);
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "error: unknown field %s\n", field);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
printf("Khovanov polynomial of %s is equal to (coefficients %s):\n", knot, field);
|
||||
khp.display_self();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user