Code to extract component(s) of links in knot_diagram. main.cpp set
to test inequality conjecture implied by forgetful spectral sequence for Kh.
This commit is contained in:
parent
1ea96353a7
commit
0ed96458e1
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,3 +4,5 @@
|
|||||||
/main
|
/main
|
||||||
/testsurfaces
|
/testsurfaces
|
||||||
/serial.cmd*
|
/serial.cmd*
|
||||||
|
/save
|
||||||
|
*/save
|
||||||
|
180
knot_diagram.cpp
180
knot_diagram.cpp
@ -295,6 +295,165 @@ knot_diagram::knot_diagram (const dt_code &dt)
|
|||||||
calculate_smoothing_orientation ();
|
calculate_smoothing_orientation ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
knot_diagram::knot_diagram (sublink,
|
||||||
|
smallbitset c,
|
||||||
|
const knot_diagram &kd)
|
||||||
|
: name(kd.name),
|
||||||
|
n_crossings(0),
|
||||||
|
marked_edge(0),
|
||||||
|
nminus(0),
|
||||||
|
nplus(0)
|
||||||
|
{
|
||||||
|
// ??? assert (!kd.marked_edge);
|
||||||
|
assert (c.card () > 0); // no empty diagrams
|
||||||
|
|
||||||
|
// edge x component
|
||||||
|
unionfind<1> u (kd.num_edges ());
|
||||||
|
|
||||||
|
for (unsigned i = 1; i <= kd.n_crossings; i ++)
|
||||||
|
{
|
||||||
|
u.join (kd.ept_edge (kd.crossings[i][1]),
|
||||||
|
kd.ept_edge (kd.crossings[i][3]));
|
||||||
|
u.join (kd.ept_edge (kd.crossings[i][2]),
|
||||||
|
kd.ept_edge (kd.crossings[i][4]));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert (u.num_sets () == c.size ());
|
||||||
|
|
||||||
|
ullmanset<1> u_sets (kd.num_edges ());
|
||||||
|
for (unsigned i = 1; i <= kd.num_edges (); i ++)
|
||||||
|
u_sets += u.find (i);
|
||||||
|
|
||||||
|
ullmanset<1> sub_crossings (kd.n_crossings),
|
||||||
|
sub_edges (kd.num_edges ());
|
||||||
|
|
||||||
|
for (unsigned i = 1; i <= kd.num_edges (); i ++)
|
||||||
|
{
|
||||||
|
if (c % (u_sets.position (u.find (i)) + 1))
|
||||||
|
sub_edges.push (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sub edge x sublink edge
|
||||||
|
unionfind<1> subu (sub_edges.card ());
|
||||||
|
|
||||||
|
set<unsigned> active_comps;
|
||||||
|
|
||||||
|
for (unsigned i = 1; i <= kd.n_crossings; i ++)
|
||||||
|
{
|
||||||
|
unsigned c1 = u_sets.position (u.find (kd.ept_edge (kd.crossings[i][1]))) + 1,
|
||||||
|
c2 = u_sets.position (u.find (kd.ept_edge (kd.crossings[i][2]))) + 1;
|
||||||
|
|
||||||
|
if (c % c1
|
||||||
|
&& c % c2)
|
||||||
|
{
|
||||||
|
sub_crossings.push (i);
|
||||||
|
active_comps += c1;
|
||||||
|
active_comps += c2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (c % (u_sets.position (u.find (kd.ept_edge (kd.crossings[i][1]))) + 1))
|
||||||
|
{
|
||||||
|
subu.join (sub_edges.position (kd.ept_edge (kd.crossings[i][1])) + 1,
|
||||||
|
sub_edges.position (kd.ept_edge (kd.crossings[i][3])) + 1);
|
||||||
|
}
|
||||||
|
if (c % (u_sets.position (u.find (kd.ept_edge (kd.crossings[i][2]))) + 1))
|
||||||
|
{
|
||||||
|
subu.join (sub_edges.position (kd.ept_edge (kd.crossings[i][2])) + 1,
|
||||||
|
sub_edges.position (kd.ept_edge (kd.crossings[i][4])) + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
n_crossings = (sub_crossings.card ()
|
||||||
|
+ (c.card () - active_comps.card ()));
|
||||||
|
|
||||||
|
assert (n_crossings > 0);
|
||||||
|
|
||||||
|
ullmanset<1> subu_sets (sub_edges.card ());
|
||||||
|
for (unsigned i = 1; i <= sub_edges.card (); i ++)
|
||||||
|
subu_sets += subu.find (i);
|
||||||
|
|
||||||
|
crossings = basedvector<basedvector<unsigned, 1>, 1> (n_crossings);
|
||||||
|
for (unsigned i = 1; i <= n_crossings; i ++)
|
||||||
|
crossings[i] = basedvector<unsigned, 1> (4);
|
||||||
|
for (ullmanset_const_iter<1> i = sub_crossings; i; i ++)
|
||||||
|
{
|
||||||
|
unsigned c = i.val (),
|
||||||
|
new_c = i.pos () + 1;
|
||||||
|
|
||||||
|
unsigned e1 = (subu_sets.position
|
||||||
|
(subu.find (sub_edges.position (kd.ept_edge (kd.crossings[c][1])) + 1)) + 1),
|
||||||
|
e2 = (subu_sets.position
|
||||||
|
(subu.find (sub_edges.position (kd.ept_edge (kd.crossings[c][2])) + 1)) + 1),
|
||||||
|
e3 = (subu_sets.position
|
||||||
|
(subu.find (sub_edges.position (kd.ept_edge (kd.crossings[c][3])) + 1)) + 1),
|
||||||
|
e4 = (subu_sets.position
|
||||||
|
(subu.find (sub_edges.position (kd.ept_edge (kd.crossings[c][4])) + 1)) + 1);
|
||||||
|
|
||||||
|
if (kd.is_from_ept (kd.crossings[c][1]))
|
||||||
|
crossings[new_c][1] = edge_from_ept (e1);
|
||||||
|
else
|
||||||
|
crossings[new_c][1] = edge_to_ept (e1);
|
||||||
|
|
||||||
|
if (kd.is_from_ept (kd.crossings[c][2]))
|
||||||
|
crossings[new_c][2] = edge_from_ept (e2);
|
||||||
|
else
|
||||||
|
crossings[new_c][2] = edge_to_ept (e2);
|
||||||
|
|
||||||
|
if (kd.is_from_ept (kd.crossings[c][3]))
|
||||||
|
crossings[new_c][3] = edge_from_ept (e3);
|
||||||
|
else
|
||||||
|
crossings[new_c][3] = edge_to_ept (e3);
|
||||||
|
|
||||||
|
if (kd.is_from_ept (kd.crossings[c][4]))
|
||||||
|
crossings[new_c][4] = edge_from_ept (e4);
|
||||||
|
else
|
||||||
|
crossings[new_c][4] = edge_to_ept (e4);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned e = subu.num_sets ();
|
||||||
|
unsigned new_c = sub_crossings.card ();
|
||||||
|
for (smallbitset_const_iter i = c; i; i ++)
|
||||||
|
{
|
||||||
|
if (active_comps % i.val ())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
unsigned e1 = (subu_sets.position
|
||||||
|
(subu.find (sub_edges.position (u_sets.nth (i.val () - 1)) + 1)) + 1);
|
||||||
|
unsigned e2 = ++ e;
|
||||||
|
unsigned c = ++ new_c;
|
||||||
|
|
||||||
|
crossings[c][1] = edge_from_ept (e1);
|
||||||
|
crossings[c][2] = edge_to_ept (e1);
|
||||||
|
|
||||||
|
crossings[c][3] = edge_to_ept (e2);
|
||||||
|
crossings[c][4] = edge_from_ept (e2);
|
||||||
|
}
|
||||||
|
assert (e == num_edges ());
|
||||||
|
assert (new_c == n_crossings);
|
||||||
|
|
||||||
|
// ?? break this out into aux function
|
||||||
|
ept_crossing = basedvector<unsigned, 1> (num_epts ());
|
||||||
|
ept_index = basedvector<unsigned, 1> (num_epts ());
|
||||||
|
for (unsigned i = 1; i <= n_crossings; i ++)
|
||||||
|
{
|
||||||
|
for (unsigned j = 1; j <= 4; j ++)
|
||||||
|
{
|
||||||
|
unsigned p = crossings[i][j];
|
||||||
|
ept_crossing[p] = i;
|
||||||
|
ept_index[p] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
check_crossings ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
calculate_smoothing_orientation ();
|
||||||
|
calculate_nminus_nplus ();
|
||||||
|
}
|
||||||
|
|
||||||
knot_diagram::knot_diagram (mirror, const knot_diagram &kd)
|
knot_diagram::knot_diagram (mirror, const knot_diagram &kd)
|
||||||
: name("mirror(" + kd.name + ")"),
|
: name("mirror(" + kd.name + ")"),
|
||||||
n_crossings(kd.n_crossings),
|
n_crossings(kd.n_crossings),
|
||||||
@ -342,6 +501,12 @@ knot_diagram::check_crossings ()
|
|||||||
assert (ept_index[p] == j);
|
assert (ept_index[p] == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 1; i <= num_edges (); i ++)
|
||||||
|
{
|
||||||
|
unsigned to = edge_to_ept (i);
|
||||||
|
assert (is_from_ept (crossings[ept_crossing[to]][add_base1_mod4 (ept_index[to], 2)]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -596,6 +761,21 @@ static unsigned corner_index (unsigned x)
|
|||||||
return ((x - 1) % 4) + 1;
|
return ((x - 1) % 4) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
knot_diagram::num_components () const
|
||||||
|
{
|
||||||
|
unionfind<1> u (num_edges ());
|
||||||
|
|
||||||
|
for (unsigned i = 1; i <= n_crossings; i ++)
|
||||||
|
{
|
||||||
|
u.join (ept_edge (crossings[i][1]),
|
||||||
|
ept_edge (crossings[i][3]));
|
||||||
|
u.join (ept_edge (crossings[i][2]),
|
||||||
|
ept_edge (crossings[i][4]));
|
||||||
|
}
|
||||||
|
return u.num_sets ();
|
||||||
|
}
|
||||||
|
|
||||||
directed_multigraph
|
directed_multigraph
|
||||||
knot_diagram::black_graph (basedvector<unsigned, 1> &bg_edge_height) const
|
knot_diagram::black_graph (basedvector<unsigned, 1> &bg_edge_height) const
|
||||||
{
|
{
|
||||||
|
@ -10,6 +10,7 @@ add_base1_mod4 (unsigned x, unsigned y)
|
|||||||
|
|
||||||
enum mirror { MIRROR };
|
enum mirror { MIRROR };
|
||||||
enum connect_sum { CONNECT_SUM };
|
enum connect_sum { CONNECT_SUM };
|
||||||
|
enum sublink { SUBLINK };
|
||||||
|
|
||||||
class knot_diagram
|
class knot_diagram
|
||||||
{
|
{
|
||||||
@ -96,6 +97,8 @@ class knot_diagram
|
|||||||
}
|
}
|
||||||
bool is_smoothing_to_ept (unsigned p) const { return !is_smoothing_from_ept (p); }
|
bool is_smoothing_to_ept (unsigned p) const { return !is_smoothing_from_ept (p); }
|
||||||
|
|
||||||
|
unsigned num_components () const;
|
||||||
|
|
||||||
void orient ();
|
void orient ();
|
||||||
void calculate_nminus_nplus ();
|
void calculate_nminus_nplus ();
|
||||||
void calculate_smoothing_orientation ();
|
void calculate_smoothing_orientation ();
|
||||||
@ -116,6 +119,9 @@ class knot_diagram
|
|||||||
knot_diagram (connect_sum,
|
knot_diagram (connect_sum,
|
||||||
const knot_diagram &d1,
|
const knot_diagram &d1,
|
||||||
const knot_diagram &d2);
|
const knot_diagram &d2);
|
||||||
|
knot_diagram (sublink,
|
||||||
|
smallbitset c,
|
||||||
|
const knot_diagram &kd);
|
||||||
|
|
||||||
knot_diagram (const std::string &name_, unsigned n_crossings_, unsigned crossings_ar[][4]);
|
knot_diagram (const std::string &name_, unsigned n_crossings_, unsigned crossings_ar[][4]);
|
||||||
knot_diagram (const std::string &name_, const basedvector<basedvector<unsigned, 1>, 1> &crossings_);
|
knot_diagram (const std::string &name_, const basedvector<basedvector<unsigned, 1>, 1> &crossings_);
|
||||||
|
65
main.cpp
65
main.cpp
@ -108,9 +108,72 @@ test_field ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
check (const dt_code &dt)
|
||||||
|
{
|
||||||
|
if (dt.num_components () > 1)
|
||||||
|
{
|
||||||
|
knot_diagram kd (dt);
|
||||||
|
kd.marked_edge = 1;
|
||||||
|
show (kd); newline ();
|
||||||
|
|
||||||
|
cube<Z2> c (kd, 1);
|
||||||
|
mod_map<Z2> 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<Z2> c2 (kd2, 1);
|
||||||
|
mod_map<Z2> 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
knot_diagram kd (rolfsen_knot (8, 19));
|
knot_diagram kd (rolfsen_knot (8, 19));
|
||||||
cube<Z2> c (kd);
|
cube<Z2> c (kd);
|
||||||
@ -143,6 +206,7 @@ main ()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
multivariate_laurentpoly<Z> p = -11;
|
multivariate_laurentpoly<Z> p = -11;
|
||||||
p.muladdeq (5, VARIABLE, 1);
|
p.muladdeq (5, VARIABLE, 1);
|
||||||
p.muladdeq (7, VARIABLE, 2);
|
p.muladdeq (7, VARIABLE, 2);
|
||||||
@ -187,6 +251,7 @@ main ()
|
|||||||
assert (m2(p) == "p");
|
assert (m2(p) == "p");
|
||||||
assert (m2(q) == "q");
|
assert (m2(q) == "q");
|
||||||
assert (m2(r) == "thisisr");
|
assert (m2(r) == "thisisr");
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
test_ring<Z2> (2);
|
test_ring<Z2> (2);
|
||||||
|
Loading…
Reference in New Issue
Block a user