# This code sets up the Galois group over R(z_1,z_2) of the field # extension KT generated by x[1], x[2], y[1], y[2], r[1] and r[2]. #@ G64 G64 := [ 1, L, LL, LLL, M, LM, LLM, LLLM, N, LN, LLN, LLLN, MN, LMN, LLMN, LLLMN, A1, LA1, LLA1, LLLA1, MA1, LMA1, LLMA1, LLLMA1, NA1, LNA1, LLNA1, LLLNA1, MNA1, LMNA1, LLMNA1, LLLMNA1, A2, LA2, LLA2, LLLA2, MA2, LMA2, LLMA2, LLLMA2, NA2, LNA2, LLNA2, LLLNA2, MNA2, LMNA2, LLMNA2, LLLMNA2, A12, LA12, LLA12, LLLA12, MA12, LMA12, LLMA12, LLLMA12, NA12, LNA12, LLNA12, LLLNA12, MNA12, LMNA12, LLMNA12, LLLMNA12 ]: protect( 'A1', 'LA1', 'LLA1', 'LLLA1', 'MA1', 'LMA1', 'LLMA1', 'LLLMA1', 'NA1', 'LNA1', 'LLNA1', 'LLLNA1', 'MNA1', 'LMNA1', 'LLMNA1', 'LLLMNA1', 'A2', 'LA2', 'LLA2', 'LLLA2', 'MA2', 'LMA2', 'LLMA2', 'LLLMA2', 'NA2', 'LNA2', 'LLNA2', 'LLLNA2', 'MNA2', 'LMNA2', 'LLMNA2', 'LLLMNA2', 'A12', 'LA12', 'LLA12', 'LLLA12', 'MA12', 'LMA12', 'LLMA12', 'LLLMA12', 'NA12', 'LNA12', 'LLNA12', 'LLLNA12', 'MNA12', 'LMNA12', 'LLMNA12', 'LLLMNA12' ): act_A[A1 ] := (u) -> eval(subs(r=rx,subs(r[1]=-r[1],subs(root_rule,u)))): act_A[A2 ] := (u) -> eval(subs(r=rx,subs(r[2]=-r[2],subs(root_rule,u)))): act_A[A12] := (u) -> eval(subs(r=rx,subs({r[1]=-r[1],r[2]=-r[2]},subs(root_rule,u)))): #@ act_AT_rule act_AT_rule := table(): #@ xyrstu_vars xyrstu_vars := [ seq(x[i],i=1..4), seq(y[i],i=1..2), seq(r[i],i=1..2), seq(s[i],i=1..16), seq(t[i],i=1..4), seq(u[i],i=1..16) ]; act_AT_rule[1] := {seq(a = a,a in xyrstu_vars)}; act_AT_rule[L] := { x[1] = x[2], x[2] = -x[1], x[4] = -x[4], y[2] = -y[2], r[1] = r[2], r[2] = r[1], t[1] = t[2], t[2] = -t[1], t[3] = t[4], t[4] = -t[3], seq(s[2*i-1] = s[2*i],i=1..4), seq(s[2*i] = s[2*i-1],i=1..4), s[ 9] = s[10], s[10] =-s[ 9], s[11] = s[12], s[12] = -s[11], s[13] = -s[13], s[14] =-s[15], s[15] = -s[14], s[16] = -s[16], u[1] = u[2], u[2] = -u[1], u[3] = u[4], u[4] = -u[3], u[5] = u[6], u[6] = -u[5], u[7] = u[8], u[8] = -u[7], u[9] = u[10], u[10] = -u[9], u[11] = u[12], u[12] = -u[11], u[13] = u[14], u[14] = -u[13], u[15] = u[16], u[16] = -u[15] }: act_AT_rule[M] := { x[2] = -x[2], x[3] = -x[3], x[4] = -x[4], y[1] = -y[1], t[1] = t[3], t[2] = -t[4], t[3] = t[1], t[4] = -t[2], s[3] = 1/s[3], s[4] = 1/s[4], s[9] = s[11], s[10] = -s[12], s[11] = s[9], s[12] = -s[10], u[2] = -u[2], u[4] = -u[4], u[5] = -u[5], u[7] = -u[7], u[9] = u[11], u[10] = -u[12], u[11] = u[9], u[12] = -u[10], u[13] = -u[15], u[14] = u[16], u[15] = -u[13], u[16] = u[14] }: act_AT_rule[N] := { x[2] = -x[2], t[1] = t[1], t[2] = -t[2], t[3] = t[3], t[4] = -t[4], s[10] = -s[10], s[12] = -s[12], seq(s[i] = -s[i],i=13..16), u[2] = -u[2], u[4] = -u[4], u[6] = -u[6], u[8] = -u[8], u[10] = -u[10], u[12] = -u[12], u[14] = -u[14], u[16] = -u[16] }: act_AT_rule[A1] := { r[1] = -r[1], t[1] = -1/t[1], t[3] = -1/t[3], s[1] = 1/s[1], s[3] = 1/s[3], s[ 9] = -s[ 9], s[11] = -s[11], s[13] = -s[15], s[14] = -s[16], s[15] = -s[13], s[16] = -s[14], u[1] = u[3], u[3] = u[1], u[5] = u[7], u[7] = u[5], u[9] = u[11], u[11] = u[9], u[13] = u[15], u[15] = u[13] }: act_AT_rule[A2] := { r[2] = -r[2], t[2] = -1/t[2], t[4] = -1/t[4], s[2] = 1/s[2], s[4] = 1/s[4], s[10] = -s[10], s[12] = -s[12], s[13] = -s[14], s[14] = -s[13], s[15] = -s[16], s[16] = -s[15], u[2] = u[4], u[4] = u[2], u[6] = u[8], u[8] = u[6], u[10] = u[12], u[12] = u[10], u[14] = u[16], u[16] = u[14] }: act_AT[1] := (a) -> a: for T in [L,M,N,A1,A2] do act_AT[T] := subs(rule=act_AT_rule[T],eval((a) -> subs(rule,a))); od: #@ make_AT_rule make_AT_rule := proc(T,U,TU) global act_AT_rule,act_AT; act_AT_rule[TU] := {seq(v = act_AT[T](act_AT[U](v)),v in xyrstu_vars)}; act_AT[TU] := subs(rule=act_AT_rule[TU],eval((a) -> subs(rule,a))); NULL; end: make_AT_rule(L,L,LL): make_AT_rule(L,LL,LLL): make_AT_rule(L,M,LM): make_AT_rule(L,LM,LLM): make_AT_rule(L,LLM,LLLM): make_AT_rule(L,N,LN): make_AT_rule(L,LN,LLN): make_AT_rule(L,LLN,LLLN): make_AT_rule(M,N,MN): make_AT_rule(L,MN,LMN): make_AT_rule(L,LMN,LLMN): make_AT_rule(L,LLMN,LLLMN): make_AT_rule(A1,A2,A12): make_AT_rule(L,A1,LA1): make_AT_rule(LL,A1,LLA1): make_AT_rule(LLL,A1,LLLA1): make_AT_rule(M,A1,MA1): make_AT_rule(LM,A1,LMA1): make_AT_rule(LLM,A1,LLMA1): make_AT_rule(LLLM,A1,LLLMA1): make_AT_rule(N,A1,NA1): make_AT_rule(LN,A1,LNA1): make_AT_rule(LLN,A1,LLNA1): make_AT_rule(LLLN,A1,LLLNA1): make_AT_rule(MN,A1,MNA1): make_AT_rule(LMN,A1,LMNA1): make_AT_rule(LLMN,A1,LLMNA1): make_AT_rule(LLLMN,A1,LLLMNA1): make_AT_rule(L,A2,LA2): make_AT_rule(LL,A2,LLA2): make_AT_rule(LLL,A2,LLLA2): make_AT_rule(M,A2,MA2): make_AT_rule(LM,A2,LMA2): make_AT_rule(LLM,A2,LLMA2): make_AT_rule(LLLM,A2,LLLMA2): make_AT_rule(N,A2,NA2): make_AT_rule(LN,A2,LNA2): make_AT_rule(LLN,A2,LLNA2): make_AT_rule(LLLN,A2,LLLNA2): make_AT_rule(MN,A2,MNA2): make_AT_rule(LMN,A2,LMNA2): make_AT_rule(LLMN,A2,LLMNA2): make_AT_rule(LLLMN,A2,LLLMNA2): make_AT_rule(L,A12,LA12): make_AT_rule(LL,A12,LLA12): make_AT_rule(LLL,A12,LLLA12): make_AT_rule(M,A12,MA12): make_AT_rule(LM,A12,LMA12): make_AT_rule(LLM,A12,LLMA12): make_AT_rule(LLLM,A12,LLLMA12): make_AT_rule(N,A12,NA12): make_AT_rule(LN,A12,LNA12): make_AT_rule(LLN,A12,LLNA12): make_AT_rule(LLLN,A12,LLLNA12): make_AT_rule(MN,A12,MNA12): make_AT_rule(LMN,A12,LMNA12): make_AT_rule(LLMN,A12,LLMNA12): make_AT_rule(LLLMN,A12,LLLMNA12): #@ average_AT average_AT := (a,H) -> add(act_AT[T](a)/nops(H),T in H); #@ G64_mult G64_mult := proc() procname(args) end: #@ G64_inv G64_inv := proc() procname(args) end: #@ G64_lookup for T in G64 do G64_lookup[map(act_AT[T],[t[1],t[2],t[3],t[4]])] := T; od: for T1 in G64 do for T2 in G64 do T3 := G64_lookup[[seq(act_AT[T1](act_AT[T2](t[i])),i=1..4)]]; G64_mult(T1,T2) := T3; if T3 = 1 then G64_inv(T1) := T2; fi; od: od: #@ G64_conj G64_conj := (a,b) -> G64_mult(G64_mult(a,b),G64_inv(a)): #@ G64_classes G64_classes := [op(map(T -> map(U -> G64_conj(U,T),{op(G64)}),{op(G64)}))]; stab_A := (u) -> select(T -> act_A[T](u) = u,G16); #@ stab_A stab_AT := (u) -> select(T -> act_AT[T](u) = u,G64); #@ stab_AT orb_AT := (v) -> {op(map(T -> act_AT[T](v),G64))}; #@ orb_AT uorb_AT := (v) -> map(strip_sign,orb_AT(v)); #@ uorb_AT #@ G64_subgroup_generated_by G64_subgroup_generated_by := proc(L::set) local H0,H1,T,U; H0 := {1}; H1 := L; while H1 <> H0 do H0 := H1; H1 := {op(H1),seq(seq(G64_mult(T,U),T in H0),U in H0)}; od; return sort([op(H1)]); end: # This code is not run by default, because it is slow, and not too useful. # There are 569 subgroups altogether. #@ find_G64_subgroups #@ G64_cyclic_subgroups #@ G64_subgroups #@ G64_subgroup_join; find_G64_subgroups := proc() global G64_cyclic_subgroups,G64_subgroups,G64_subgroup_join; local T,U,C,n,SG; G64_cyclic_subgroups := {}: for T in G64 do U := T; C := {1}; while U <> 1 do C := {op(C),U}; U := G64_mult(T,U); od: G64_cyclic_subgroups := {op(G64_cyclic_subgroups),sort(C)}; od: G64_subgroup_join := proc(H1,H2) local U,H,HH,T1,T2; U := H1 union H2; H := U; while true do HH := {seq(seq(G64_mult(T1,T2),T1 in H),T2 in U)}; if HH = H then break; fi; H := HH; od: return sort(H); end: G64_subgroups := G64_cyclic_subgroups: n := 6; while n>0 do SG := {seq(seq(G64_subgroup_join(H1,H2),H1 in G64_subgroups),H2 in G64_cyclic_subgroups)}; if nops(SG) = nops(G64_subgroups) then break; fi; G64_subgroups := SG; print(nops(SG)); n := n-1; od: end: