// Bring's Surface generator // Copyright (C) 2018 Zeno Rogue, see 'hyper.cpp' for details #include #include #include #include #include using namespace std; int isize(const auto x) { return x.size(); } int mul(int a, int b) { int p = 0; for(int i=0; i<3; i++) if((a>>i)&1) for(int j=0; j<3; j++) if((b>>j)&1) p ^= (1<<(i+j)); for(int z=4; z>=0; z--) if(p&(8<> s5_elements; map, int> back; int multable[504][504]; int mpow(int a, int n) { int z = a; while(n > 1) z = multable[a][z], n--; return z; } int inset[504]; int main() { array ar; for(int i=0; i<5; i++) ar[i] = i; do { back[ar] = isize(s5_elements); s5_elements.push_back(ar); } while(next_permutation(ar.begin(), ar.end())); for(int a=0; a<120; a++) for(int b=0; b<120; b++) { array res; for(int i=0; i<5; i++) res[i] = s5_elements[a] [ s5_elements[b][i] ]; multable[a][b] = back[res]; } int id; for(int a=0; a<120; a++) if(multable[a][a] == a) id = a; printf("id = %d\n", id); int xid = 0; int sols = 0; for(int R=0; R<120; R++) for(int P=0; P<120; P++) { if(P == 0 && mpow(R, 5) == id) printf("deg5 R\n"); if(multable[P][P] != id) continue; if(mpow(multable[R][P], 4) != id) continue; if(mpow(R, 5) != id) continue; xid++; vector allels = {id}; inset[id] = xid; for(int i=0; i cellid; array bycellid; for(int a=0; a<120; a++) cellid[a] = 0; int ncell = 0; for(int a=0; a<120; a++) if(cellid[a] == 0) { int b = a; for(int s=0; s<5; s++) cellid[b] = ncell + s, bycellid[ncell + s] = b, b = multable[b][R]; ncell += 5; } printf("ncell = %d\n", ncell); for(int a=0; a<24; a++) { printf("/* %03d */ ", a); for(int b=0; b<5; b++) { printf("%d, ", cellid[multable[bycellid[5*a+b]][P]]); } printf("\n"); } return 0; } printf("solutions = %d\n", sols); return 0; }