From 6e942e98f5629bc0659b9564dec4dbf29db4fb98 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Mon, 8 Mar 2021 13:30:55 +0100 Subject: [PATCH] fieldpattern:: now can work with triplets --- fieldpattern.cpp | 106 +++++++++++++++++++++++++++++++++++++++++++++++ geom-exp.cpp | 80 ++++++++++++++++++++++++----------- 2 files changed, 161 insertions(+), 25 deletions(-) diff --git a/fieldpattern.cpp b/fieldpattern.cpp index c3ae3551..31c5b192 100644 --- a/fieldpattern.cpp +++ b/fieldpattern.cpp @@ -75,6 +75,10 @@ EX int btspin(int id, int d) { static const int ERR = -99; +struct triplet_info { + int i, j, size; + }; + struct fpattern { unsigned force_hash; @@ -224,6 +228,13 @@ struct fpattern { int gmul(int a, int b) { return matcode[mmul(matrices[a], matrices[b])]; } int gpow(int a, int N) { return matcode[mpow(matrices[a], N)]; } + + int gorder(int a) { + int b = a; + int q = 1; + while(b) b = gmul(b, a), q++; + return q; + } pair gmul(pair a, int b) { return make_pair(gmul(a.first,b), a.second); @@ -310,6 +321,8 @@ struct fpattern { vector generate_isometries3(); int solve3(); bool generate_all3(); + + vector find_triplets(); #if CAP_THREAD struct discovery *dis; @@ -671,6 +684,84 @@ int fpattern::order(const matrix& M) { return cnt; } +EX int triplet_id = 0; + +vector fpattern::find_triplets() { + int N = isize(matrices); + auto compute_transcript = [&] (int i, int j) { + + vector indices(N, -1); + vector transcript; + vector q; + + int qty = 0; + + auto visit = [&] (int id) { + transcript.push_back(indices[id]); + if(indices[id] == -1) { + indices[id] = isize(q); + q.push_back(id); + qty++; + } + }; + + visit(0); + for(int x=0; x> transcripts_seen; + transcripts_seen.insert(orig_transcript); + + set conjugacy_classes; + vector cc; + + for(int i=0; i removals; + for(int j=0; j i) removals.push_back(c); + } + for(auto r: removals) conjugacy_classes.erase(r); + cc.push_back(i); + } + + DEBB(DF_FIELD, ("conjugacy_classes = ", cc)); + + vector tinf; + triplet_info ti; + ti.i = 1; ti.j = S7; ti.size = orig_transcript.back(); + tinf.push_back(ti); + + for(int i: conjugacy_classes) if(gorder(i) == S7) { + DEBB(DF_FIELD, ("checking i=", i)); + for(int j=1; j g(geometry, ex.base); + dynamicval t(triplet_id, 0); int nextprime; if(isize(ex.primes)) nextprime = ex.primes.back().p + 1; diff --git a/geom-exp.cpp b/geom-exp.cpp index 5d7c4c6a..43a25481 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -46,6 +46,7 @@ void showQuotientConfig() { for(int i=0; i= 'a' && uni < 'a' + isize(fgeomextras)) - current_extra = uni - 'a'; - else if(uni >= 'A' && uni < 'A' + isize(gxcur.primes)) - gxcur.current_prime_id = uni - 'A'; - else if(uni == 'p') - nextPrime(gxcur); - else if(uni == 'x' || uni == '\n') dialog::do_if_confirmed([&gxcur] { - set_geometry(gxcur.base); - enableFieldChange(); - set_geometry(gFieldQuotient); - start_game(); - }); - else if(uni == 'c') dialog::do_if_confirmed([] { - set_geometry(gEuclid); - fieldpattern::quotient_field_changed = false; - set_geometry(gFieldQuotient); - start_game(); - }); - else if(doexiton(sym, uni)) - popScreen(); - }; - dialog::display(); } #endif @@ -1111,6 +1136,11 @@ int read_geom_args() { enableFieldChange(); set_geometry(gFieldQuotient); } + else if(argis("-triplet")) { + stop_game(); + shift(); fieldpattern::triplet_id = argi(); + fieldpattern::enableFieldChange(); + } else if(argis("-to-fq")) { cgi.require_basics(); int p = 2;