From cddb533519ed2832f46a0713ca52bd7111522b66 Mon Sep 17 00:00:00 2001 From: Wojciech Politarczyk Date: Sat, 19 Nov 2016 20:53:18 +0100 Subject: [PATCH] First shot at periodicity congruences --- algebra/multivariate_laurentpoly.h | 52 ++++++++++++++++++ kk.cpp | 88 ++++++++++++++++++++---------- 2 files changed, 110 insertions(+), 30 deletions(-) diff --git a/algebra/multivariate_laurentpoly.h b/algebra/multivariate_laurentpoly.h index 8e9f3a1..a26122c 100644 --- a/algebra/multivariate_laurentpoly.h +++ b/algebra/multivariate_laurentpoly.h @@ -481,3 +481,55 @@ multivariate_laurentpoly::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 +multivariate_laurentpoly invert_variable(const multivariate_laurentpoly& p, unsigned index = 1) { + multivariate_laurentpoly result; + for (typename map::const_iter i = p.coeffs; i; i ++) { + multivariate_laurent_monomial mon = i.key(); + T c = i.val(); + multivariate_laurent_monomial mon2; + for(map::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(c, mon2); + } + return result; +} + +template +bool check_przytycki_cong(const multivariate_laurentpoly& pol, const int prime, + const int exponent = 1, const unsigned index = 1) { + multivariate_laurentpoly result; + for(typename map::const_iter i = pol.coeffs; i; i++) { + multivariate_laurent_monomial mon = i.key(); + T c = i.val(); + multivariate_laurent_monomial mon2; + for(typename map::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(c, mon2); + } + result.display_self(); + return true; +} diff --git a/kk.cpp b/kk.cpp index ba9e72a..b3803ef 100644 --- a/kk.cpp +++ b/kk.cpp @@ -251,35 +251,43 @@ compute_gss () tex_footer (); } -multivariate_laurentpoly compute_jones(const knot_diagram& k, bool reduced) { - cube c(kd, reduced); - multivariate_laurentpoly 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(1, VARIABLE, 1, gr.q); - } - else { - jones += multivariate_laurentpoly(-1, VARIABLE, 1, gr.q); - } - } - return jones; -} - -void compute_khp(const knot_diagram& k, bool reduced) { - cube c(kd,reduced); +multivariate_laurentpoly compute_jones(const knot_diagram& k, bool reduced) { + cube c(kd, reduced); ptr > C = c.khC; mod_map d = c.compute_d(1, 0, 0, 0, 0); chain_complex_simplifier s(C, d, maybe(1), maybe(0)); C = s.new_C; d = s.new_d; - C->show_self(); - //multivariate_laurentpoly khp; - //for(uint i = 1; i <= c.n_generators; ++i) { - // grading gr = c.compute_generator_grading(i); - // khp += multivariate_laurentpoly(1, VARIABLE, gr.h, gr.q); - //} - printf("The Poincare polynomial \n"); + multivariate_laurentpoly 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(1, VARIABLE, 1, gr.q); + } + else { + jones += multivariate_laurentpoly(-1, VARIABLE, 1, gr.q); + } + } + return jones; +} + +template +multivariate_laurentpoly compute_khp(const knot_diagram& k, bool reduced) { + cube c(kd,reduced); + ptr > C = c.khC; + mod_map d = c.compute_d(1, 0, 0, 0, 0); + chain_complex_simplifier s(C, d, maybe(1), maybe(0)); + C = s.new_C; + d = s.new_d; + multivariate_laurentpoly khp; + for(uint i = 1; i <= C->dim(); ++i) { + grading gr = C->generator_grading(i); + multivariate_laurentpoly p1 = multivariate_laurentpoly(1, VARIABLE, 0, gr.h); + multivariate_laurentpoly p2 = multivariate_laurentpoly(1, VARIABLE, 1, gr.q); + multivariate_laurentpoly p3 = p1 * p2; + khp += p3; + } + return khp; } template void @@ -733,16 +741,36 @@ main (int argc, char **argv) compute_gss (); } else if(!strcmp(invariant, "jones")) { - multivariate_laurentpoly jones_pol = compute_jones(kd, reduced); - printf("Jones polynomial of %s is equal to:\n", knot); - jones_pol.show_self(); - printf("\n"); + multivariate_laurentpoly 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 jones_pol = compute_jones(kd, reduced); + // need to add a commandline switch to be able to read + // symmetry order + multivariate_laurentpoly jones_pol = compute_jones(kd, reduced); + multivariate_laurentpoly inv_jones_pol = invert_variable(jones_pol,1); + jones_pol.display_self(); + inv_jones_pol.display_self(); + multivariate_laurentpoly 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 khp; + if(!strcmp(field, "Z2")) + khp = compute_khp(kd, reduced); + else if(!strcmp(field, "Z3")) + khp = compute_khp >(kd, reduced); + else if(!strcmp(field, "Q")) + khp = compute_khp(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 {