From 50a2438996a29bd576485066479d9b0b37f5d839 Mon Sep 17 00:00:00 2001 From: Cotton Seed Date: Sun, 18 Mar 2012 22:55:56 -0400 Subject: [PATCH] Added Roberts' totally twisted Kh differential to spanning_tree_complex. Main set up to compare twisted E3, twisted Kh and normal Kh. --- Makefile | 4 +- algebra/module.h | 8 +- main.cpp | 257 +++++++++------------------------------- spanning_tree_complex.h | 108 ++++++++++++++++- sseq.h | 5 +- 5 files changed, 168 insertions(+), 214 deletions(-) diff --git a/Makefile b/Makefile index bdf4f2c..f207be9 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,8 @@ CXX = g++ INCLUDES = -I/opt/local/include -I. -OPTFLAGS = -g -# OPTFLAGS = -O2 -g +# OPTFLAGS = -g +OPTFLAGS = -O2 -g # OPTFLAGS = -O2 -DNDEBUG LDFLAGS = -L/opt/local/lib diff --git a/algebra/module.h b/algebra/module.h index 92d98d8..610802b 100644 --- a/algebra/module.h +++ b/algebra/module.h @@ -630,9 +630,9 @@ class map_impl : public refcounted virtual linear_combination column (unsigned i) const = 0; - linear_combination map (linear_combination &lc) const + linear_combination map (const linear_combination &lc) const { - linear_combination r; + linear_combination r (this->to); for (linear_combination_const_iter i = lc; i; i ++) r.muladd (i.val (), column (i.key ())); return r; @@ -750,7 +750,7 @@ class tensor_impl : public map_impl public: tensor_impl (ptr > f_, ptr > g_) : map_impl(f_->from->tensor (g_->from), - f_->to->tensor (g_->from)), + f_->to->tensor (g_->to)), f(f_), g(g_) { @@ -1741,7 +1741,7 @@ mod_map::homology () const template basedvector, 1> mod_map::explicit_columns () const { - basedvector, 1> v; + basedvector, 1> v (impl->from->dim ()); for (unsigned i = 1; i <= impl->from->dim (); i ++) v[i] = column (i); return v; diff --git a/main.cpp b/main.cpp index b6f8986..4ed6dc1 100644 --- a/main.cpp +++ b/main.cpp @@ -108,217 +108,74 @@ test_field () } } -void -check (const dt_code &dt) +bool +rank_lte (multivariate_laurentpoly p, + multivariate_laurentpoly q) { - if (dt.num_components () > 1) + for (map::const_iter i = p.coeffs; i; i ++) { - knot_diagram kd (dt); - kd.marked_edge = 1; - show (kd); newline (); + Z a = i.val (); + Z b = q.coeffs(i.key (), Z (0)); + assert (a != 0 && b != 0); - cube c (kd, 1); - mod_map d = c.compute_d (1, 0, 0, 0, 0); - sseq_builder b (c.khC, d); - sseq ss = b.build_sseq (); - - unsigned n_comps = kd.num_components (); - assert (n_comps == dt.num_components ()); - - unsigned split = 1; - for (unsigned k = 1; k < unsigned_2pow (n_comps) - 1; k ++) - { - knot_diagram kd2 (SUBLINK, - smallbitset (n_comps, k), - kd); - kd2.marked_edge = 1; - unsigned n_comps2 = kd2.num_components (); - - assert (n_comps2 == unsigned_bitcount (k)); - assert (n_comps2 > 0); - assert (n_comps2 < n_comps); - - cube c2 (kd2, 1); - mod_map d2 = c2.compute_d (1, 0, 0, 0, 0); - sseq_builder b2 (c2.khC, d2); - sseq ss2 = b2.build_sseq (); - - printf (" k = %d, %d <=? %d\n", - k, - ss2.pages[1].total_rank (), - ss.pages[1].total_rank ()); - if (ss2.pages[1].total_rank () > ss.pages[1].total_rank ()) - printf (" !! COUNTEREXAMPLE\n"); - - if (unsigned_bitcount (k) == 1) - split *= ss2.pages[1].total_rank (); - } - - printf (" split %d <=? %d\n", - split, - ss.pages[1].total_rank ()); - if (split > ss.pages[1].total_rank ()) - printf (" !! COUNTEREXAMPLE\n"); + if (a > b) + return 0; } + return 1; } int main () { - ptr > A - = new explicit_module (2, basedvector (), basedvector (2)); - ptr > B - = new explicit_module (3, basedvector (), basedvector (3)); - ptr > C - = new explicit_module (3, basedvector (), basedvector (3)); - ptr > D - = new explicit_module (2, basedvector (), basedvector (2)); - ptr > E - = new explicit_module (2, basedvector (), basedvector (3)); - ptr > F - = new explicit_module (2, basedvector (), basedvector (2)); - - map_builder fb (A, B); - fb[1].muladd (2, 1); - fb[1].muladd (3, 2); - fb[2].muladd (-5, 2); - fb[2].muladd (4, 3); - mod_map f (fb); - display ("f:\n", f); - - map_builder gb (C, D); - gb[1].muladd (1, 1); - gb[2].muladd (3, 1); - gb[2].muladd (-2, 2); - gb[3].muladd (-6, 2); - mod_map g (gb); - display ("g:\n", g); - - display ("f oplus g:\n", f.add (g)); - - map_builder hb (E, F); - hb[1].muladd (3, 2); - hb[2].muladd (-3, 1); - mod_map h (hb); - display ("h:\n", h); - - mod_map fg = f.tensor (g); - display ("fg:\n", fg); - - ptr > AB_C = (A->tensor (B))->tensor (C), - A_BC = A->tensor (B->tensor (C)); - assert (AB_C == A_BC); - - assert ((f.tensor (g)).tensor (h) == f.tensor (g.tensor (h))); - - ptr > homAB = A->hom (B); - linear_combination x = homAB->map_as_element (f); - display ("x:\n", x); - -#if 0 - for (unsigned i = 1; i <= 14; i ++) - { - for (unsigned j = 1; j <= mt_links (i, 0); j ++) - check (mt_link (i, 0, j)); - - for (unsigned j = 1; j <= mt_links (i, 1); j ++) - check (mt_link (i, 1, j)); - } -#endif - #if 0 - knot_diagram kd (rolfsen_knot (8, 19)); - cube c (kd); - sseq ss = compute_szabo_sseq (c); - multivariate_laurentpoly ssp = ss.pages[1].poincare_polynomial (ss.bounds); - - display ("ssp: ", ssp); - - multivariate_laurentpoly p; - p.muladdeq (5, multivariate_laurent_monomial (VARIABLE, 1, -2)); - p.muladdeq (-6, multivariate_laurent_monomial (VARIABLE, 2, 13)); - p.muladdeq (14, (multivariate_laurent_monomial (VARIABLE, 1, 5) - * multivariate_laurent_monomial (VARIABLE, 2, -6))); - display ("p: ", p); - - display ("p*p: ", p*p); - - { - writer w ("dump"); - write (w, p*p); - } - - { - reader r ("dump"); - multivariate_laurentpoly q (r); - - display ("q: ", q); - - assert (q == p*p); - } + for (unsigned i = 1; i <= 10; i ++) + for (unsigned j = 1; j <= rolfsen_crossing_knots (i); j ++) + { + knot_diagram kd (rolfsen_knot (i, j)); #endif + for (unsigned i = 1; i <= 12; i ++) + for (unsigned j = 1; j <= htw_knots (i, 0); j ++) + { + knot_diagram kd (htw_knot (i, 0, j)); + + kd.marked_edge = 1; + + show (kd); newline (); + + spanning_tree_complex c (kd); -#if 0 - multivariate_laurentpoly p = -11; - p.muladdeq (5, VARIABLE, 1); - p.muladdeq (7, VARIABLE, 2); - p.muladdeq (-3, VARIABLE, 3); + mod_map > > E2_d = c.twisted_d2 (); + assert (E2_d.compose (E2_d) == 0); + // display ("E2_d:\n", E2_d); + + chain_complex_simplifier > > E2_s (c.C, E2_d, 2); + assert (E2_s.new_d == 0); + + multivariate_laurentpoly E3_p = E2_s.new_C->free_delta_poincare_polynomial (); + printf ("E3_p = "); show (E3_p); newline (); + + mod_map > > tt_d = c.totally_twisted_kh_d (); + assert (tt_d.compose (tt_d) == 0); + // display ("tt_d:\n", tt_d); + + chain_complex_simplifier > > tt_s (c.C, tt_d, 2); + assert (tt_s.new_d == 0); - multivariate_laurentpoly q = p*p + p + 23; - multivariate_laurentpoly r = q*q - Z (7)*p + 81; - - multivariate_laurentpoly s = r - p*q + 10; - - display ("p:", p); - display ("q:", q); - display ("r:", r); - display ("s:", s); - - map, std::string> m; - m.push (p, "p"); - m.push (q, "q"); - m.push (r, "thisisr"); - - assert (m % p); - assert (m % q); - assert (m % r); - assert (! (m % s)); - - assert (m(p) == "p"); - assert (m(q) == "q"); - assert (m(r) == "thisisr"); - - std::string str ("This is a test."); - - { - writer w ("test.dat"); - write (w, m); - } - - reader rdr ("test.dat"); - map, std::string> m2 (rdr); - - assert (m == m2); - - assert (m2(p) == "p"); - assert (m2(q) == "q"); - assert (m2(r) == "thisisr"); -#endif - -#if 0 - test_ring (2); - test_ring (0); - test_ring (0); - test_ring > (2); - test_ring > (3); - test_ring > (5); - test_ring > (7); - - test_field (); - test_field > (); - test_field > (); - test_field > (); - test_field (); - test_field > (); -#endif + multivariate_laurentpoly tt_p = tt_s.new_C->free_delta_poincare_polynomial (); + printf ("tt_p = "); show (tt_p); newline (); + + cube kh_c (kd, 1); + mod_map kh_d = kh_c.compute_d (1, 0, 0, 0, 0); + + sseq_builder builder (kh_c.khC, kh_d); + sseq ss = builder.build_sseq (); + multivariate_laurentpoly kh_p = ss.pages[1].delta_poincare_polynomial (ss.bounds); + printf ("kh_p = "); show (kh_p); newline (); + + if (tt_p != kh_p) + printf (" > tt_p != kh_p!!\n"); + + if (! rank_lte (E3_p, tt_p)) + printf (" > rank E2 > rank tt!!\n"); + } } diff --git a/spanning_tree_complex.h b/spanning_tree_complex.h index 733c81d..5a7a091 100644 --- a/spanning_tree_complex.h +++ b/spanning_tree_complex.h @@ -22,7 +22,8 @@ class spanning_tree_complex grading tree_grading (unsigned i) const; void show_tree (unsigned i) const; - + + mod_map totally_twisted_kh_d () const; mod_map twisted_d2 () const; }; @@ -90,8 +91,8 @@ template mod_map > > spanning_tree_complex::twisted_d2 () const { assert (kd.marked_edge); - - mod_map d (C); + + map_builder b (C); basedvector edge_weight (kd.num_edges ()); for (unsigned i = 1; i <= kd.num_edges (); i ++) @@ -201,10 +202,107 @@ spanning_tree_complex::twisted_d2 () const x += R (polynomial (1), polynomial (1) + polynomial (1, B)); - d[i].muladd (x, j); + b[i].muladd (x, j); } } } - return d; + return mod_map (b); +} + +template mod_map > > +spanning_tree_complex::totally_twisted_kh_d () const +{ + assert (kd.marked_edge); + + map_builder b (C); + + basedvector edge_weight (kd.num_edges ()); + for (unsigned i = 1; i <= kd.num_edges (); i ++) + { + edge_weight[i] = i; + // edge_weight[i] = (1 << i); + // edge_weight[i] = 1; + } + + for (unsigned i = 1; i <= trees.size (); i ++) + { + set t = trees[i]; + + smallbitset r (kd.n_crossings); + for (unsigned k = 1; k <= kd.n_crossings; k ++) + { + if ((edge_height[k] == 1) == (t % k)) + r.push (k); + } + smoothing s (kd, r); + + for (set_const_iter ee = t; ee; ee ++) + { + unsigned e = ee.val (); + + if (edge_height[e] != 0) + continue; + + for (unsigned f = 1; f <= bg.num_edges (); f ++) + { + if (edge_height[f] != 1 || (t % f)) + continue; + + set t2 (COPY, t); + t2.yank (e); + t2.push (f); + unsigned j = tree_idx(t2, 0); + if (j == 0) + continue; + + set neither (COPY, t); + neither.yank (e); + + smallbitset neither_r (kd.n_crossings); + for (unsigned k = 1; k <= kd.n_crossings; k ++) + { + if ((edge_height[k] == 1) == (neither % k)) + neither_r.push (k); + } + smoothing neither_s (kd, neither_r); + + set both (COPY, t); + both.push (f); + + R A = 0; + for (unsigned k = 1; k <= kd.num_edges (); k ++) + { + if (neither_s.edge_circle[k] + != neither_s.edge_circle[kd.marked_edge]) + A += polynomial (1, edge_weight[k]); + } + + smallbitset both_r (kd.n_crossings); + for (unsigned k = 1; k <= kd.n_crossings; k ++) + { + if ((edge_height[k] == 1) == (both % k)) + both_r.push (k); + } + smoothing both_s (kd, both_r); + + R B = 0; + for (unsigned k = 1; k <= kd.num_edges (); k ++) + { + if (both_s.edge_circle[k] + != both_s.edge_circle[kd.marked_edge]) + B += polynomial (1, edge_weight[k]); + } + + R x; + + x += R (polynomial (1)) / A; + x += R (polynomial (1)) / B; + + b[i].muladd (x, j); + } + } + } + + return mod_map (b); } diff --git a/sseq.h b/sseq.h index 822ddbf..29fa5a9 100644 --- a/sseq.h +++ b/sseq.h @@ -150,8 +150,7 @@ class chain_complex_simplifier mod_map pi, iota; private: - mod_map new_d0; - + basedvector new_d0; basedvector, 1> preim; bool build_pi_iota; @@ -271,7 +270,7 @@ chain_complex_simplifier::chain_complex_simplifier (ptr > C_, int dh, bool build_pi_iota_) : C(C_), n(C_->dim ()), d(d_), - new_d0(COPY2, d), + new_d0(COPY2, d_.explicit_columns ()), preim(C_->dim ()), build_pi_iota(build_pi_iota_) {