You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## TODO: this code is broken right now, FIX!! the issue seems to lie in the function FORMS_MatrixReorganize
274
274
char_2_eqs :=[];
275
275
for form in Forms do
276
-
Add(char_2_eqs, FORMS_MatrixReorganize(form - TransposedMat(form), n, F, n));
276
+
Add(char_2_eqs, form - TransposedMat(form));
277
277
od;
278
-
sol := NullspaceMatDestructive(char_2_eqs);
279
278
out :=[];
280
-
for form in sol do
281
-
Add(out, FORMS_VectorReorganize(form, n, F, n));
279
+
sol := FORMS_SolveMatrixSystem(char_2_eqs, n, n, F);
280
+
for s in sol do
281
+
tmp := Forms[1]*s[1];
282
+
for i in[2..Size(s)]do
283
+
tmp := tmp + s[i]*Forms[i];
284
+
od;
285
+
Add(out, tmp);
282
286
od;
283
287
return out;
284
288
end;
285
289
286
-
# tries to filter the F = GF(q^2) vectorspace generated by <Forms> and return the GF(q) vector space A such that A = <Forms> \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION
287
-
# there must be a better way to compute these matrices..
290
+
# tries to filter the F = GF(q^2) vectorspace generated by <Forms> and return the GF(q) vector space A such that A = <Forms> \cap B where B = {A \in F^{n\times n}, A* = A}
288
291
FORMS_FilterUnitaryForms:=function(Forms, F, n, hom)
289
-
local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base, mat;
292
+
local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base, mat, small_field, field_aut_mat, gf_base_vecs, big_aut_mat, to_smaller_field_matrix, transpose_weird_mat, apply_aut_to_mat, eqs, s, form, form_changed, sol, out, tmp, big_field, changed_forms, apply_coefficient_and_get_smaller_matrix, square_base_entry_rep, multiply_with_scalar, form_changed_mult, form_changed_mult_star, form_changed_star;
290
293
if Size(Forms) =0then
291
294
return[];
292
295
fi;
@@ -296,59 +299,111 @@ FORMS_FilterUnitaryForms := function(Forms, F, n, hom)
296
299
if Size(Forms) =1then
297
300
#checks if A = A* or A = cA* if A = A* return A, if A = cA* we want to return scalar multiples of A, namely lA for l such that c = l^(1-q) iff c^-1 = l^(q-1)
298
301
# all the solutions then are lA*GF(q) is this correct?? i am not sure if this are indeed all the possible solutions, but it certanly are solutions.
299
-
# Print(ff);
300
302
l := FORMS_ScalarFormIdentifyCheck(Forms[1], F, n, hom, p, q);
301
303
if l =failthen
302
304
return[];
303
305
fi;
304
306
305
307
return[Forms[1]* l];
306
308
fi;
307
-
# this is where it gets interesting
308
-
# Print("ahhh this needs work!\n");
309
-
# kind of okay case?
310
309
311
-
## TODO proof if gAg^* = cA for some c it must hold that c \in GF(q) (not in GF(q^2))
310
+
## If A = A* is a form preserved modulo scalar c in GF(q^2) i.e. gAg* = cA for group elements g. then c in GF(q).
312
311
313
-
## we use (A + A*) is a hermitian form if gAg* = A the problem here is that for A, B such that gA*g = A and gB*g = B we may loose information namely it may be the case that 1/2 (A + A*) = c/2 (B + B*) this is annoying.... one thing one could do is check whether these matrices <1/2 (A + A*), 1/2 (B + B*), ...> are lineraly independent. if that is the case, we know that all forms must have been found (but do we???). but what if not? then there might be another form... this is annoying. Then we may add matrices A, B and so on such that <C1,C2, ., D1, D2..> is a basis of F where C1 and so on are hermitian and D1, D2 and so on are not. We may write D1 = A + B where A is hermitian and B is not. we can then try to write B in terms of the other matrices??? does this help... idk :(
314
-
## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well
312
+
## for char = 2 this can not yield all hermitian matrices as it deletes the diagonal disaapear.
315
313
if p <>2then
316
314
Base := MutableBasis(GF(q), [NullMat(n, n, GF(q))]);
317
315
# Base := MutableBasis(GF(q), [], ZeroVector(GF(q), n));
318
316
gf_base := BasisVectors(Basis(GF(GF(q), 2)))[2];
319
317
hgf_base := hom(gf_base);
320
318
for FF in Forms do
321
-
# l := FORMS_ScalarFormIdentifyCheck(FF, F, n, hom, p, q);
# Print("Could not find a basis of hermitian Forms. Returned hermitian Forms and a Bigger space of matrices that contains all possible hermitian forms. \n");
351
-
# return [baseVecs, Forms];
329
+
330
+
# the idea for char 2 is to solve the semiliner system of equations. we take a F_q basis of F_q^2 namely <1, delta> and express n times n matrices with this basis.
331
+
332
+
# TODO: this function is potentially really slow, it would be much better two only take a few equations and constain the problem instead of taking the entire n times n matrix. One such example would be the form space preserved by G := Group(SU(200, 2^2).1) then Size(Forms) = 38420 consisting of 200x200 matrices.
333
+
334
+
small_field := GF(q);
335
+
big_field := GF(q^2);
336
+
gf_base := Basis(GF(small_field, 2));
337
+
gf_base_vecs := BasisVectors(gf_base);
338
+
# expresses n times n matrices as 2n times n matrices where 2 time 1 collumn vectors contain the coefficients ascoiciated with the basis gf_base
339
+
to_smaller_field_matrix:=function(basis_of_field, small_field_, mat, n, c)
0 commit comments