Path: blob/main/scripts/sato_tate/smallgroups.m
1128 views
function bsonify(obj)1case Type(obj):2when BoolElt:3return obj select "True" else "False";4when RngIntElt:5if obj le -2^31 or obj ge 2^31 then6printf "bson_string: integer %o is too large to fit into an int, you should use a string", obj;7assert obj gt -2^31 and obj lt 2^31;8end if;9return Sprintf("int(%o)", obj);10when MonStgElt:11return "u'" cat obj cat "'";12when Assoc:13keys := Keys(obj);14if #keys eq 0 then return "{}"; end if;15assert &and[Type(k) eq MonStgElt : k in keys];16objs := [<k,$$(obj[k])> : k in Sort([k: k in keys])];17str := Sprintf("{'%o': %o", objs[1][1], objs[1][2]);18for i:=2 to #objs do str cat:= Sprintf(", '%o': %o", objs[i][1], objs[i][2]); end for;19return str cat "}";20when SeqEnum:21if #obj eq 0 then return "[]"; end if;22str := "[" cat $$(obj[1]);23for i:=2 to #obj do str cat:= ", " cat $$(obj[i]); end for;24return str cat "]";25when Tup:26if #obj eq 0 then return "[]"; end if;27str := "[" cat $$(obj[1]);28for i:=2 to #obj do str cat:= ", " cat $$(obj[i]); end for;29return str cat "]";30when Rec:31str := "{"; n:= 0;32for field in Names(obj) do33if assigned obj``field then34if n gt 0 then str cat:= ", "; end if;35str cat:= "'" cat field cat "': " cat $$(obj``field);36n +:= 1;37end if;38end for;39return str cat "}";40else:41printf "bson_string: don't know how to handle type %o", Type(obj);42assert false;43end case;44end function;4546OTHER := 0; DIGIT := 1; LETTER := 2; TIMES := 3;47chartypes := [OTHER : i in [1..127]];48for i:=StringToCode("0") to StringToCode("9") do chartypes[i]:=DIGIT; end for;49for i:=StringToCode("A") to StringToCode("Z") do chartypes[i]:=LETTER; end for;50for i:=StringToCode("a") to StringToCode("z") do chartypes[i]:=LETTER; end for;51chartypes[StringToCode("*")] := TIMES;5253function prettify(name)54types := [chartypes[StringToCode(name[i])] : i in [1..#name]];55pretty := name[1];56inbrackets := false;57for i:=2 to #name do58c := name[i];59case types[i]:60when DIGIT:61if types[i-1] eq LETTER then62pretty cat:= "_";63if i lt #name and types[i+1] eq DIGIT then pretty cat:= "{"; inbrackets := true; end if;64end if;65pretty cat:= c;66when LETTER:67if inbrackets then pretty cat:= "}"; inbrackets := false; end if;68pretty cat:= c;69when TIMES:70if inbrackets then pretty cat:= "}"; inbrackets := false; end if;71pretty cat:= "\\\\times ";72else:73if inbrackets then pretty cat:= "}"; inbrackets := false; end if;74pretty cat:= c;75end case;76end for;77if inbrackets then pretty cat:= "}"; end if;78return pretty;79end function;8081function id_to_label(id)82return Sprintf("%o.%o",id[1],id[2]);83end function;8485function small_group_data(G)86A:=AssociativeArray();87A["label"] := id_to_label(IdentifyGroup(G));88A["abelian"] := IsAbelian(G);89A["cyclic"] := IsCyclic(G);90A["perfect"] := IsPerfect(G);91A["simple"] := IsSimple(G);92A["solvable"] := IsSolvable(G);93A["order"] := Order(G);94A["exponent"] := Exponent(G);95A["name"] := GroupName(G);96A["pretty"] := prettify(A["name"]);97S:={*<c[1],c[2]>:c in ConjugacyClasses(G)*};98S:=Sort([<c[1],c[2],Multiplicity(S,c)>:c in Set(S)]);99A["clases"] := S;100S:={*IdentifyGroup(H`subgroup):H in MaximalSubgroups(G)*};101S:=Sort([<c,Multiplicity(S,c)>:c in Set(S)]);102S:=[<id_to_label(c[1]),c[2]>:c in S];103A["maximal_subgroups"] := S;104S:={*IdentifyGroup(H`subgroup):H in NormalSubgroups(G)*};105S:=Sort([<c,Multiplicity(S,c)>:c in Set(S)]);106S:=[<id_to_label(S[i][1]),S[i][2]> : i in [2..#S-1]]; // omit trivial and whole group107A["normal_subgroups"] := S;108A["center"] := id_to_label(IdentifyGroup(Center(G)));109A["derived_group"] := id_to_label(IdentifyGroup(DerivedSubgroup(G)));110A["abelian_quotient"] := id_to_label(IdentifyGroup(AbelianQuotient(G)));111return A;112end function;113114procedure dump_small_groups_data(maxN:filename:="")115if #filename gt 0 then fp := Open(filename,"w"); end if;116n:=0;117for N:=1 to maxN do118if #filename gt 0 then printf "Generating data for %o subgroups of order %o...\n", NumberOfSmallGroups(N), N; end if;119for G in SmallGroups(N:Warning:=false) do120data:=bsonify(small_group_data(G));121if #filename gt 0 then Puts(fp,data); else print data; end if;122n+:=1;123end for;124end for;125if #filename gt 0 then126Flush(fp);127printf "Wrote %o records to file %o\n", n, filename;128end if;129end procedure;130131132