Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346############################################################################# #### ## #A anustab.gi ANUPQ package Eamonn O'Brien #A Werner Nickel ## #Y Copyright 1993-2001, Lehrstuhl D fuer Mathematik, RWTH Aachen, Germany #Y Copyright 1993-2001, School of Mathematical Sciences, ANU, Australia ## #W Greg Gamble reformulated the original code as a function and then split #W the original `anustab.g' into the declare/install files anustab.g[di]. ## ## Install file for function to compute the stabiliser of an allowable ## subgroup; description is written to file LINK_output. ## ############################################################################# ## #F PqStabiliserOfAllowableSubgroup( <ANUPQglb>, <F>, <gens>, <relativeOrders>, ## <ANUPQsize>, <ANUPQagsize>) . . compute stabiliser of allowable subgroup ## ## computes stabiliser and writes `LINK_output' output file for the `pq' ## binary. The `LINK_output' file is written to `ANUPQData.tmpdir', but when ## the `pq' binary was started up directly by the user that directory is set ## to the current directory. The argument variables of ## `PqStabiliserOfAllowableSubgroup' are essentially the variables assigned ## to by `GAP_link_via_file.c' in the `pq' source code. ## InstallGlobalFunction( PqStabiliserOfAllowableSubgroup, function( ANUPQglb, F, gens, relativeOrders, ANUPQsize, ANUPQagsize ) local m, n, H, pcgs, aut, NumberAgAutos, i, imgs, NumberGlAutos, p, d, ANUPQMaxDegree, V, elm, baseU, id, baseN, infoLevelAutGrp, LINK_output, soluble, a, mat; # number of generators if Length( ANUPQglb.glAutos ) > 0 then m := Length (ANUPQglb.glAutos[1]); elif Length( ANUPQglb.agAutos ) > 0 then m := Length (ANUPQglb.agAutos[1]); else Error( "Panic: PqStabiliserOfAllowableSubgroup ", "called without automorphisms" ); fi; # get the p-group n := Length (Pcgs(F)); H := F / Subgroup (F, Pcgs(F){[m+1 .. n]}); IsPGroup(H); pcgs := Pcgs(H); # set up automorphism rec aut := rec(); NumberAgAutos := Length (ANUPQglb.agAutos); aut.agAutos := [1..NumberAgAutos]; for i in [1..Length (ANUPQglb.agAutos)] do Immutable( ANUPQglb.genQ[i] ); ConvertToMatrixRep( ANUPQglb.genQ[i], ANUPQglb.F ); imgs := List( ANUPQglb.agAutos[i], x -> PcElementByExponents( pcgs, x ) ); aut.agAutos[i] := PGAutomorphism( H, pcgs, imgs); aut.agAutos[i]!.mat := ANUPQglb.genQ[i]; od; aut.agAutos := Reversed( aut.agAutos ); aut.agOrder := Reversed (relativeOrders); NumberGlAutos := Length( ANUPQglb.glAutos ); aut.glAutos := [1..NumberGlAutos]; for i in [1..NumberGlAutos] do Immutable( ANUPQglb.genQ[i] ); ConvertToMatrixRep( ANUPQglb.genQ[NumberAgAutos + i], ANUPQglb.F ); imgs := List( ANUPQglb.glAutos[i], x -> PcElementByExponents( pcgs, x ) ); aut.glAutos[i] := PGAutomorphism( H, pcgs, imgs); aut.glAutos[i]!.mat := ANUPQglb.genQ[NumberAgAutos+ i]; od; aut.field := ANUPQglb.F; aut.group := H; if ANUPQsize <> fail then aut.size := ANUPQsize; fi; aut.one := IdentityPGAutomorphism( H ); aut.one!.mat := IdentityMat( ANUPQglb.q, aut.field ); # add perm oper p := Size( aut.field ); d := RankPGroup( aut.group ); #compute perm rep having at most this degree ANUPQMaxDegree := 10000; if p^d <= ANUPQMaxDegree or ANUPQsize = fail then V := aut.field^d; if ANUPQsize = fail and p^d > ANUPQMaxDegree then Info(InfoANUPQ + InfoWarning, 1, "no. of elements in vector space V is large (", p^d, ")"); Info(InfoANUPQ + InfoWarning, 1, "... this may take a while, if it succeeds at all!"); fi; elm := Elements( V ); aut.glOper := []; for i in [1..NumberGlAutos] do a := aut.glAutos[i]; mat := List(a!.baseimgs, x -> ExponentsOfPcElement( pcgs, x ){[1..d]}); mat := mat * One( aut.field ); Immutable( mat ); ConvertToMatrixRep( mat, aut.field ); aut.glOper[i] := Permutation( mat, elm, OnRight ); od; #PrintTo("perms", "aut.glOper := ", aut.glOper,"; \n" ); aut.glOrder := Size( Group( aut.glOper, () ) ); else aut.glOrder := ANUPQsize / Size(ANUPQglb.F)^(ANUPQagsize); fi; Info(InfoANUPQ, 2, "Order of GL subgroup is ", aut.glOrder); Info(InfoANUPQ, 2, "No. of soluble autos is ", Length (aut.agAutos)); # get allowable subgroup and nucleus baseU := gens * One (aut.field); id := IdentityMat( ANUPQglb.q, aut.field); baseN := id{[1..ANUPQglb.r]}; # call stabilizer infoLevelAutGrp := InfoLevel( InfoAutGrp ); if InfoLevel( InfoANUPQ ) >= 2 then SetInfoLevel( InfoAutGrp, 3 ); fi; PGOrbitStabilizer( aut, baseU, baseN, false ); if (Length (aut.glAutos) = 0) then soluble := -1; else soluble := 0; fi; aut.agAutos := Reversed (aut.agAutos); aut.agOrder := Reversed (aut.agOrder); LINK_output := Filename( ANUPQData.tmpdir, "LINK_output" ); PrintTo (LINK_output, soluble); AppendTo (LINK_output, "\n"); AppendTo (LINK_output, Length (aut.agAutos)); AppendTo (LINK_output, "\n"); for i in [1..Length (aut.agOrder)] do AppendTo (LINK_output, aut.agOrder[i]); AppendTo (LINK_output, "\n"); od; AppendTo (LINK_output, Length (aut.agAutos) + Length (aut.glAutos) ); AppendTo (LINK_output, "\n"); for a in aut.agAutos do mat := List( a!.baseimgs, x -> ExponentsOfPcElement( pcgs, x ) ); mat := Flat( mat ); for m in mat do AppendTo (LINK_output, m, " " ); od; AppendTo (LINK_output, "\n"); od; for a in aut.glAutos do mat := List( a!.baseimgs, x -> ExponentsOfPcElement( pcgs, x ) ); mat := Flat( mat ); for m in mat do AppendTo (LINK_output, m, " " ); od; AppendTo (LINK_output, "\n"); od; SetInfoLevel( InfoAutGrp, infoLevelAutGrp ); end ); #E anustab.gi . . . . . . . . . . . . . . . . . . . . . . . . . . ends here