Commit 7ebb12f6 by Kaashif Hymabaccus

### split off representation isomorphism stuff

lot more nontrivial than I thought it would be
parent 38fcf7bf
Pipeline #46289922 passed with stage
in 22 seconds
 ... ... @@ -10,3 +10,4 @@ ReadPackage( "RepnDecomp", "lib/centralizer.gd" ); ReadPackage( "RepnDecomp", "lib/serre_parallel.gd" ); ReadPackage( "RepnDecomp", "lib/block_diagonalize.gd" ); ReadPackage( "RepnDecomp", "lib/filters.gd" ); ReadPackage( "RepnDecomp", "lib/isomorphism.gd" );
 #! @Chapter Isomorphisms between representations #! @Section Finding explicit isomorphisms #! @Arguments rho, tau #! @Returns A matrix $A$ or fail #! @Description Let $\rho : G \to GL(V)$ and $\tau : G \to GL(W)$. If #! there exists a linear map $A : V \to W$ such that for all $g \in #! G$, $\tau(g)A = A\rho(g)$, this function returns one such $A$. $A$ #! is the isomorphism between the representations. If the #! representations are not isomorphic, then fail is returned. DeclareGlobalFunction( "RepresentationIsomorphism" ); #! @Arguments rho, tau #! @Returns true if rho and tau are isomorphic as #! representations, false otherwise. #! @Description Note that two representations are isomorphic iff they #! give similar matrices, also iff they have the same irreducible #! decomposition. We use characters to determine the latter: the first #! is expensive to check for large degree representations. DeclareGlobalFunction( "AreRepsIsomorphic" );
 # Various representation isomorphism functions e.g. testing for # isomorphism and computing an explicit isomorphism. # Finds the fixed point space of the map A -> tau(gen)*A*rho(gen^-1) FixedSpace@ := function(rho, tau, gen) end; # Picks a random (nonzero) vector in the intersection of some vector # spaces over C RandomVectorIntersection@ := function(spaces) end; # Wraps an n^2 long list into a n long list of n long lists WrapMatrix@ := function(vec, n) return List([0..n-1], i -> vec{[1+n*i..n*(i+1)]}); end; InstallGlobalFunction( RepresentationIsomorphism, function(rho, tau) local G; if not AreRepsIsomorphic(rho, tau) then return fail; fi; G := Source(rho); n := DegreeOfRepresentation(rho); # We want to find a matrix A s.t. tau(g)*A = A*rho(g) for all g in # G. We do this by finding fixed points of the linear maps A -> # tau(g)*A*rho(g^-1) (eigenspaces for eigenvalue 1), then we # intersect the spaces and pick a random vector (matrix). It will # probably be invertible, if not try again. # Note: we only need to do this for the generators: homomorphism # properties mean this will then work for any g in G gens := GeneratorsOfGroup(G); fixed_spaces := List(gens, gen -> FixedSpace@(rho, tau, gen)); repeat A_cand := WrapMatrix@(RandomVectorIntersection@(fixed_spaces), n); until A_cand^-1 <> fail; return A_cand; end ); # Tells you if two representations of the same group are isomorphic by # examining characters InstallGlobalFunction( AreRepsIsomorphic, function(rep1, rep2) local G, irr_chars; if Source(rep1) <> Source(rep2) then return false; fi; G := Source(rep1); irr_chars := IrrWithCorrectOrdering@(G); # Writes the characters in the irr_chars basis, they are the same # iff they are isomorphic return DecomposeCharacter@(rep1, irr_chars) = DecomposeCharacter@(rep2, irr_chars); end );
 ... ... @@ -36,17 +36,6 @@ DeclareGlobalFunction( "TensorProductRepLists" ); #! @Returns Direct sum of the list of representations list DeclareGlobalFunction( "DirectSumRepList" ); #! @Arguments rho, tau #! @Returns true if rho and tau are isomorphic as #! representations, false otherwise. #! @Description Note that two representations are isomorphic iff they #! give similar matrices, also iff they have the same irreducible #! decomposition. We use characters to determine the latter: the first #! is too expensive to check for large matrices. DeclareGlobalFunction( "AreRepsIsomorphic" ); #! @Arguments rho #! @Returns Degree of the representation rho. That is, ... ...
 ... ... @@ -158,23 +158,6 @@ DecomposeCharacter@ := function(rho, args...) return char_rho_basis; end; # Tells you if two representations of the same group are isomorphic by # examining characters InstallGlobalFunction( AreRepsIsomorphic, function(rep1, rep2) local G, irr_chars; if Source(rep1) <> Source(rep2) then return false; fi; G := Source(rep1); irr_chars := IrrWithCorrectOrdering@(G); # Writes the characters in the irr_chars basis, they are the same # iff they are isomorphic return DecomposeCharacter@(rep1, irr_chars) = DecomposeCharacter@(rep2, irr_chars); end ); InstallGlobalFunction( DegreeOfRepresentation, function(rep) if IsPermGroup(Range(rep)) then return LargestMovedPoint(Range(rep)); ... ...
 ... ... @@ -10,3 +10,4 @@ ReadPackage( "RepnDecomp", "lib/centralizer.gi"); ReadPackage( "RepnDecomp", "lib/serre_parallel.gi"); ReadPackage( "RepnDecomp", "lib/block_diagonalize.gi"); ReadPackage( "RepnDecomp", "lib/filters.gi"); ReadPackage( "RepnDecomp", "lib/isomorphism.gi" );
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment