Commit 7ebb12f6 authored by Kaashif Hymabaccus's avatar 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 <A>rho</A> and <A>tau</A> 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 <A>list</A>
DeclareGlobalFunction( "DirectSumRepList" );
#! @Arguments rho, tau
#! @Returns true if <A>rho</A> and <A>tau</A> 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 <A>rho</A>. 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