-
Notifications
You must be signed in to change notification settings - Fork 175
Transfer more properties when conjugating matrix groups #6183
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
@lgoettgens thanks! I just had asked a student of mine to look into this. I am not surprised if any of the formulas I wrote there were not quite right (or dead wrong), it was written off the cuff without too much thought; the goal was more to convey the general idea. Sorry if this caused any extra work, and thank you for correcting it! @chseeger ping -- perhaps you can see if this matches what you need, and/or work with Lars to get it over the finishing line. I guess there are a few more things we could / should transfer:
|
| ginv := g^-1; | ||
| fi; | ||
| if HasInvariantBilinearForm( G ) then | ||
| m := ginv * InvariantBilinearForm(G).matrix * TransposedMat(ginv); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should have test cases covering this.
I think the easiest and also most thorough way will be to modify tst/testinstall/grp/classic-forms.tst.
When it does e.g.
gap> grps:=[];;
gap> for d in [3,5,7] do
> for q in [2,3,4,5,7,8,9,16,17,25,27] do
> Add(grps, GO(d,q));
> od;
> od;
the innermost loop could be changed to also add a conjugate copy of the group, i.e.
> Add(grps, GO(d,q));
> Add(grps, GO(d,q) ^ RandomInvertibleMat(d,GF(q));
In light of what I write in my other comment, perhaps we should also test conjugation over different fields, e.g.
Add(grps, GO(d,q) ^ RandomInvertibleMat(d,GF(q^2));
and for the unitary case deliberately over fields such as q^3 (instead of q^2)
lib/grpmat.gi
Outdated
| SetInvariantBilinearForm( H, rec( matrix := m ) ); | ||
| fi; | ||
| if HasInvariantSesquilinearForm( G ) then | ||
| m := ginv * InvariantSesquilinearForm(G).matrix * TransposedMat(ginv); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would expect that the "right" Frobenius automorphism needs to be used here, too?
But actually, that's a problem now that I think about it. Or rather, two problems:
First off, conceptually, GAP does not actually specify over which field the group is sesquilinear. The documentation for InvariantSesquilinearForm says "over over the field F with q^2 elements" but which field is that? Perhaps over the DefaultFieldOfMatrixGroup(G) ? But strictly speaking that is not really well-defined. Or FieldOfMatrixGroup(G) ? That's well-defined but may be too small (think of the case where q = p^2 is the square of a prime, and we by "accident" are looking at a subgroup of G < GU(d,q) < GL(d,q^2) which has all entries in GF(q) then we might think the right Frobenius exponent is
Second, assuming we have determined
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed, I'll remove everything concerning sesquilinear forms from this PR.
For IsFullSubgroupGLorSLRespectingBilinearForm and IsFullSubgroupGLorSLRespectingQuadraticForm, there is also the question over which field this should hold. But since the only places where these are used (
Lines 841 to 865 in 8177f1e
| InstallMethod( \in, "respecting quadratic form", IsElmsColls, | |
| [ IsMatrix, IsFullSubgroupGLorSLRespectingQuadraticForm ], | |
| {} -> RankFilter( IsHandledByNiceMonomorphism ), # override nice mon. method | |
| # this method is better than the one using a nice monom.; | |
| # it has the same rank as the method based on the inv. | |
| # bilinear form, which is cheaper to check, | |
| # thus we install the current method first | |
| function( mat, G ) | |
| return IsSubset( FieldOfMatrixGroup( G ), FieldOfMatrixList( [ mat ] ) ) | |
| and ( not IsSubgroupSL( G ) or IsOne( DeterminantMat( mat ) ) ) | |
| and RespectsQuadraticForm( InvariantQuadraticForm( G ).matrix, mat ); | |
| end ); | |
| InstallMethod( \in, "respecting bilinear form", IsElmsColls, | |
| [ IsMatrix, IsFullSubgroupGLorSLRespectingBilinearForm ], | |
| {} -> RankFilter( IsHandledByNiceMonomorphism ), # override nice mon. method | |
| function( mat, G ) | |
| local inv; | |
| if not IsSubset( FieldOfMatrixGroup( G ), FieldOfMatrixList( [ mat ] ) ) | |
| or ( IsSubgroupSL( G ) and not IsOne( DeterminantMat( mat ) ) ) then | |
| return false; | |
| fi; | |
| inv:= InvariantBilinearForm(G).matrix; | |
| return mat * inv * TransposedMat( mat ) = inv; | |
| end ); |
FieldOfGroup, I added this to the docstrings of these two functions as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, in the same place we learn something about how these sesquilinear forms are supposed to work:
Lines 841 to 865 in 8177f1e
| InstallMethod( \in, "respecting quadratic form", IsElmsColls, | |
| [ IsMatrix, IsFullSubgroupGLorSLRespectingQuadraticForm ], | |
| {} -> RankFilter( IsHandledByNiceMonomorphism ), # override nice mon. method | |
| # this method is better than the one using a nice monom.; | |
| # it has the same rank as the method based on the inv. | |
| # bilinear form, which is cheaper to check, | |
| # thus we install the current method first | |
| function( mat, G ) | |
| return IsSubset( FieldOfMatrixGroup( G ), FieldOfMatrixList( [ mat ] ) ) | |
| and ( not IsSubgroupSL( G ) or IsOne( DeterminantMat( mat ) ) ) | |
| and RespectsQuadraticForm( InvariantQuadraticForm( G ).matrix, mat ); | |
| end ); | |
| InstallMethod( \in, "respecting bilinear form", IsElmsColls, | |
| [ IsMatrix, IsFullSubgroupGLorSLRespectingBilinearForm ], | |
| {} -> RankFilter( IsHandledByNiceMonomorphism ), # override nice mon. method | |
| function( mat, G ) | |
| local inv; | |
| if not IsSubset( FieldOfMatrixGroup( G ), FieldOfMatrixList( [ mat ] ) ) | |
| or ( IsSubgroupSL( G ) and not IsOne( DeterminantMat( mat ) ) ) then | |
| return false; | |
| fi; | |
| inv:= InvariantBilinearForm(G).matrix; | |
| return mat * inv * TransposedMat( mat ) = inv; | |
| end ); |
Here, FieldOfMatrixGroup is used to determine the "right" frobenius
|
Thanks a lot for taking a look at this -- it matches exactly what I need, and the conjugation formulas for the preserved bilinear/quadratic forms look correct. For sesquilinear forms, however, I'm unsure how to resolve the choice of Frobenius automorphism, given the ambiguity of the underlying field. This seems to be a more conceptual issue? |
c772d2f to
8852cc7
Compare
8852cc7 to
876fd71
Compare
Resolves #5635.
If I am not mistaken the formula for adapting the forms from #5635 (comment) does not work. The one present in this PR might work, but I would prefer if this would be double-checked.