mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-27 18:40:35 +00:00
ced3bbcad4
C++20 introduces `std::format` and we `using namespace std`, so some of these would be ambiguous in C++20.
141 lines
3.3 KiB
C++
141 lines
3.3 KiB
C++
/* explore the Janko group J1: https://en.wikipedia.org/wiki/Janko_group_J1 */
|
|
|
|
#include "rogueviz.h"
|
|
|
|
#if !ISWEB
|
|
|
|
namespace hr {
|
|
|
|
eGeometry gJanko1(eGeometry(-1));
|
|
|
|
struct jmatrix : array<array<int, 7>, 7> {
|
|
jmatrix operator * (const jmatrix other) {
|
|
jmatrix res;
|
|
for(int a=0; a<7; a++)
|
|
for(int b=0; b<7; b++)
|
|
res[a][b] = 0;
|
|
|
|
for(int a=0; a<7; a++)
|
|
for(int b=0; b<7; b++)
|
|
for(int c=0; c<7; c++)
|
|
res[a][c] += self[a][b] * other[b][c];
|
|
|
|
for(int a=0; a<7; a++)
|
|
for(int b=0; b<7; b++)
|
|
res[a][b] %= 11;
|
|
|
|
return res;
|
|
}
|
|
};
|
|
|
|
vector<jmatrix> jms;
|
|
std::map<jmatrix, int> ids;
|
|
|
|
jmatrix J, Z, id;
|
|
|
|
int get_id(const jmatrix& m) {
|
|
if(ids.count(m)) return ids[m];
|
|
ids[m] = isize(jms);
|
|
jms.push_back(m);
|
|
return isize(jms)-1;
|
|
}
|
|
|
|
void build_group(const jmatrix& m) {
|
|
if(ids.count(m)) return;
|
|
jmatrix m2 = m;
|
|
for(int a=0; a<7; a++) { get_id(m2); m2 = m2 * J; }
|
|
}
|
|
|
|
void build() {
|
|
for(int a=0; a<7; a++)
|
|
for(int b=0; b<7; b++) J[a][b] = ((a+1-b)%7 == 0) ? 1 : 0;
|
|
|
|
int v[49] = {
|
|
0, 4, 0, 3, 9, 2, 1,
|
|
4, 0, 4, 3, 7, 1, 3,
|
|
0, 4, 10, 6, 9, 8, 1,
|
|
3, 3, 6, 1, 7, 6, 9,
|
|
9, 7, 9, 7, 0, 9, 10,
|
|
2, 1, 8, 6, 9, 2, 3,
|
|
1, 3, 1, 9, 10, 3, 8,
|
|
/* -3,+2,-1,-1,-3,-1,-3,
|
|
-2,+1,+1,+3,+1,+3,+3,
|
|
-1,-1,-3,-1,-3,-3,+2,
|
|
-1,-3,-1,-3,-3,+2,-1,
|
|
-3,-1,-3,-3,+2,-1,-1,
|
|
+1,+3,+3,-2,+1,+1,+3,
|
|
+3,+3,-2,+1,+1,+3,+1*/
|
|
};
|
|
|
|
int a = 0;
|
|
|
|
for(auto& row: Z) for(auto& i: row) { i = v[a++]; if(i < 0) i += 11; }
|
|
|
|
for(int a=0; a<7; a++) for(int b=0; b<7; b++) id[a][b] = a==b ? 1 : 0;
|
|
|
|
build_group(id);
|
|
for(int k=0; k<isize(jms); k++) {
|
|
build_group(jms[k] * Z);
|
|
}
|
|
|
|
/*
|
|
B = Z
|
|
J = A * B
|
|
A = J * B * B
|
|
*/
|
|
|
|
println(hlog, "order = ", isize(jms));
|
|
}
|
|
|
|
void experiment() {
|
|
for(int ia=1; ia<isize(jms); ia++) if(jms[ia] * jms[ia] == id)
|
|
for(int ib=1; ib<isize(jms); ib++) if(jms[ib] * jms[ib] * jms[ib] == id) {
|
|
jmatrix u = jms[ia] * jms[ib];
|
|
if(u != J) continue;
|
|
if(u == id) continue;
|
|
jmatrix up = u, ubp = u;
|
|
ubp = ubp * ubp; up = up * ubp;
|
|
ubp = ubp * ubp; up = up * ubp;
|
|
if(up != id) continue;
|
|
println(hlog, "found: ", tie(ia, ib));
|
|
|
|
for(auto& row: jms[ia]) {
|
|
for(auto& i: row) print(hlog, hr::format("%2d, ", i));
|
|
println(hlog);
|
|
}
|
|
}
|
|
|
|
exit(1);
|
|
}
|
|
|
|
auto h = addHook(hooks_newmap, 0, [] {
|
|
if(geometry == gJanko1) {
|
|
build();
|
|
vector<int> connections;
|
|
connections.clear();
|
|
for(int i=0; i<isize(jms); i++) connections.push_back(get_id(jms[i] * Z));
|
|
println(hlog, connections);
|
|
return (hrmap*) new quotientspace::hrmap_quotient(connections);
|
|
}
|
|
return (hrmap*) nullptr;
|
|
});
|
|
|
|
void create_janko() {
|
|
if(gJanko1 != eGeometry(-1)) return;
|
|
ginf.push_back(ginf[gNormal]);
|
|
gJanko1 = eGeometry(isize(ginf) - 1);
|
|
// variation = eVariation::pure;
|
|
auto& gi = ginf.back();
|
|
gi.flags = qANYQ | qCLOSED | qEXPERIMENTAL;
|
|
gi.quotient_name = "Janko";
|
|
gi.shortname = "Janko";
|
|
gi.menu_displayed_name = "Janko group J1";
|
|
}
|
|
|
|
auto shot_hooks = arg::add3("-janko1x", [] { build(); experiment(); })
|
|
+ addHook(hooks_initialize, 100, create_janko);
|
|
|
|
}
|
|
|
|
#endif
|