{ \\ PARI/GP script "ClGrpStrCmpl93.gp" \\ 2nd step of the principalization algorithm: \\ class group structure of complex cubic fields and Galois closures allocatemem(512000000); fn="ClGrpStrCmpl93.txt"; dn="FrattiniRemainderCmpl93.csv"; a=0; g=readvec(D10); b=readvec(Q10); c=readvec(L10); d=readvec(A10); e=0; disc=0; reg=0; m=0; as=0; bs=[0,0,0,0]; cs=[0,0,0,0]; ds=[0,0,0,0]; rs=[0,0,0,0]; for(i=1,length(g), a=0; e=0; reg=0; \\ separator line for quartet with new discriminant if(g[i]!=disc, for(j=1,73, print1("="); write1(fn,"="); );\\ end for print("="); write(fn,"="); \\ quadratic base field once per quartet print1("d2=" g[i]); write1(fn,"D=" g[i]); q=quadclassunit(g[i]); print(" c2=" q[2]); write(fn," c2=" q[2]); m=0; as=0; bs=[0,0,0,0]; cs=[0,0,0,0]; ds=[0,0,0,0]; rs=[0,0,0,0]; ); \\ end if disc=g[i]; \\ terminate when the quartet is complete if(m<4, \\ number field of degree 3 p3=x^3-b[i]*x^2+c[i]*x-d[i]; bnf3=bnfinit(p3,1); reg=round(10000*bnf3.reg); \\ skip duplicates of regulators if((rs[1]!=reg)&&(rs[2]!=reg)&&(rs[3]!=reg)&&(rs[4]!=reg), \\ increment the quartet counter m=m+1; if(m<=4, bs[m]=b[i]; cs[m]=c[i]; ds[m]=d[i]; rs[m]=reg; );\\ end if print1("c3=" bnf3.clgp[2]); write1(fn,"c3=" bnf3.clgp[2]); if(0==bnf3.clgp[2][1]%9, a=1; as=1; if(0==bnf3.clgp[2][1]%27, a=2; );\\ end if );\\ end if \\ normal field of degree 6 p2=x^2-g[i]; p6=polcompositum(p2,p3)[1]; bnf6=bnfinit(p6,1); print1(", c6=" bnf6.clgp[2]); write1(fn,", c6=" bnf6.clgp[2]); print1(", r=" reg); write1(fn,", R=" reg); print1(" b=" b[i]); write1(fn," b=" b[i]); print1(" c=" c[i]); write1(fn," c=" c[i]); print1(" d=" d[i]); write1(fn," d=" d[i]); i3=truncate(sqrt(poldisc(p3)/g[i])); print(" i=" i3); write1(fn," i=" i3); if(bnf3.disc!=g[i], write(fn,", d3=" bnf3.disc), write(fn,"") );\\ end if if(length(bnf6.clgp[2])>2, if(0==bnf6.clgp[2][3]%3, e=1; if(0==bnf6.clgp[2][1]%9, e=2; );\\ end if if(0==bnf6.clgp[2][1]%27, e=3; );\\ end if if(0==bnf6.clgp[2][1]%81, e=5; );\\ end if if(0==bnf6.clgp[2][3]%9, e=6; );\\ end if );\\ end if );\\ end if if(length(bnf6.clgp[2])>3, if(0==bnf6.clgp[2][4]%3, e=4; );\\ end if );\\ end if \\ several possible indicator lines \\ for determining the principalization type if(1==a, print("9 | cubic class number"); write(fn,"9 | cubic class number"); );\\ end if if(2==a, print("27 | cubic class number"); write(fn,"27 | cubic class number"); );\\ end if if(1==e, print("Exotic 3-class group (3,3,3)"); write(fn,"Exotic 3-class group (3,3,3)"); );\\ end if if(2==e, print("Exotic 3-class group (9,3,3)"); write(fn,"Exotic 3-class group (9,3,3)"); );\\ end if if(3==e, print("Exotic 3-class group (27,9,3)"); write(fn,"Exotic 3-class group (27,9,3)"); );\\ end if if(4==e, print("Hyperexotic 3-class group (3,3,3,3)"); write(fn,"Hyperexotic 3-class group (3,3,3,3)"); );\\ end if if(5==e, print("Exotic 3-class group (81,27,3)"); write(fn,"Exotic 3-class group (81,27,3)"); );\\ end if if(6==e, print("Exotic 3-class group (9,9,9)"); write(fn,"Exotic 3-class group (9,9,9)"); );\\ end if \\ remainder for Frattini class group structure if((4==m)&&as, for(j=1,4, write1(dn,g[i]); write1(dn,";"); write1(dn,bs[j]); write1(dn,";"); write1(dn,cs[j]); write1(dn,";"); write(dn,ds[j]); );\\ end for );\\ end if );\\ end if );\\ end if );\\ end for }