-
Notifications
You must be signed in to change notification settings - Fork 4
Formspace (Work towards fixing Issues 78, 39, 22) #79
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
…e formspace for cyclic groups
…pace dimension because gap was being annoying. This could be a future todo tho
|
Hi @johnbamberg @jdebeule just some background: @GalaxyCo is a BSc student of @aniemeyer and did this work in this Bachelor's thesis. We are currently sitting in Aachen at our "recog days" workshop, and I asked Peter to submit this PR. We'd like to discuss with you how best to go about this... While @GalaxyCo could also create a new package, it seemed sensible to me to just enhance the forms package. Perhaps you'd like to discuss this, though, we could have a Zoom call? And of course feel free to ask questions |
…tian matrices: TODO: The case of characteristic two is still open for hermitian matrices and probably very poorly implemented for symmetric matrices
fingolfin
left a comment
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 left a bunch of nitpicks and minor comments.
| symmetric_base := MutableBasis(F, [NullMat(n, n, F)]); | ||
| symplectic_base := MutableBasis(F, [NullMat(n, n, F)]); |
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.
This creates an MutableBasis then has to reduce to determine that it should start with an empty basis. Better to start with an empty basis:
| symmetric_base := MutableBasis(F, [NullMat(n, n, F)]); | |
| symplectic_base := MutableBasis(F, [NullMat(n, n, F)]); | |
| symmetric_base := MutableBasis(F, [], ZeroVector(F, n)); | |
| symplectic_base := MutableBasis(F, [], ZeroVector(F, n)); |
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 have tried this change, however this resulted in issues when calling CloseMutableBasis (only tested this in the function that filters unitary forms)
lib/formspace.gi
Outdated
| CloseMutableBasis(symplectic_base, form - transposed_form); | ||
| od; | ||
|
|
||
| # this does not create compressed matrices, rather it returns lists consisting of compressed vectors... TODO: investigate how MutableBasis works on the inside, and maybe change it to use compressed matrices since they are faster to deal with |
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.
A basis consists of vector, and isn't a matrix, so I think semantically it is doing the right thing her.
If you want to turn it into a matrix afterwards, that's perfectly fine, but it should be done here, e.g. by calling ConvertToMatrixRep(list_of_vectors, F) or so
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.
The Mutable Basis used here, is a basis of a matrix vector space. What i mean by this line is the question how these objects are used internally. Maybe a custom implementation that ensures that matrix objects are used can be faster.
i have now added some code that then tries to turn each basis vector into a matrix obj.
…(q^2) one, added comment for todo regarding the forms computation for cyclic groups
|
It ist still open to change the FORMS_IsSymplecticMatrix and FORMS_IsSymmetricMatrix |
Formspace
In the above definition g* in G is understood to be
g* := TransposedMat(g)org* := TransposedMat(g)^homwherehomis a field automorphism of order two.For these functions to work, the package nofoma by M. Geck needs to be loaded. This provides the function
FrobeniusNormalFormwhich is used to compute the Frobenius Normal Form, since the functionRationalCanonicalFormTransformprovided by gap is too slow.I added a function
PreservedFormspace(G, Lambda, unitary)which computes a basis of the formspace of the groupGwith respect to the scalars given byLambda. The booleanunitarydecides which definition ofg*is used. Namely, if unitary is false we takehomto be the identity, otherwise we try to use a field automorphism of order two.I have also added a function
PreservedFormspace(G)which assumes all scalarsLambdato equal one and computes the formspace both forunitary = falseandunitary = true.These functions always work (at least they should) no matter if
Gis irreducible or not.Future Work
Limitations by Forms Package
Currently the Forms Package only allows bilinear forms with symplectic or symmetric Gram Matrix to be created. This restriction seems quite arbitrary and it would be nice to be able to use any form.
On Fixing
PreservedForms(G)Here I am talking about the issues 78, 39 and 22.
To use the
PreservedFormspace()function to fixPreservedForms(G)the following is still missing:Lambdaor use a subgroup of the commutator group. If we use the commutator group, we also need a function that then ensures that the found forms are also forms preserved by the original groupG.To use in recog
Testing
To better test the function
PreservedFormspace()some more examples would be nice namelyIdeas for optimization
Here are some ideas to further increase the speed of the
PreservedFormspace()function.PreservedFormspace(G)we compute the Frobenius normal form of an element and reuse it, which leads to computinga^hom,b^homfor two matrices. However one could also compute only apply^homonce and compute an extra Frobenius Normal Form and Invert a matrix. I am not sure what is cheaper.