From 8e6305d8d5a4ea8e7400c5d02492b385d29fd5ee Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Thu, 20 Nov 2025 17:34:00 +0100 Subject: [PATCH 01/21] started implementation --- form_rec.g | 452 ++++++++++++++++++++++++++++++++++++++++++++ intersting_groups.g | 226 ++++++++++++++++++++++ lib/formspace.gd | 5 + lib/formspace.gi | 333 ++++++++++++++++++++++++++++++++ read_temp.g | 27 +++ 5 files changed, 1043 insertions(+) create mode 100644 form_rec.g create mode 100644 intersting_groups.g create mode 100644 lib/formspace.gd create mode 100644 lib/formspace.gi create mode 100644 read_temp.g diff --git a/form_rec.g b/form_rec.g new file mode 100644 index 0000000..ac9cc4d --- /dev/null +++ b/form_rec.g @@ -0,0 +1,452 @@ +#Print("Dont forget to load M. Gecks NoFoMa Package!\n"); + +# IN +# g : Zyklische Matrix +# v : Vektor der zyklisch ist +# OUT +# Basis (v gv g^2v ... g^(n-1)v) +Spin := function(g, v) + local B, n, i; + n := DimensionsMat(g)[1]; + B := NullMat(n, n, Zero(Field(v[1]))); + B[1] := v; + + for i in [2..n] do + v := v*g; + B[i] := v; + od; + # return CMat(B); + ConvertToMatrixRep(B, DefaultFieldOfMatrix(B)); + return B; +end; + +RandomVector:=function(F, n) + local randvec, i; + randvec := EmptyPlist(n); + for i in [1..n] do + randvec[i] := PseudoRandom(F); + od; + return randvec; +end; +## TODO use predefined func!! +ZeroVectorFunc:=function(F, n) + local i, v; + v := EmptyPlist(n); + for i in [1..n] do + v[i] := Zero(F); + od; + return v; +end; + +IsZeroVec := function(v) + local i; + for i in [1..Length(v)] do + if not IsZero(v[i]) then + return false; + fi; + od; + return true; +end; + +EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) + local res, i, deg; + deg := Size(coeffs); + if deg = 0 then + return ZeroVector(F, n); + fi; + if deg = 1 then + return v * coeffs[1]; + fi; + + res := v * g * coeffs[deg]; + for i in [1..deg-2] do + res := res + coeffs[deg - i]*v; + res := res * g; + od; + res := res + coeffs[1]*v; + return res; +end; + +# mode = False \iff mat* := mat^tr, mode = True \iff mat* = komplex_konjugiert(mat^tr) +CalculateAdjoint := function(mat, mode, hom, n) + local transposed, i, j; + transposed := TransposedMat(mat); + if mode = false then + return transposed; + fi; + if mode then + return transposed^hom; + fi; + return fail; +end; + +# follows forms package recognition.gi (See : https://github.com/gap-packages/forms/blob/master/lib/recognition_new.gi) +# the reason for own implementation is to reuse the minpol computation (maybe just ignore this and use the one from forms package anyways???) +CalculateLambdas := function(F, n, g, g_star_inv, mode, hom) + local t, t_star_inv, p, p_deg, cyc, I, as, gcd_rep, l, a; + t := Trace(g); + t_star_inv := Trace(g_star_inv); + cyc := fail; + if t = Zero(F) and t_star_inv <> Zero(F) then + return fail; + fi; + if t <> Zero(F) and t_star_inv = Zero(F) then + return fail; + fi; + if t <> Zero(F) and t_star_inv <> Zero(F) then + # TODO + return [t * Inverse(t_star_inv), fail]; + fi; + # diser ganze ansatz hat den nachteil, das die suche nach dem minimalpolynom eigentlich einen zyklischen vektor liefert. Am besten geben wir diesen zurück statt true/false/fail. Dafür müsste aber die methode für das minpol angepasst werden. + p := MinimalPolynomial(g); + + # the reasom + p_deg := Degree(p); + as := CoefficientsOfUnivariatePolynomial(p); + I := Filtered([0..p_deg], x -> as[x+1] <> Zero(F)); + + # muss symmetrisch sein, sonst wird keine non-deg form invariant gelassen. + if ForAny(I, x -> not (p_deg-x) in I) then + return fail; + fi; + + gcd_rep := GcdRepresentation(I); + + if mode = false then + l:=List([1..Length(I)-1], x ->((as[1])*as[p_deg-I[x]+1]/(as[I[x]+1]))); + else + l:=List([1..Length(I)-1], x ->((as[1]^hom)*as[p_deg-I[x]+1]/(as[I[x]+1]^hom))); + fi; + # todo a is not guranateed to be Lambdas here, only Lambdas^gcd = a! + a:= Product([1..Length(I)-1], x->l[x]^gcd_rep[x]); + + if Degree(p) = n then + cyc := true; + else + cyc := false; + fi; + #TODO komplizierte analyse um Lambdas zu finden.. + return [a, cyc]; +end; + +RandomMatrixInvertible := function(n, q) + local F, M, i, j; + F := GF(q); + while true do + # M := ZeroMatrix(F, n, n); + M := NullMat(n, n, F); + for i in [1..n] do + for j in [1..n] do + M[i][j] := PseudoRandom(F); + od; + od; + ConvertToMatrixRep(M, F); + if RankMat(M) = n then + return M; + fi; + od; +end; + +##### --------- uses functions from Geck "nofoma" package + +# Avoids the use of PseudoRandomElement(G), since it is slow and the actual "randomness" is irrelevant. +#returns g cyclic, scalar that belongs to g, +# has some issues!!!!!!! TODO FIX ME +FindCyclicGroupElementAndScalars := function(Gens, Lambdas) + local cur_group_element, cur_scalar, known_elements, i, mode, n, res, j, known_scalars, best_known_element_index, best_known_res, best_known_length, mod_elem, g, e; + + known_elements := ShallowCopy(Gens); + known_scalars := ShallowCopy(Lambdas); + + n := DimensionsMat(Gens[1])[1]; + i := Size(known_elements); + mod_elem := 1; + best_known_length := n + 1; + while i < 25 do + # no accidental identity mat + if false then + mode := 1; + else + mode := PseudoRandom([1, 2]); + fi; + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := known_elements[j]; + cur_scalar := known_scalars[j]; + + if mode = 1 then + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := cur_group_element * known_elements[j]; + cur_scalar := cur_scalar * known_scalars[j]; + elif mode = 2 then + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := cur_group_element * Inverse(known_elements[j]); + cur_scalar := cur_scalar * Inverse(known_scalars[j]); + fi; + if i mod mod_elem = 0 then + res := FrobeniusNormalForm(cur_group_element); + if Size(res[3]) = 1 then + return Concatenation([cur_group_element, cur_scalar], res, [i]); + fi; + if Size(res[3]) <= best_known_length and not (cur_group_element in Gens) then + best_known_element_index := i + 1; + best_known_res := res; + best_known_length := Size(res[3]); + fi; + fi; + Add(known_elements, cur_group_element); + Add(known_scalars, cur_scalar); + i := i + 1; + od; + ## This fixes all the issues for some ungodly reason!!! why :( + # best_known_element_index := PseudoRandom(Group(Gens)); + # return Concatenation([best_known_element_index, 1], FrobeniusNormalForm(best_known_element_index), [-1]); + Print("only found element of length ", best_known_length, "\n"); + # TODO: möglichst kurze zyklische modul basis usw.... + return Concatenation([known_elements[best_known_element_index], known_scalars[best_known_element_index]], best_known_res, [i]); + # return fail; +end; + +# turns the jn vector into a j times n matrix +VectorReorganize := function(vec, j, F, n) + local A, i; + A := NullMat(j, n, F); + ConvertToMatrixRep(A, F); + for i in [1..j] do + A[i] := vec{[((i - 1) * n + 1)..(i*n)]}; + od; + return A; +end; + +# p is given as a list of coefficients. +EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) + local ws, C, i, end_pos, j, k; + ws := []; + j := Size(frob_base[3]); + for k in [1..j] do + # function(F, n, g, v, coeffs) + Add(ws, EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); + od; + C := NullMat(n, n, F); + ConvertToMatrixRep(C, F); + for k in [1..j] do + end_pos := 0; + if j = k then + end_pos := n; + else + end_pos := frob_base[3][k + 1]; + fi; + for i in [0..(end_pos - frob_base[3][k])] do + if i = 0 then + C[frob_base[3][k] + i] := ws[k]; + else + C[frob_base[3][k] + i] := C[frob_base[3][k] + i - 1]*g; + fi; + od; + od; + ## FrobBasSpin needed? + return frob_base_inv * C; +end; + +ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) + local coeffs_c, coeffs_f, Ps, i, j, b_end, b_start, cpol, fpol; + coeffs_c := (u * h) * frob_base_inv; + coeffs_f := (u * frob_base_inv) * scalar_h; + # Display(coeffs_c); + j := Size(frob_base[3]); + Ps := NullMat(n * j, n, F); + ConvertToMatrixRep(Ps, F); + # Print(frob_base[3], "\n"); + for i in [1..j] do + if i = j then + b_end := n; + else + b_end := frob_base[3][i + 1] - 1; + fi; + # Print("[", ((i - 1)*n + 1), ",", (i*n), "\n"); + #Print("->", frob_base[3][i],",",b_end, "\n"); + Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := + EvaluatePolynomialWithFrobenius(coeffs_c{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n) * h_star - EvaluatePolynomialWithFrobenius(coeffs_f{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n); + # cpol := UnivariatePolynomial(F, coeffs_c); + # fpol := UnivariatePolynomial(F, coeffs_f); + # Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := + # cpol(g_star_inv_scaled) * h_star - fpol(g_star_inv_scaled); + # Print(aua); + od; + return Ps; +end; + +FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) + local A, j, i, k, end_pos; + j := Size(frob_base_blocks); + A := NullMat(n, n, F); + ConvertToMatrixRep(A, F); + for i in [1..j] do + if i = j then + end_pos := n; + else + end_pos := frob_base_blocks[i + 1] - 1; + fi; + A[frob_base_blocks[i]] := Images[i]; + for k in [(frob_base_blocks[i] + 1)..end_pos] do + A[k] := A[k - 1]*spin_elem; + od; + od; + return A; +end; + +FindFormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) + local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; + first := true; + needs_checking := false; ## maybe remove? + + for i in [1..d] do + if needs_checking then + break; + fi; + h := Gens[i]; + h_star := CalculateAdjoint(h, unitary, hom, n); + for j in [1..n] do + # vec := RandomVector(F, n); + vec := g_res[4][j]; + # Display(vec); + Conds := + ComputeConditionMatrixFrob(vec, h, h_star, Lambdas[i], g_star_inv_scaled, g_star_inv_scaled_frob, g_inv_frob, frob_base_inv_star, F, n); + + ConvertToMatrixRep(Conds, F); + if not first then + nspace := NullspaceMat(W * Conds); + ConvertToMatrixRep(nspace, F); + if Size(nspace) = 0 then + # Print("empty"); + return []; + fi; + W := nspace * W; + fi; + if first then + nspace := NullspaceMat(Conds); + ConvertToMatrixRep(nspace, F); + if Size(nspace) = 0 then + # Print("empty"); + return []; + fi; + W := nspace; + first := false; + fi; + if Size(nspace) = 1 then + needs_checking := true; + break; + fi; + od; + od; + O := []; + for w in W do + A := g_inv_frob * FrobSpin(VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); + if needs_checking then + failed_check := false; + for i in [1..d] do + if not failed_check and Gens[i] * A * CalculateAdjoint(Gens[i], unitary, hom, n) <> Lambdas[i] * A then + failed_check := true; + fi; + od; + if not failed_check then + Add(O, A); + fi; + fi; + if not needs_checking then + Add(O, A); + fi; + od; + + return O; + +end; + +FindFormspace := function(G, Lambdas, unitary) + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star; + if not IsMatrixGroup(G) then + # Print("The method only works for matrix groups. \n"); + return; + fi; + F := DefaultFieldOfMatrixGroup(G); + p_exponent := DegreeOverPrimeField(F); + if unitary and (p_exponent mod 2 <> 0) then + Print("Field does not admit field automorphism of order two!"); + return; + fi; + # Prüfen ob es sich um einen endlichen körper handelt?? + Gens := GeneratorsOfGroup(G); + # F := DefaultFieldOfMatrix(Gens[1]); + n := DimensionsMat(Gens[1])[1]; + d := Size(Gens); + hom := fail; + + if d = 1 then + # Todo.... !! + fi; + + if unitary then + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + fi; + #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute + g_res := FindCyclicGroupElementAndScalars(Gens, Lambdas); + g_inv_frob := Inverse(g_res[4]); + #CalculateAdjoint := function(mat, mode, hom, n) + g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); + if unitary then + g_star_inv_unscaled := g_star_inv_unscaled^hom; + fi; + #* g_res[2]; + # Todo the computation of this can probably be sped up by using the known information about g!!! + g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled * g_res[2]); + frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); + + return FindFormspaceInternal(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n); +end; + +# todo scalars +FindForms := function(G) + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, Lambdas, Out, i; + Out := []; + if not IsMatrixGroup(G) then + # Print("The method only works for matrix groups. \n"); + return; + fi; + F := DefaultFieldOfMatrixGroup(G); + p_exponent := DegreeOverPrimeField(F); + # Prüfen ob es sich um einen endlichen körper handelt?? + Gens := GeneratorsOfGroup(G); + # F := DefaultFieldOfMatrix(Gens[1]); + n := DimensionsMat(Gens[1])[1]; + d := Size(Gens); + hom := fail; + + if d = 1 then + # Todo.... !! + fi; + + #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute + Lambdas := []; + for i in [1..d] do + Add(Lambdas, One(F)); + od; + g_res := FindCyclicGroupElementAndScalars(Gens, Lambdas); + ConvertToMatrixRep(g_res[1], F); + ConvertToMatrixRep(g_res[4], F); + g_inv_frob := Inverse(g_res[4]); + #CalculateAdjoint := function(mat, mode, hom, n) + g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); + #* g_res[2]; + # Todo the computation of this can probably be sped up by using the known information about g!!! + g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled); # hier ist eventuell noch ein bug mit den skalaren + frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); + + Add(Out, FindFormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + if p_exponent mod 2 = 0 then + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + g_star_inv_unscaled := g_star_inv_unscaled^hom; + g_star_inv_scaled_frob[2] := g_star_inv_scaled_frob[2]^hom; + frob_base_inv_star := frob_base_inv_star^hom; + Add(Out, FindFormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + fi; + return Out; +end; \ No newline at end of file diff --git a/intersting_groups.g b/intersting_groups.g new file mode 100644 index 0000000..f5a3fe4 --- /dev/null +++ b/intersting_groups.g @@ -0,0 +1,226 @@ +## obtained through the classicalmaximals package + +# FindIrredNotAbs := function(Gs) +# local i; +# for i in [1..Length(Gs)] do +# if IsIrreducible(Gs[i]) and not IsAbsolutelyIrreducible(Gs[i]) then +# return i; +# fi; +# od; +# end; + +# TestPolyEval := function() +# local iters, n, F, mat, coeffs, f, frob, eval, i; +# iters := 50; +# n := 50; +# F := GF(2); +# for i in [1..iters] do +# mat := PseudoRandom(GL(n, F)); +# coeffs := RandomVector(F, PseudoRandom([0..100])); +# f := UnivariatePolynomial(F, coeffs); +# frob := FrobeniusNormalForm(mat); +# eval := EvaluatePolynomialWithFrobenius(coeffs, mat, frob, Inverse(frob[2]), F, n); +# if Size(frob[3]) > 1 then +# # Print("non cyclic\n"); +# fi; +# if eval <> f(mat) then +# Print("failed on mat with", frob[3], "\n"); +# fi; +# od; +# return "Ok"; +# end; + +# trivial group +Gtriv := Group([[ Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5^4)^623 ]]^0); + +## subgroup of SP(10, 5^4), which is not irreducible (2d formspace) +G1 := Group([ [ Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5^4)^623 ] ], [ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ], + [ 0*Z(5), Z(5)^2, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ] ], [ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5^4)^623, 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ] ], + [ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^2, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ] ] + ); + +## reducible subgroup of U(4, 5^4) with 2d formspace +G2 := Group([ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ] ], [ [ Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5^4)^467, Z(5^4)^194, 0*Z(5) ], + [ 0*Z(5), Z(5^4)^532, Z(5^4)^441, 0*Z(5) ], [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5^4)^599 ] ], [ [ Z(5^4)^547, Z(5^4)^217, Z(5^4)^324, Z(5)^0 ], [ Z(5^4)^612, Z(5^4)^65, Z(5), 0*Z(5) ], + [ Z(5^4)^433, Z(5^2)^19, Z(5^4)^377, 0*Z(5) ], [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ] ], [ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5^2)^21, Z(5^4)^247, 0*Z(5) ], + [ 0*Z(5), Z(5^4)^585, Z(5^2)^7, 0*Z(5) ], [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ] ]); + +## subgroup of omega(7, 5^2) which is reducible and preserves both unitary and bilinear forms +G3 := Group([ [ Z(5^2)^5, Z(5^2)^9, 0*Z(5), 0*Z(5), 0*Z(5), Z(5^2)^21, Z(5^2)^13 ], + [ Z(5^2)^21, Z(5^2)^21, 0*Z(5), Z(5^2)^21, 0*Z(5), 0*Z(5), Z(5^2)^21 ], + [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], + [ 0*Z(5), Z(5^2)^15, 0*Z(5), Z(5^2)^9, 0*Z(5), Z(5^2)^15, 0*Z(5) ], + [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], + [ Z(5^2)^9, 0*Z(5), 0*Z(5), Z(5^2)^21, 0*Z(5), Z(5^2)^21, Z(5^2)^9 ], + [ Z(5^2)^13, Z(5^2)^9, 0*Z(5), 0*Z(5), 0*Z(5), Z(5^2)^21, Z(5^2)^5 ] ], + [ [ Z(5^2)^7, 0*Z(5), Z(5^2)^2, 0*Z(5), Z(5^2)^2, 0*Z(5), Z(5^2)^9 ], + [ 0*Z(5), Z(5^2)^10, Z(5^2)^10, Z(5^2)^23, Z(5^2)^22, Z(5^2)^3, 0*Z(5) ], + [ Z(5^2)^2, Z(5^2)^10, Z(5^2)^16, Z(5), Z(5^2)^22, Z(5^2)^10, Z(5^2)^14 ], + [ 0*Z(5), Z(5^2)^17, Z(5)^0, Z(5^2)^5, Z(5)^2, Z(5^2)^17, 0*Z(5) ], + [ Z(5^2)^2, Z(5^2)^22, Z(5^2)^22, Z(5)^3, Z(5^2)^16, Z(5^2)^22, Z(5^2)^14 ], + [ 0*Z(5), Z(5^2)^3, Z(5^2)^10, Z(5^2)^23, Z(5^2)^22, Z(5^2)^10, 0*Z(5) ], + [ Z(5^2)^9, 0*Z(5), Z(5^2)^14, 0*Z(5), Z(5^2)^14, 0*Z(5), Z(5^2)^7 ] ], + [ [ Z(5^2)^15, Z(5^2)^4, Z(5^2)^3, Z(5^2)^22, Z(5^2)^3, Z(5)^2, Z(5^2)^21 ], + [ Z(5)^2, Z(5)^0, Z(5^2)^9, Z(5^2)^9, Z(5^2)^9, Z(5^2)^19, Z(5^2)^19 ], + [ Z(5^2)^13, Z(5^2)^7, Z(5)^3, Z(5^2)^22, Z(5), Z(5)^0, Z(5^2)^13 ], + [ Z(5^2)^4, Z(5^2)^8, 0*Z(5), Z(5^2)^21, 0*Z(5), Z(5^2), Z(5^2)^4 ], + [ Z(5^2)^13, Z(5^2)^7, Z(5), Z(5^2)^22, Z(5)^3, Z(5)^0, Z(5^2)^13 ], + [ Z(5^2)^19, Z(5)^0, Z(5^2)^21, Z(5^2)^9, Z(5^2)^21, Z(5^2)^19, Z(5)^2 ], + [ Z(5^2)^9, Z(5^2)^16, Z(5^2)^3, Z(5^2)^10, Z(5^2)^3, Z(5)^0, Z(5^2)^3 ] ] + ); + +## Subgroup of O+(14, 7) which is irreducible, but not absolutely irreducible +## Intersting is that the foms package seems to reliably find a hermitian and quadratic form, my function sometimes (there must be a bug!!!) finds a 10d form space, It seems that it is hard to find a cyclic group element in this particular group! Needs Fix !!!! +G4 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^4, Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^5, 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, Z(7)^2, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^5, Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^2, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0 ] + ], [ [ Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^2, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^5, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3 ] + ], [ [ Z(7)^3, Z(7)^2, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^5, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, Z(7)^5, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^4 ], + [ Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^2, Z(7)^4 ], + [ 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7) ], + [ 0*Z(7), Z(7)^5, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^5, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3 ] + ]); + + + +# Subgroup of O-(14, 11^2) another group which is irreducible but not absolutely irreducible. it is intersting that once again my program fails to find a cyclic element. It also does not find a presrved formspace. There seems to be some error in the implementation +G5 := Group([ [ 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^3, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), Z(11)^6 ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^81, 0*Z(11) ], + [ Z(11)^3, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ Z(11^2)^6, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^6, 0*Z(11) ], + [ 0*Z(11), Z(11^2)^39, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^8, Z(11^2)^66, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11)^0, 0*Z(11) ], [ Z(11)^4, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, + 0*Z(11), 0*Z(11) ] ], [ [ Z(11^2)^29, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11^2)^119, 0*Z(11) ], [ 0*Z(11), Z(11^2)^30, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5 ], + [ 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11)^5, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), Z(11)^5, 0*Z(11), 0*Z(11) ], + [ Z(11^2)^86, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11^2)^29, 0*Z(11) ], [ 0*Z(11), Z(11^2)^27, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^30 ] ],[ [ Z(11^2)^90, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11)^0, 0*Z(11) ], [ 0*Z(11), Z(11^2)^89, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^59 ], + [ 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^90, 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^89, 0*Z(11), 0*Z(11), 0*Z(11), + Z(11^2)^59, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^87, 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^90, 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^26, 0*Z(11), 0*Z(11), 0*Z(11), + Z(11^2)^89, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], + [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), + 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11) ], + [ Z(11^2)^87, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + Z(11^2)^90, 0*Z(11) ], [ 0*Z(11), Z(11^2)^26, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^89 ] ]); \ No newline at end of file diff --git a/lib/formspace.gd b/lib/formspace.gd new file mode 100644 index 0000000..542a279 --- /dev/null +++ b/lib/formspace.gd @@ -0,0 +1,5 @@ +# #! @Arguments matrix group, scalars, unitary +# #! @Returns a basis of the formspace preserved by group modulo scalars consisting of bilinear forms if unitary = false and unitary forms if unitary = true +DeclareOperation("PreservedFormspace", [IsMatrixGroup, IsVector and IsFFECollection, IsBool]); + +DeclareOperation("PreservedFormspace", [IsMatrixGroup]); \ No newline at end of file diff --git a/lib/formspace.gi b/lib/formspace.gi new file mode 100644 index 0000000..130dc7a --- /dev/null +++ b/lib/formspace.gi @@ -0,0 +1,333 @@ +__FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) + local res, i, deg; + deg := Size(coeffs); + if deg = 0 then + return ZeroVector(F, n); + fi; + if deg = 1 then + return v * coeffs[1]; + fi; + + res := v * g * coeffs[deg]; + for i in [1..deg-2] do + res := res + coeffs[deg - i]*v; + res := res * g; + od; + res := res + coeffs[1]*v; + return res; +end; + +# mode = False \iff mat* := mat^tr, mode = True \iff mat* = komplex_konjugiert(mat^tr) +__FORMSPACE__INTERNAL__CalculateAdjoint := function(mat, mode, hom, n) + local transposed, i, j; + transposed := TransposedMat(mat); + if mode = false then + return transposed; + fi; + if mode then + return transposed^hom; + fi; + return fail; +end; + +__FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambdas) + local cur_group_element, cur_scalar, known_elements, i, mode, n, res, j, known_scalars, best_known_element_index, best_known_res, best_known_length, mod_elem, g, e; + + known_elements := ShallowCopy(Gens); + known_scalars := ShallowCopy(Lambdas); + + n := DimensionsMat(Gens[1])[1]; + i := Size(known_elements); + mod_elem := 1; + best_known_length := n + 1; + while i < 25 do + # no accidental identity mat + if false then + mode := 1; + else + mode := PseudoRandom([1, 2]); + fi; + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := known_elements[j]; + cur_scalar := known_scalars[j]; + + if mode = 1 then + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := cur_group_element * known_elements[j]; + cur_scalar := cur_scalar * known_scalars[j]; + elif mode = 2 then + j := PseudoRandom([1..Size(known_elements)]); + cur_group_element := cur_group_element * Inverse(known_elements[j]); + cur_scalar := cur_scalar * Inverse(known_scalars[j]); + fi; + if i mod mod_elem = 0 then + res := FrobeniusNormalForm(cur_group_element); + if Size(res[3]) = 1 then + return Concatenation([cur_group_element, cur_scalar], res, [i]); + fi; + if Size(res[3]) <= best_known_length and not (cur_group_element in Gens) then + best_known_element_index := i + 1; + best_known_res := res; + best_known_length := Size(res[3]); + fi; + fi; + Add(known_elements, cur_group_element); + Add(known_scalars, cur_scalar); + i := i + 1; + od; + ## This fixes all the issues for some ungodly reason!!! why :( + # best_known_element_index := PseudoRandom(Group(Gens)); + # return Concatenation([best_known_element_index, 1], FrobeniusNormalForm(best_known_element_index), [-1]); + Print("only found element of length ", best_known_length, "\n"); + # TODO: möglichst kurze zyklische modul basis usw.... + return Concatenation([known_elements[best_known_element_index], known_scalars[best_known_element_index]], best_known_res, [i]); + # return fail; +end; + +# turns the jn vector into a j times n matrix +__FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) + local A, i; + A := NullMat(j, n, F); + ConvertToMatrixRep(A, F); + for i in [1..j] do + A[i] := vec{[((i - 1) * n + 1)..(i*n)]}; + od; + return A; +end; + +# p is given as a list of coefficients. +__FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) + local ws, C, i, end_pos, j, k; + ws := []; + j := Size(frob_base[3]); + for k in [1..j] do + # function(F, n, g, v, coeffs) + Add(ws, __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); + od; + C := NullMat(n, n, F); + ConvertToMatrixRep(C, F); + for k in [1..j] do + end_pos := 0; + if j = k then + end_pos := n; + else + end_pos := frob_base[3][k + 1]; + fi; + for i in [0..(end_pos - frob_base[3][k])] do + if i = 0 then + C[frob_base[3][k] + i] := ws[k]; + else + C[frob_base[3][k] + i] := C[frob_base[3][k] + i - 1]*g; + fi; + od; + od; + ## FrobBasSpin needed? + return frob_base_inv * C; +end; + +__FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) + local coeffs_c, coeffs_f, Ps, i, j, b_end, b_start, cpol, fpol; + coeffs_c := (u * h) * frob_base_inv; + coeffs_f := (u * frob_base_inv) * scalar_h; + # Display(coeffs_c); + j := Size(frob_base[3]); + Ps := NullMat(n * j, n, F); + ConvertToMatrixRep(Ps, F); + # Print(frob_base[3], "\n"); + for i in [1..j] do + if i = j then + b_end := n; + else + b_end := frob_base[3][i + 1] - 1; + fi; + # Print("[", ((i - 1)*n + 1), ",", (i*n), "\n"); + #Print("->", frob_base[3][i],",",b_end, "\n"); + Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := + __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs_c{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n) * h_star - __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs_f{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n); + # cpol := UnivariatePolynomial(F, coeffs_c); + # fpol := UnivariatePolynomial(F, coeffs_f); + # Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := + # cpol(g_star_inv_scaled) * h_star - fpol(g_star_inv_scaled); + # Print(aua); + od; + return Ps; +end; + +__FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) + local A, j, i, k, end_pos; + j := Size(frob_base_blocks); + A := NullMat(n, n, F); + ConvertToMatrixRep(A, F); + for i in [1..j] do + if i = j then + end_pos := n; + else + end_pos := frob_base_blocks[i + 1] - 1; + fi; + A[frob_base_blocks[i]] := Images[i]; + for k in [(frob_base_blocks[i] + 1)..end_pos] do + A[k] := A[k - 1]*spin_elem; + od; + od; + return A; +end; + +__FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) + +local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; + first := true; + needs_checking := false; ## maybe remove? + + for i in [1..d] do + if needs_checking then + break; + fi; + h := Gens[i]; + h_star := __FORMSPACE__INTERNAL__CalculateAdjoint(h, unitary, hom, n); + for j in [1..n] do + # vec := RandomVector(F, n); + vec := g_res[4][j]; + # Display(vec); + Conds := + __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob(vec, h, h_star, Lambdas[i], g_star_inv_scaled, g_star_inv_scaled_frob, g_inv_frob, frob_base_inv_star, F, n); + + ConvertToMatrixRep(Conds, F); + if not first then + nspace := NullspaceMat(W * Conds); + ConvertToMatrixRep(nspace, F); + if Size(nspace) = 0 then + # Print("empty"); + return []; + fi; + W := nspace * W; + fi; + if first then + nspace := NullspaceMat(Conds); + ConvertToMatrixRep(nspace, F); + if Size(nspace) = 0 then + # Print("empty"); + return []; + fi; + W := nspace; + first := false; + fi; + if Size(nspace) = 1 then + needs_checking := true; + break; + fi; + od; + od; + O := []; + for w in W do + A := g_inv_frob * __FORMSPACE__INTERNAL__FrobSpin(__FORMSPACE__INTERNAL__VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); + if needs_checking then + failed_check := false; + for i in [1..d] do + if not failed_check and Gens[i] * A * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n) <> Lambdas[i] * A then + failed_check := true; + fi; + od; + if not failed_check then + Add(O, A); + fi; + fi; + if not needs_checking then + Add(O, A); + fi; + od; + + return O; + +end; + +InstallMethod(PreservedFormspace, + "for matrix group over finite field, with given scalars, and search for unitary forms", [IsMatrixGroup, IsVector and IsFFECollection, IsBool], + function(G, Lambdas, unitary) + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star; + if not IsMatrixGroup(G) then + # Print("The method only works for matrix groups. \n"); + return; + fi; + F := DefaultFieldOfMatrixGroup(G); + p_exponent := DegreeOverPrimeField(F); + if unitary and (p_exponent mod 2 <> 0) then + Print("Field does not admit field automorphism of order two!"); + return; + fi; + # Prüfen ob es sich um einen endlichen körper handelt?? + Gens := GeneratorsOfGroup(G); + # F := DefaultFieldOfMatrix(Gens[1]); + n := DimensionsMat(Gens[1])[1]; + d := Size(Gens); + hom := fail; + + if d = 1 then + # Todo.... !! + fi; + + if unitary then + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + fi; + #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute + g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); + g_inv_frob := Inverse(g_res[4]); + #CalculateAdjoint := function(mat, mode, hom, n) + g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); + if unitary then + g_star_inv_unscaled := g_star_inv_unscaled^hom; + fi; + #* g_res[2]; + # Todo the computation of this can probably be sped up by using the known information about g!!! + g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled * g_res[2]); + frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); + + return __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n); + end +); + +InstallMethod(PreservedFormspace, + "for matrix group (finds bilinear/unitary forms modulo 1)", + [IsMatrixGroup], + function(G) + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, Lambdas, Out, i; + Out := []; + F := DefaultFieldOfMatrixGroup(G); + p_exponent := DegreeOverPrimeField(F); + # Prüfen ob es sich um einen endlichen körper handelt?? + Gens := GeneratorsOfGroup(G); + # F := DefaultFieldOfMatrix(Gens[1]); + n := DimensionsMat(Gens[1])[1]; + d := Size(Gens); + hom := fail; + + if d = 1 then + # Todo.... !! + fi; + + #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute + Lambdas := []; + for i in [1..d] do + Add(Lambdas, One(F)); + od; + g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); + ConvertToMatrixRep(g_res[1], F); + ConvertToMatrixRep(g_res[4], F); + g_inv_frob := Inverse(g_res[4]); + #CalculateAdjoint := function(mat, mode, hom, n) + g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); + #* g_res[2]; + # Todo the computation of this can probably be sped up by using the known information about g!!! + g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled); # hier ist eventuell noch ein bug mit den skalaren + frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); + + Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + if p_exponent mod 2 = 0 then + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + g_star_inv_unscaled := g_star_inv_unscaled^hom; + g_star_inv_scaled_frob[2] := g_star_inv_scaled_frob[2]^hom; + frob_base_inv_star := frob_base_inv_star^hom; + Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + fi; + return Out; + end +); \ No newline at end of file diff --git a/read_temp.g b/read_temp.g new file mode 100644 index 0000000..8ac2f97 --- /dev/null +++ b/read_temp.g @@ -0,0 +1,27 @@ +############################################################################# +## +## read.g Forms package +## John Bamberg +## Jan De Beule +## +## Copyright 2015, The University of Western Austalia +## Copyright 2015, Ghent University +## Copyright 2015, Vrije Universiteit Brussel +## +## Reading the implementation part of the Desargues package. +## +############################################################################# + +LoadPackage("nofoma"); +# Read("form_rec.g"); + +Read("lib/forms.gd"); +Read("lib/recognition.gd"); +Read("lib/forms.gi"); +Read("lib/recognition.gi"); +Read("lib/classic.gi"); +Read("lib/recognition_new.gi"); +Read("lib/formspace.gd"); +Read("lib/formspace.gi"); + +Read("intersting_groups.g"); \ No newline at end of file From 4227d4d1eb71ef4547b45ca1e810c167aed85854 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Tue, 9 Dec 2025 14:33:44 +0100 Subject: [PATCH 02/21] testing some things, cyclic group case, added documentation (TODO!!) --- .gitignore | 1 + doc/forms.xml | 2 + init.g | 3 + intersting_groups.g | 189 +++++++++++++++++++++--- lib/formspace.gi | 239 ++++++++++++++++++++++++++++--- lib/recognition_new.gi | 2 +- makedoc.g | 1 + read.g | 1 + tst/formspace/poly_eval_test.g | 54 +++++++ tst/formspace/test_poly_eval.tst | 4 + tst/testall.g | 2 + 11 files changed, 454 insertions(+), 44 deletions(-) create mode 100644 tst/formspace/poly_eval_test.g create mode 100644 tst/formspace/test_poly_eval.tst diff --git a/.gitignore b/.gitignore index 85d5146..ccd5fde 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ /tmp /gh-pages tmp.json +profiling \ No newline at end of file diff --git a/doc/forms.xml b/doc/forms.xml index 1e2a0c8..96bb09e 100644 --- a/doc/forms.xml +++ b/doc/forms.xml @@ -41,6 +41,8 @@ <#Include SYSTEM "theory.xml"> <#Include SYSTEM "construct_basic.xml"> <#Include SYSTEM "morphisms.xml"> +<#Include SYSTEM "_Chapter_TODO.xml"> + diff --git a/init.g b/init.g index 6f21851..762f871 100644 --- a/init.g +++ b/init.g @@ -12,5 +12,8 @@ ## ############################################################################# + ReadPackage("forms","lib/forms.gd"); ReadPackage("forms","lib/recognition.gd"); +LoadPackage("nofoma"); +ReadPackage("forms","lib/formspace.gd"); \ No newline at end of file diff --git a/intersting_groups.g b/intersting_groups.g index f5a3fe4..95c7f5f 100644 --- a/intersting_groups.g +++ b/intersting_groups.g @@ -9,26 +9,37 @@ # od; # end; -# TestPolyEval := function() -# local iters, n, F, mat, coeffs, f, frob, eval, i; -# iters := 50; -# n := 50; -# F := GF(2); -# for i in [1..iters] do -# mat := PseudoRandom(GL(n, F)); -# coeffs := RandomVector(F, PseudoRandom([0..100])); -# f := UnivariatePolynomial(F, coeffs); -# frob := FrobeniusNormalForm(mat); -# eval := EvaluatePolynomialWithFrobenius(coeffs, mat, frob, Inverse(frob[2]), F, n); -# if Size(frob[3]) > 1 then -# # Print("non cyclic\n"); -# fi; -# if eval <> f(mat) then -# Print("failed on mat with", frob[3], "\n"); -# fi; -# od; -# return "Ok"; -# end; +# gap --packagedirs $PWD +# Read("tst/formspace/poly_eval_test.g"); + +## various micselaneous functions.. + +Disp := function(Fspaces) + local F, i; + Print("bilinear:\n"); + for i in [1..Size(Fspaces[1])] do + F := Fspaces[1][i]; + Print("--------------------------------------\n"); + Display(F); + od; + Print("unitary:\n"); + for i in [1..Size(Fspaces[2])] do + F := Fspaces[2][i]; + Print("--------------------------------------\n"); + Display(F); + od; +end; + +PolyEval := function(f, M) + local F, n, frob; + n := DimensionsMat(M)[1]; + F := DefaultFieldOfMatrix(M); + frob := FrobeniusNormalForm(M); + return __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(f), M, frob, Inverse(frob[2]), F, n); +end; + + +## groups # trivial group Gtriv := Group([[ Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], @@ -223,4 +234,140 @@ G5 := Group([ [ 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11) ], [ Z(11^2)^87, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^90, 0*Z(11) ], [ 0*Z(11), Z(11^2)^26, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), - 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^89 ] ]); \ No newline at end of file + 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), Z(11^2)^89 ] ]); + +# subgroup of U(10, 2^8) which sometimes lands in the scalar case c A = A* (for hermitian forms) (also non irreducible) +G6 := Group([ [ Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2^8)^254, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^16, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^239 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), Z(2)^0 ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^14, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, Z(2^4)^2, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^13, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^254, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^16, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^239 ] ]); + +# Subgroup of U(10, 2^8) (non irreducible) that lands in the annoying case of multiple unitary forms +G7 := Group([ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^67, Z(2^8)^33, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^84, Z(2^8)^169, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^239, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + Z(2)^0, 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2^8)^222, 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^183, Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2^8)^123, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^12, Z(2^4)^3, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^6, Z(2^2)^2, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ]); + +# Subgroup of U(10, 2^8) (non irreducible) that lands in the annoying case of multiple unitary forms (similar as G7) +G8 := Group([ [ Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^169, Z(2^8)^33, 0*Z(2), + 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^84, Z(2^8)^67, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^239 ] ], [ [ Z(2^8)^222, 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^123, Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ Z(2^8)^183, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^67, Z(2^8)^33, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^84, Z(2^8)^169, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^8)^239, 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + Z(2)^0, 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2^8)^222, 0*Z(2), 0*Z(2), Z(2^8)^183, Z(2)^0, 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2^8)^123, 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ], [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^12, Z(2^4)^3, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2^4)^6, Z(2^2)^2, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, + 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], + [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ]); + +# The group from the forms package pull request https://github.com/gap-packages/forms/issues/22 +GP22 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7) ], [ Z(7^2)^33, Z(7^2)^14, Z(7^2)^26 ], [ Z(7^2)^19, Z(7^2)^31, Z(7^2)^5 ] ], [ [ Z(7^2)^39, Z(7^2)^9, Z(7)^3 ], [ Z(7^2)^25, Z(7)^2, Z(7^2)^6 ], [ Z(7^2)^7, Z(7)^4, Z(7^2)^28 ] ]); \ No newline at end of file diff --git a/lib/formspace.gi b/lib/formspace.gi index 130dc7a..9854f91 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -1,6 +1,15 @@ +#! @Chapter Formspace +#! Computes The Formspace +#! @Section TODO +#! .... test + + + +# underlying field F, g is in F^{n\times n}, v is in F^n, coeffs are the coefficients of a polynomial p in F[X]. Returns vp(g). __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) local res, i, deg; deg := Size(coeffs); + v := Vector(v); if deg = 0 then return ZeroVector(F, n); fi; @@ -17,12 +26,15 @@ __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector := function(F, n, g, v return res; end; + +# Given mat in F^{n\times n} F Field, n \in N, mode says whether to apply hom or not. Returns (mat^T)^hom. # mode = False \iff mat* := mat^tr, mode = True \iff mat* = komplex_konjugiert(mat^tr) -__FORMSPACE__INTERNAL__CalculateAdjoint := function(mat, mode, hom, n) +__FORMSPACE__INTERNAL__CalculateAdjoint := function(mat, mode, hom, n, F) local transposed, i, j; transposed := TransposedMat(mat); + ConvertToMatrixRep(transposed, F); if mode = false then - return transposed; + return transposed; # this is apparently very slow????? what why? fi; if mode then return transposed^hom; @@ -30,6 +42,9 @@ __FORMSPACE__INTERNAL__CalculateAdjoint := function(mat, mode, hom, n) return fail; end; +# tries to find a element g \in such that the Frobenius Normal form of g has as few blocks as possible. Lambdas describes a group homomorphism induced by Phi : Gens[i] \mapsto Lambdas[i] +# Returns [g, Phi(g), FrobeniusNormalForm(g), nrOfTries] +# nrOfTries contains the number of random elements tested before g was found. __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambdas) local cur_group_element, cur_scalar, known_elements, i, mode, n, res, j, known_scalars, best_known_element_index, best_known_res, best_known_length, mod_elem, g, e; @@ -40,7 +55,7 @@ __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambda i := Size(known_elements); mod_elem := 1; best_known_length := n + 1; - while i < 25 do + while i < 25 do # 25 is a magic number. maybe investigate a good number here # no accidental identity mat if false then mode := 1; @@ -80,11 +95,14 @@ __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambda # return Concatenation([best_known_element_index, 1], FrobeniusNormalForm(best_known_element_index), [-1]); Print("only found element of length ", best_known_length, "\n"); # TODO: möglichst kurze zyklische modul basis usw.... + if best_known_length = n + 1 then + return Concatenation([Gens[1], Lambdas[1]], FrobeniusNormalForm(Gens[1]), [-1]); + fi; return Concatenation([known_elements[best_known_element_index], known_scalars[best_known_element_index]], best_known_res, [i]); # return fail; end; -# turns the jn vector into a j times n matrix +# turns the (jn) vector vec in F^{jn} and returns a F^{j times n} matrix __FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) local A, i; A := NullMat(j, n, F); @@ -95,7 +113,7 @@ __FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) return A; end; -# p is given as a list of coefficients. +# Evaluates the univariate polynomial p (given as coefficients) in the matrix g \in F^{n\times n}. frob_base = FrobeniusNormalForm(g) must be satisfied and frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]). The reason these two parameters are given, and not computed in the function itself is to not compute FrobeniusNormalForm(g) multiple times when evaluating multiple polynomials in g. __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) local ws, C, i, end_pos, j, k; ws := []; @@ -105,7 +123,7 @@ __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_ba Add(ws, __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); od; C := NullMat(n, n, F); - ConvertToMatrixRep(C, F); + #ConvertToMatrixRep(C, F); for k in [1..j] do end_pos := 0; if j = k then @@ -122,9 +140,15 @@ __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_ba od; od; ## FrobBasSpin needed? + # this mulitiplication might not be needed here + # just multiply the found basis in the end when all the condition matrices null spaces got found already (i.e. just return C here)# + # this could potentially save up to n*d*B matrix matrix multiplications so quite significant!!! definetly investigate! + ConvertToMatrixRep(C, F); return frob_base_inv * C; end; +# This computes (and returns) the matrix \mathcal{P}_{h, u} from the bachelors thesis. +# Here we have u, h \in F^{n\times n}, h_star = h^*, scalar_h = \lambda_h, g_star_inv_scaled = g^{-*}*lambda_g, frob_base = FrobeniusNormalForm(g^{-*}), frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]), frob_base_inv_star = Inverse(frob_base[2]). The reason we to give ten billion parameters is to avoid computing the same matrices multiple times. TODO: better names!!!!!! __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) local coeffs_c, coeffs_f, Ps, i, j, b_end, b_start, cpol, fpol; coeffs_c := (u * h) * frob_base_inv; @@ -153,11 +177,11 @@ __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scal return Ps; end; +# Spins the __FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) local A, j, i, k, end_pos; j := Size(frob_base_blocks); A := NullMat(n, n, F); - ConvertToMatrixRep(A, F); for i in [1..j] do if i = j then end_pos := n; @@ -169,12 +193,133 @@ __FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, A[k] := A[k - 1]*spin_elem; od; od; + ConvertToMatrixRep(A, F); return A; end; +__FORMSPACE__INTERNAL__FrobSpinAtBlock := function(Image, spin_elem, frob_base_blocks, block_index, n, F) + local A, j, i, k, end_pos; + j := Size(frob_base_blocks); + A := NullMat(n, n, F); + ConvertToMatrixRep(A, F); + if block_index = j then + end_pos := n; + else + end_pos := frob_base_blocks[block_index + 1] - 1; + fi; + A[frob_base_blocks[block_index]] := Image; + for k in [(frob_base_blocks[block_index] + 1)..end_pos] do + A[k] := A[k - 1]*spin_elem; + od; + return A; +end; + +# checks if (Form^T)^hom = c Form for some c in F and returns d such that d * Form = ((d Form)^T)^hom if possible or if not possibe fail +__FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q) + local lambda, i, j; + lambda := fail; + for i in [1..n] do + for j in [1..n] do + if Form[i][j] <> Zero(F) then + if Form[j][i] = Zero(F) then + return []; + fi; + if lambda <> fail and Form[i][j] * lambda <> hom(Form[j][i]) then + return fail; + fi; + if lambda = fail then + lambda := hom(Form[j][i]) * Inverse(Form[i][j]); + fi; + fi; + od; + od; + return RootFFE(F, Inverse(lambda), q - 1); +end; + +# find symplectic and symmetric forms this is probably terrible code. +__FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) + if Characteristic(F) mod 2 = 0 then + + fi; + +end; + +# tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION +__FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) + local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs; + if Size(Forms) = 0 then + return []; + fi; + p := Characteristic(F); + q := p^(DegreeOverPrimeField(F)/2); + + if Size(Forms) = 1 then + #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) + # 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. + # Print(ff); + l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(Forms[1], F, n, hom, p, q); + if l = fail then + return []; + fi; + + return [HermitianFormByMatrix(Forms[1] * l, F)]; + fi; + # this is where it gets interesting + # Print("ahhh this needs work!\n"); + # kind of okay case? + + ## 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 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 :( + ## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well + Base := MutableBasis(F, [NullMat(n, n, F)]); + for FF in Forms do + l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(FF, F, n, hom, p, q); + if l = fail then + tr_form := TransposedMat(FF^hom); + CloseMutableBasis(Base, FF + tr_form); + else + CloseMutableBasis(Base, l * FF); + fi; + od; + + O := []; + baseVecs := ImmutableBasis(Base); + for FF in baseVecs do + Add(O, HermitianFormByMatrix(FF, F)); + od; + + if Size(O) = Size(Forms) then + return O; + fi; + + Print("Could not find a basis of Forms. Returned hermitian Forms, Bigger space of matrices that contains all possible hermitian forms. \n"); + return [O, Forms]; +end; + +# Compute the formspace for cyclic matrix group. TODO!! +__FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n) + # maybe recoginize the trivial group here as a special case + local p, mat, outspace, i, j, w, OutForms; + + outspace := []; + for p in frob[1] do#function(p, g, frob_base, frob_base_inv, F, n) + mat := __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(p), Gen_adjoint_inv_scaled * Lambda, frob_inv_star_scaled, frob_inv_star_base_change, F, n); + Add(outspace, NullspaceMatDestructive(mat)); + od; + OutForms := []; + #(Image, spin_elem, frob_base_blocks, block_index, n, F) + + for i in [1..Size(outspace)] do + for w in outspace[i] do + Add(OutForms, frob_inv_star_base_change * __FORMSPACE__INTERNAL__FrobSpinAtBlock(w, Gen_adjoint_inv_scaled, frob[3], i, n, F)); + od; + od; + return OutForms; +end; + +# Returns formspace preserved by the group modulo Lambdas. Unitary says wheter to look for unitary forms or not. hom can be the Field Automorphism of order two. g_res = [g, Lambda_g, ## The elements of ## FrobeniusNormalForm(g)]. Where g is randomly determenied. g_inv_frob = Inverse(FrobeniusNormalForm(g)[2]). g_star_inv_scaled = g^{-*} * Lambda_g, g_star_inv_scaled_frob = FrobeniusNormalForm(g^{-*} * Lambda_g), frob_base_inv_star = Inverse(g_star_inv_scaled_frob[2]). d = Size(Gens), F is base field and n is the matrix dimension. __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) -local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; + local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; first := true; needs_checking := false; ## maybe remove? @@ -183,7 +328,7 @@ local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed break; fi; h := Gens[i]; - h_star := __FORMSPACE__INTERNAL__CalculateAdjoint(h, unitary, hom, n); + h_star := __FORMSPACE__INTERNAL__CalculateAdjoint(h, unitary, hom, n, F); for j in [1..n] do # vec := RandomVector(F, n); vec := g_res[4][j]; @@ -210,6 +355,7 @@ local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed fi; W := nspace; first := false; + # technically we still need checking here.. fi; if Size(nspace) = 1 then needs_checking := true; @@ -220,34 +366,48 @@ local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed O := []; for w in W do A := g_inv_frob * __FORMSPACE__INTERNAL__FrobSpin(__FORMSPACE__INTERNAL__VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); + ## This whole checking should be removed, it is stupid to always check!!! if needs_checking then failed_check := false; for i in [1..d] do - if not failed_check and Gens[i] * A * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n) <> Lambdas[i] * A then + if not failed_check and Gens[i] * A * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n, F) <> Lambdas[i] * A then failed_check := true; fi; od; if not failed_check then Add(O, A); + # if not unitary then + # Add(O, BilinearFormByMatrix(A, F)); + # else + # Add(O, A); + # fi; fi; fi; if not needs_checking then + # if not unitary then + # # throws errors since the forms package only accepts symmetric bilinear forms... i think this should be changed.. + # # or should i solve for symmetric matrices as a system of linear equations..? + # Add(O, BilinearFormByMatrix(A, F)); + # else + # Add(O, A); + # fi; Add(O, A); fi; od; - + # if unitary then + # return __FORMSPACE__INTERNAL__FilterUnitaryForms(O, F, n, hom); + # fi; return O; - end; +#! @Arguments G Matrix Group, Lambdas Scalars, unitary Boolean (look for unitary forms/bilinear forms) +#! @Returns The space of preserved forms modulo Lambda +#! @Description +#! Todo InstallMethod(PreservedFormspace, "for matrix group over finite field, with given scalars, and search for unitary forms", [IsMatrixGroup, IsVector and IsFFECollection, IsBool], function(G, Lambdas, unitary) - local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star; - if not IsMatrixGroup(G) then - # Print("The method only works for matrix groups. \n"); - return; - fi; + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, frob, frob_inv_star, Gen, Gen_adjoint, Gen_adjoint_inv_scaled, frob_inv_star_scaled, frob_inv_star_base_change; F := DefaultFieldOfMatrixGroup(G); p_exponent := DegreeOverPrimeField(F); if unitary and (p_exponent mod 2 <> 0) then @@ -261,13 +421,21 @@ InstallMethod(PreservedFormspace, d := Size(Gens); hom := fail; - if d = 1 then - # Todo.... !! - fi; if unitary then hom := FrobeniusAutomorphism(F)^(p_exponent/2); fi; + + if d = 1 then + Gen := Gens[1]; + Gen_adjoint := __FORMSPACE__INTERNAL__CalculateAdjoint(Gen, unitary, hom, n, F); + Gen_adjoint_inv_scaled := Lambda[1]*Inverse(Gen_adjoint); + frob := FrobeniusNormalForm(Gen); + frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); + frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); + + return __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, Lambda[1], unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n); + fi; #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); g_inv_frob := Inverse(g_res[4]); @@ -285,11 +453,15 @@ InstallMethod(PreservedFormspace, end ); +#! @Arguments G Matrix Group +#! @Returns The space of preserved forms (does assume all scalars = 1) (both unitary and bilinear) +#! @Description +#! Todo InstallMethod(PreservedFormspace, "for matrix group (finds bilinear/unitary forms modulo 1)", [IsMatrixGroup], function(G) - local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, Lambdas, Out, i; + local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, Lambdas, Out, i, Gen, Gen_adjoint, Gen_adjoint_inv_scaled, frob, frob_inv_star_scaled, frob_inv_star_base_change; Out := []; F := DefaultFieldOfMatrixGroup(G); p_exponent := DegreeOverPrimeField(F); @@ -302,13 +474,33 @@ InstallMethod(PreservedFormspace, if d = 1 then # Todo.... !! + Gen := Gens[1]; + Gen_adjoint := __FORMSPACE__INTERNAL__CalculateAdjoint(Gen, false, fail, n, F); + Gen_adjoint_inv_scaled := One(F)*Inverse(Gen_adjoint); # scaling happens here!! + frob := FrobeniusNormalForm(Gen); + frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); + frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); + + Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), false, fail, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n)); + + if p_exponent mod 2 = 0 then + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + Gen_adjoint_inv_scaled := Gen_adjoint_inv_scaled^hom; + frob_inv_star_base_change := frob_inv_star_base_change^hom; + frob_inv_star_scaled[2] := frob_inv_star_scaled[2]^hom; + + Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), true, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n)); + else + Add(Out, []); + fi; + return Out; fi; - #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute Lambdas := []; for i in [1..d] do Add(Lambdas, One(F)); od; + #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); ConvertToMatrixRep(g_res[1], F); ConvertToMatrixRep(g_res[4], F); @@ -322,11 +514,14 @@ InstallMethod(PreservedFormspace, Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); if p_exponent mod 2 = 0 then + # is ^hom actually cheaper than computing the frobenius normal form?? investigate! certainly makes the code ugly... oh well hom := FrobeniusAutomorphism(F)^(p_exponent/2); g_star_inv_unscaled := g_star_inv_unscaled^hom; g_star_inv_scaled_frob[2] := g_star_inv_scaled_frob[2]^hom; frob_base_inv_star := frob_base_inv_star^hom; Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + else + Add(Out, []); fi; return Out; end diff --git a/lib/recognition_new.gi b/lib/recognition_new.gi index 5fb035e..f209137 100644 --- a/lib/recognition_new.gi +++ b/lib/recognition_new.gi @@ -355,7 +355,7 @@ InstallMethod( PreservedFormsOp, [ IsMatrixGroup ], #Is this really necessary? Can we not simply delete it? if not MTX.IsIrreducible(module) then #Error("Currently the use of MeatAxe requires the module to be absolutely irreducible"); - Info( InfoForms, 1, "group is not irreducible and therefore it does not preserve non-degenerate forms\n" ); + Info( InfoForms, 1, "group is not irreducible and therefore it does not preserve non-degenerate forms\n" ); #this is wrong. Reducible groups can preserve non-degenerate forms. For example the trivial group G = <1> is reducible and preserves any form. return []; fi; diff --git a/makedoc.g b/makedoc.g index 0cacfde..a2ad7f5 100644 --- a/makedoc.g +++ b/makedoc.g @@ -14,6 +14,7 @@ fi; AutoDoc(rec( scaffold := rec( MainPage := false ), gapdoc := rec( main := "forms.xml" ), + autodoc := true, )); QUIT; diff --git a/read.g b/read.g index abe27b6..703598f 100644 --- a/read.g +++ b/read.g @@ -16,3 +16,4 @@ ReadPackage("forms", "lib/forms.gi"); ReadPackage("forms", "lib/recognition.gi"); ReadPackage("forms", "lib/classic.gi"); ReadPackage("forms", "lib/recognition_new.gi"); +ReadPackage("forms", "lib/formspace.gi"); diff --git a/tst/formspace/poly_eval_test.g b/tst/formspace/poly_eval_test.g new file mode 100644 index 0000000..cc42dbd --- /dev/null +++ b/tst/formspace/poly_eval_test.g @@ -0,0 +1,54 @@ +RandomVector:=function(F, n) + local randvec, i; + randvec := EmptyPlist(n); + for i in [1..n] do + randvec[i] := PseudoRandom(F); + od; + return randvec; +end; + +RandomMatrix := function(n, F) + local M, i, j; + while true do + # M := ZeroMatrix(F, n, n); + M := NullMat(n, n, F); + for i in [1..n] do + for j in [1..n] do + M[i][j] := PseudoRandom(F); + od; + od; + ConvertToMatrixRep(M, F); + return M; + od; +end; + +TestPolyEval := function(benchmark) + local iters, n, F, mat, coeffs, f, frob, eval, i, time_start, time_average_frob, time_average_normal, normal_eval; + iters := 50; + time_average_frob := 0; + time_average_normal := 0; + for i in [1..iters] do + n := PseudoRandom([1..200]); + F := GF(PseudoRandom([2, 3, 5])^(PseudoRandom([1, 2, 3]))); + mat := RandomMatrix(n, F); + coeffs := RandomVector(F, PseudoRandom([0..300])); + f := UnivariatePolynomial(F, coeffs); + time_start := NanosecondsSinceEpoch(); + frob := FrobeniusNormalForm(mat); + eval := __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs, Matrix(mat), frob, Inverse(frob[2]), F, n); + time_average_frob := time_average_frob + (NanosecondsSinceEpoch() - time_start); + + time_start := NanosecondsSinceEpoch(); + normal_eval := f(mat); + time_average_normal := time_average_normal + (NanosecondsSinceEpoch() - time_start); + if eval <> normal_eval then + Error("Polynomial: ", f, " Matrix: ", mat, " Frobenius Normal Form: ", frob, "\n"); + fi; + od; + time_average_frob := Float(time_average_frob) / Float((iters * 1000000)); # convert to ms + time_average_normal := Float(time_average_normal) / Float((iters * 1000000)); + if benchmark then + Print("Frob: ", time_average_frob, " Normal: ", time_average_normal, "\n"); + fi; + return "Ok"; +end; \ No newline at end of file diff --git a/tst/formspace/test_poly_eval.tst b/tst/formspace/test_poly_eval.tst new file mode 100644 index 0000000..76b182e --- /dev/null +++ b/tst/formspace/test_poly_eval.tst @@ -0,0 +1,4 @@ +gap> START_TEST("Formspace: Poly Eval with Frobenius Normal Form"); +gap> TestPolyEval(false); # false to specify that we are not benchmarking.. +"Ok" +gap> STOP_TEST("Formspace: Poly Eval with Frobenius Normal Form"); diff --git a/tst/testall.g b/tst/testall.g index 8667153..661d900 100644 --- a/tst/testall.g +++ b/tst/testall.g @@ -6,6 +6,8 @@ if not IsBound(DescribesInvariantQuadraticForm) then Add( exclude, "adv/classic.tst" ); fi; +ReadPackage("forms", "tst/formspace/poly_eval_test.g"); + TestDirectory(DirectoriesPackageLibrary("forms", "tst"), rec( exitGAP := true, From 501bceaf063600a304606707dbb2d09d5ddca113 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Tue, 9 Dec 2025 14:35:16 +0100 Subject: [PATCH 03/21] deleted old file --- read_temp.g | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 read_temp.g diff --git a/read_temp.g b/read_temp.g deleted file mode 100644 index 8ac2f97..0000000 --- a/read_temp.g +++ /dev/null @@ -1,27 +0,0 @@ -############################################################################# -## -## read.g Forms package -## John Bamberg -## Jan De Beule -## -## Copyright 2015, The University of Western Austalia -## Copyright 2015, Ghent University -## Copyright 2015, Vrije Universiteit Brussel -## -## Reading the implementation part of the Desargues package. -## -############################################################################# - -LoadPackage("nofoma"); -# Read("form_rec.g"); - -Read("lib/forms.gd"); -Read("lib/recognition.gd"); -Read("lib/forms.gi"); -Read("lib/recognition.gi"); -Read("lib/classic.gi"); -Read("lib/recognition_new.gi"); -Read("lib/formspace.gd"); -Read("lib/formspace.gi"); - -Read("intersting_groups.g"); \ No newline at end of file From a5e44da6ab09b02f03bc863544878f2d16c70804 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Tue, 9 Dec 2025 16:25:12 +0100 Subject: [PATCH 04/21] added more documentation, renamed file, --- doc/forms.fdb_latexmk | 155 ++++++++++ doc/forms.fls | 295 ++++++++++++++++++++ doc/forms.xml | 2 +- intersting_groups.g => interesting_groups.g | 0 lib/formspace.gi | 51 ++-- makedoc.g | 2 +- 6 files changed, 479 insertions(+), 26 deletions(-) create mode 100644 doc/forms.fdb_latexmk create mode 100644 doc/forms.fls rename intersting_groups.g => interesting_groups.g (100%) diff --git a/doc/forms.fdb_latexmk b/doc/forms.fdb_latexmk new file mode 100644 index 0000000..441f5af --- /dev/null +++ b/doc/forms.fdb_latexmk @@ -0,0 +1,155 @@ +# Fdb version 4 +["bibtex forms"] 1765202050.69469 "forms.aux" "forms.bbl" "forms" 1765202050.90178 2 + "./forms.bib" 1761741498.47844 2393 6df7f12e20895f946dc65a09d29ae696 "" + "/usr/local/texlive/2024/texmf-dist/bibtex/bst/base/alpha.bst" 1292289607 23907 a5f93555796fb564b924339521f10a7c "" + "forms.aux" 1765202050.83191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + (generated) + "forms.bbl" + "forms.blg" + (rewritten before read) +["makeindex forms.idx"] 1765202050.49548 "forms.idx" "forms.ind" "forms" 1765202050.89851 0 + "forms.idx" 1765202050.65191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + (generated) + "forms.ilg" + "forms.ind" + (rewritten before read) +["pdflatex"] 1765202048.75552 "/home/peter/BA/forms-pkg/forms/doc/forms.tex" "forms.pdf" "forms" 1765202050.89879 0 + "/home/peter/BA/forms-pkg/forms/doc/forms.tex" 1765202047.83191 150901 1d8e9e906ffab0953d2497743708af55 "" + "/usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab "" + "/usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc" 1136849721 2971 def0b6c1f0b107b3b936def894055589 "" + "/usr/local/texlive/2024/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8r.tfm" 1136768653 4712 9ef4d7d106579d4b136e1529e1a4533c "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm" 1136768653 7040 b2bd27e2bfe6f6948cbc3239cae7444f "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm" 1136768653 1408 5937f58aa508ea2cea4901c07d10f5fe "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm" 1136768653 1544 23a042a74981a3e4b6ce2e350e390409 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm" 1136768653 2172 fd0c924230362ff848a33632ed45dc23 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm" 1136768653 4524 6bce29db5bc272ba5f332261583fee9c "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm" 1136768653 6880 f19b8995b61c334d78fc734065f6b4d4 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm" 1136768653 1352 fa28a7e6d323c65ce7d13d5342ff6be2 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm" 1136768653 4408 25b74d011a4c66b7f212c0cc3c90061b "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm" 1136768653 6672 e3ab9e37e925f3045c9005e6d1473d56 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmrc8t.tfm" 1136768653 16648 7e91c60ebf91b9c60e16ef52b3070f9c "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm" 1136768653 2288 f478fc8fed18759effb59f3dad7f3084 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm" 1136768653 4640 532ca3305aad10cc01d769f3f91f1029 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm" 1136768653 6944 94c55ad86e6ea2826f78ba2240d50df9 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8r.tfm" 1136768653 4548 f370a182a02c40d95c5554802dc0f174 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm" 1136768653 6792 47ec25d9cde9feef87a90c47a9fbc4d5 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm" 1136768653 2232 db256afffc8202da192b4641df14d602 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm" 1136768653 2172 1d00c2a0d10f23031be62329457a870c "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm" 1136768653 1032 20febbd0f0c9a48eb78616f897008286 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm" 1136768653 1520 ad7b3c1a480a03b3e41b5fbb13d938f2 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecit1095.tfm" 1136768653 1536 bf65fdffa21a3aa11d43ef2786a93442 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecst1095.tfm" 1136768653 1536 31c32aa0109a9aa82e54137f7be41f6c "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectc1095.tfm" 1136768653 1536 cccb8b9b6c0a5257696004439c0d7d95 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1000.tfm" 1136768653 1536 06717a2b50de47d4087ac0e6cd759455 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1095.tfm" 1136768653 1536 a988bfe554c1f79514bd46d13c3c64ce "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm" 1136768653 1528 abec98dbc43e172678c11b3b9031252a "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm" 1136768653 1296 45809c5a464d5f32c8f98ba97c1bb47f "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm" 1229303445 688 37338d6ab346c2f1466b29e195316aa4 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb" 1248133631 30251 6afa5cb1d0204815a708a080681d4674 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb" 1215737283 162237 5a140a750812280b19b4bd0d60e3da8e "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfst1095.pfb" 1215737283 160886 e7cc7d55761bbb7edc62829b16cfc7a8 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftc1095.pfb" 1215737283 141588 76d69251545f98f0ced3b73c2788cd96 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1000.pfb" 1215737283 169201 9ebf99020dde51a5086e186761a34e8f "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb" 1215737283 169670 48d12e69c9a3b23c81f6d703ccbd4554 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb" 1136849748 44648 23115b2a545ebfe2c526c3ca99db8b95 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/symbol/usyr.pfb" 1136849748 33709 b09d2e140b7e807d3a97058263ab6693 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmb8a.pfb" 1136849748 44729 811d6c62865936705a31c797a1d5dada "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb" 1136849748 46026 6dab18b61c907687b520c72847215a68 "" + "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmri8a.pfb" 1136849748 45458 a3faba884469519614ca56ba5f6b1de1 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/helvetic/phvr8t.vf" 1136768653 2344 44ff28c9ef2fc97180cd884f900fee71 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf" 1136768653 2340 df9c920cc5688ebbf16a93f45ce7bdd3 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf" 1136768653 3556 8a9a6dcbcd146ef985683f677f4758a6 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf" 1136768653 2348 91706c542228501c410c266421fbe30c "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmrc8t.vf" 1136768653 3608 78e4c999d9e69f03f448158d01821741 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf" 1136768653 2328 6cd7df782b09b29cfc4d93e55b6b9a59 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmro8t.vf" 1136768653 2356 c62a9e3d92ec3ebab0f81e654c0829a1 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf" 1136768653 1132 27520247d3fe18d4266a226b461885c2 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf" 1136768653 1108 d271d6f9de4122c3f8d3b65666167fac "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7v.vf" 1136768653 1012 046369ac6a83af997c3aa05a43256ad5 "" + "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf" 1136768653 964 5673178ff30617b900214de28ab32b38 "" + "/usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty" 1644112042 7237 bdd120a32c8fdb4b433cf9ca2e7cd98a "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1701727651 17865 1a9bd36b4f98178fa551aca822290953 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty" 1575152242 21514 b7557edcee22835ef6b03ede1802dad4 "" + "/usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1717359999 2963 e56732bbb93cfa019febfd0c7eaf1d21 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1717359999 2378 05fbb4f2b23b0e142f8cd3440c37e72e "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty" 1717359999 5275 b64d8404d74d2860b9c6558239dd0784 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty" 1717359999 5048 7ebf0f2edf1ef6783e8fe2201a95d0e8 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty" 1705352648 1939 3225e20a81cec31e51c1e216d6385103 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls" 1717359999 23203 02a38c89d2f3aef55ce8b1288a372bbb "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo" 1717359999 8464 6b4d01be31907866396cf4ac23881d2d "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd" 1705352648 2443 790016d75def8d3127df5c216a45abcc "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty" 1717359999 2846 50113a9b2387b6447504672739a4a25b "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty" 1561238569 51697 f8f08183cd2080d9d18a41432d651dfb "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1601931149 46845 3b58f70c6e861a13d927bff09d35ecbc "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty" 1705955721 43712 c3d93734f3bc56e03c21b3dc69268d3c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def" 1713382759 19440 9da9dcbb27470349a580fca7372d454b "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty" 1717359999 7233 b3e7845a2bdbf185cb9b9798e7df4dc4 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty" 1717359999 2671 70891d50dac933918b827d326687c6e8 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1667332637 2885 9c645d672ae17285bba324998918efd8 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty" 1705871765 14055 c38f88a3b3682869125143ef481d88f3 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def" 1720644236 48154 c55ef1b9fe7eb198bd7ba0e01cbf5189 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty" 1720644236 220493 bbff330ab3155b3f5df1de2445e80c9f "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty" 1705871765 11026 182c63f139a71afd30a28e5f1ed2cd1c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def" 1720644236 14249 4eb911d2c8c7a7c4cb846c83cb2cc309 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def" 1720644236 117112 df92f59263f7368ce05087964c585de5 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1655478651 22555 6d8e155cfef6d82c3d5c742fea7c992e "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1665067230 13815 760b0c02f691ea230f5359c4e1de23a7 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1716410060 29785 9f93ab201fe5dd053afcc6c1bcf7d266 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty" 1586716065 1499 de0ad166b701b820e03588a29bb30798 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty" 1586716065 4631 6e41de2b7a83dfa5d2c4b0a2fe01f046 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd" 1137110629 411 12564a37a279e4e0b533cdf5e03eeb7c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd" 1137110629 348 f4ce75d394e7d9ac12ca7aac4045ed77 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd" 1137110629 329 c8cddcc90b6f567b28408eb374773c9c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd" 1137110629 961 15056f4a61917ceed3a44e4ac11fcc52 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd" 1137110629 329 aee7226812ba4138ac67a018466b488d "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd" 1586716065 1483 47067fbe7c3ffed1ede7aaa7b8549d7a "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd" 1137110629 774 61d7da1e9f9e74989b196d147e623736 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd" 1137110629 619 96f56dc5d1ef1fe1121f1cfeec70ee0c "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1657483315 9714 ba3194bd52c8499b3f1e3eb91d409670 "" + "/usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/local/texlive/2024/texmf-dist/web2c/texmf.cnf" 1719785820 42007 0b741a3c21a5ca32b40e3846e75b3548 "" + "/usr/local/texlive/2024/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1726064662 5498206 6c0f03cb370063b7ddbd563e5f9ce23a "" + "/usr/local/texlive/2024/texmf-var/web2c/pdftex/pdflatex.fmt" 1726064801 3326093 ffa583039ecb32896d937cb909ab926e "" + "/usr/local/texlive/2024/texmf.cnf" 1726064657.46038 455 5b996dcaa0eb4ef14a83b026bc0a008c "" + "forms.aux" 1765202050.83191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + "forms.bbl" 1765202050.88191 0 d41d8cd98f00b204e9800998ecf8427e "bibtex forms" + "forms.ind" 1765202050.68191 0 d41d8cd98f00b204e9800998ecf8427e "makeindex forms.idx" + "forms.out" 1765202050.85191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + "forms.tex" 1765202047.83191 150901 1d8e9e906ffab0953d2497743708af55 "" + "forms.toc" 1765202050.11191 9035 1035c02923f0f40ca577d4540a04a69d "pdflatex" + (generated) + "forms.aux" + "forms.idx" + "forms.log" + "forms.out" + "forms.pdf" + "forms.pnr" + "forms.toc" + (rewritten before read) diff --git a/doc/forms.fls b/doc/forms.fls new file mode 100644 index 0000000..4f602b0 --- /dev/null +++ b/doc/forms.fls @@ -0,0 +1,295 @@ +PWD /home/peter/BA/forms-pkg/forms/doc +INPUT /usr/local/texlive/2024/texmf.cnf +INPUT /usr/local/texlive/2024/texmf-dist/web2c/texmf.cnf +INPUT /usr/local/texlive/2024/texmf-var/web2c/pdftex/pdflatex.fmt +INPUT /home/peter/BA/forms-pkg/forms/doc/forms.tex +OUTPUT forms.log +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/local/texlive/2024/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty +OUTPUT forms.idx +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def +OUTPUT forms.pnr +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT ./forms.aux +INPUT ./forms.aux +INPUT forms.aux +OUTPUT forms.aux +INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +OUTPUT forms.out +OUTPUT forms.pdf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1000.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-var/fonts/map/pdftex/updmap/pdftex.map +INPUT /usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/base/8r.enc +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmro8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf +OUTPUT forms.toc +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1095.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/helvetic/phvr8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmrc8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecit1095.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmrc8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectc1095.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecst1095.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7v.vf +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm +INPUT ./forms.bbl +INPUT ./forms.bbl +INPUT forms.bbl +INPUT forms.aux +INPUT ./forms.out +INPUT ./forms.out +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfst1095.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftc1095.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1000.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/symbol/usyr.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmb8a.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb +INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmri8a.pfb diff --git a/doc/forms.xml b/doc/forms.xml index 96bb09e..ee31f10 100644 --- a/doc/forms.xml +++ b/doc/forms.xml @@ -41,7 +41,7 @@ <#Include SYSTEM "theory.xml"> <#Include SYSTEM "construct_basic.xml"> <#Include SYSTEM "morphisms.xml"> -<#Include SYSTEM "_Chapter_TODO.xml"> +<#Include SYSTEM "_Chapter_Formspace.xml"> diff --git a/intersting_groups.g b/interesting_groups.g similarity index 100% rename from intersting_groups.g rename to interesting_groups.g diff --git a/lib/formspace.gi b/lib/formspace.gi index 9854f91..ce1d483 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -1,9 +1,8 @@ #! @Chapter Formspace -#! Computes The Formspace -#! @Section TODO -#! .... test - - +#! For a matrix Group $G$ consisting of $n\times n$ matrices over the field $K$. Let $\Lambda : G \to K^\times $ be a group homomorphism. Suppose $h : K \to K$ is a field automorphism of $K$. For $g\in G$ we define $g^* := h(g^T)$ where the automorphism $h$ is applied entrywise. +#! We define the Formspace $\mathcal{F}_h(G, \Lambda) := \{A\in K^{n\times n} \mid gAg^* = \Lambda(g)A \forall g\in G\}$. +#! @Section Computing the Formspace +#! For details on how the form space is computed SEE: somewhere that does not exist yet # underlying field F, g is in F^{n\times n}, v is in F^n, coeffs are the coefficients of a polynomial p in F[X]. Returns vp(g). __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) @@ -90,16 +89,12 @@ __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambda Add(known_scalars, cur_scalar); i := i + 1; od; - ## This fixes all the issues for some ungodly reason!!! why :( - # best_known_element_index := PseudoRandom(Group(Gens)); - # return Concatenation([best_known_element_index, 1], FrobeniusNormalForm(best_known_element_index), [-1]); - Print("only found element of length ", best_known_length, "\n"); + # Print("only found element of length ", best_known_length, "\n"); # TODO: möglichst kurze zyklische modul basis usw.... if best_known_length = n + 1 then return Concatenation([Gens[1], Lambdas[1]], FrobeniusNormalForm(Gens[1]), [-1]); fi; return Concatenation([known_elements[best_known_element_index], known_scalars[best_known_element_index]], best_known_res, [i]); - # return fail; end; # turns the (jn) vector vec in F^{jn} and returns a F^{j times n} matrix @@ -114,7 +109,7 @@ __FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) end; # Evaluates the univariate polynomial p (given as coefficients) in the matrix g \in F^{n\times n}. frob_base = FrobeniusNormalForm(g) must be satisfied and frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]). The reason these two parameters are given, and not computed in the function itself is to not compute FrobeniusNormalForm(g) multiple times when evaluating multiple polynomials in g. -__FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) +__FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) # frob_base_inv useless, right now this is not actually evaluating the polynomial frob_base_inv missing local ws, C, i, end_pos, j, k; ws := []; j := Size(frob_base[3]); @@ -144,7 +139,9 @@ __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_ba # just multiply the found basis in the end when all the condition matrices null spaces got found already (i.e. just return C here)# # this could potentially save up to n*d*B matrix matrix multiplications so quite significant!!! definetly investigate! ConvertToMatrixRep(C, F); - return frob_base_inv * C; + return frob_base_inv * C; #to actually evaluate the polynomial + + # return frob_base_inv * C; end; # This computes (and returns) the matrix \mathcal{P}_{h, u} from the bachelors thesis. @@ -177,7 +174,7 @@ __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scal return Ps; end; -# Spins the +# Spins the stuff __FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) local A, j, i, k, end_pos; j := Size(frob_base_blocks); @@ -236,15 +233,13 @@ __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q return RootFFE(F, Inverse(lambda), q - 1); end; -# find symplectic and symmetric forms this is probably terrible code. +# find symplectic and symmetric forms __FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) - if Characteristic(F) mod 2 = 0 then - - fi; - + # TODO end; # tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION +# there must be a better way to compute these matrices.. __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs; if Size(Forms) = 0 then @@ -268,6 +263,8 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) # Print("ahhh this needs work!\n"); # kind of okay case? + ## TODO proof if gAg^* = cA for some c it must hold that c \in GF(q) (not in GF(q^2)) + ## 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 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 :( ## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well Base := MutableBasis(F, [NullMat(n, n, F)]); @@ -364,6 +361,8 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom od; od; O := []; + # W := frob_base_inv_star * W; + # Print(WWW); for w in W do A := g_inv_frob * __FORMSPACE__INTERNAL__FrobSpin(__FORMSPACE__INTERNAL__VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); ## This whole checking should be removed, it is stupid to always check!!! @@ -400,10 +399,13 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom return O; end; -#! @Arguments G Matrix Group, Lambdas Scalars, unitary Boolean (look for unitary forms/bilinear forms) -#! @Returns The space of preserved forms modulo Lambda +#! @Arguments G, L, unitary +#! @Returns a basis of $\mathcal{F}_h(G, \Lambda)$ #! @Description -#! Todo +#! G is a finitely generated matrix group over a finite field $K$. +#! L is a list of scalars corresponding to the group generators. I.e. $\Lambda(G_i)$ = L[i] for $i = 1, \dots, $Size(GeneratorsOfGroup(G)). +#! If unitary is true, the function uses $h(x) = x$ for all $x \in K$. +#! If unitary is false, the function tries to use a field automorphism of order two for $h$ or will report failure if no such field automorphism exists. InstallMethod(PreservedFormspace, "for matrix group over finite field, with given scalars, and search for unitary forms", [IsMatrixGroup, IsVector and IsFFECollection, IsBool], function(G, Lambdas, unitary) @@ -453,10 +455,11 @@ InstallMethod(PreservedFormspace, end ); -#! @Arguments G Matrix Group -#! @Returns The space of preserved forms (does assume all scalars = 1) (both unitary and bilinear) +#! @Arguments G, +#! @Returns a basis of $\mathcal{F}_{id}(G, \Lambda_1)$ and $\mathcal{F}_h(G, \Lambda_1)$ #! @Description -#! Todo +#! G is a finitely generated Matrix group over a finite field $K$. +#! Here $\Lambda_1(g) := 1$ for all $g\in G$ and $id(x) := x$ for all $x \in K$. Furthermore $h$ is a field automorphism of order two, admitted by $h$. If no such field automorphism exists, the second returned basis is empty. InstallMethod(PreservedFormspace, "for matrix group (finds bilinear/unitary forms modulo 1)", [IsMatrixGroup], diff --git a/makedoc.g b/makedoc.g index a2ad7f5..712dc6b 100644 --- a/makedoc.g +++ b/makedoc.g @@ -13,7 +13,7 @@ if fail = LoadPackage("AutoDoc", ">= 2019.04.10") then fi; AutoDoc(rec( scaffold := rec( MainPage := false ), - gapdoc := rec( main := "forms.xml" ), + gapdoc := rec( main := "forms.xml",), autodoc := true, )); QUIT; From 6115c49e9b2b9b9985d3fc1479f3a66359912f71 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Tue, 9 Dec 2025 16:26:55 +0100 Subject: [PATCH 05/21] moved file intersting_groups.g into tst folder TODO: write tests with these groups --- form_rec.g | 452 ------------------ .../interesting_groups.g | 0 2 files changed, 452 deletions(-) delete mode 100644 form_rec.g rename interesting_groups.g => tst/interesting_groups.g (100%) diff --git a/form_rec.g b/form_rec.g deleted file mode 100644 index ac9cc4d..0000000 --- a/form_rec.g +++ /dev/null @@ -1,452 +0,0 @@ -#Print("Dont forget to load M. Gecks NoFoMa Package!\n"); - -# IN -# g : Zyklische Matrix -# v : Vektor der zyklisch ist -# OUT -# Basis (v gv g^2v ... g^(n-1)v) -Spin := function(g, v) - local B, n, i; - n := DimensionsMat(g)[1]; - B := NullMat(n, n, Zero(Field(v[1]))); - B[1] := v; - - for i in [2..n] do - v := v*g; - B[i] := v; - od; - # return CMat(B); - ConvertToMatrixRep(B, DefaultFieldOfMatrix(B)); - return B; -end; - -RandomVector:=function(F, n) - local randvec, i; - randvec := EmptyPlist(n); - for i in [1..n] do - randvec[i] := PseudoRandom(F); - od; - return randvec; -end; -## TODO use predefined func!! -ZeroVectorFunc:=function(F, n) - local i, v; - v := EmptyPlist(n); - for i in [1..n] do - v[i] := Zero(F); - od; - return v; -end; - -IsZeroVec := function(v) - local i; - for i in [1..Length(v)] do - if not IsZero(v[i]) then - return false; - fi; - od; - return true; -end; - -EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) - local res, i, deg; - deg := Size(coeffs); - if deg = 0 then - return ZeroVector(F, n); - fi; - if deg = 1 then - return v * coeffs[1]; - fi; - - res := v * g * coeffs[deg]; - for i in [1..deg-2] do - res := res + coeffs[deg - i]*v; - res := res * g; - od; - res := res + coeffs[1]*v; - return res; -end; - -# mode = False \iff mat* := mat^tr, mode = True \iff mat* = komplex_konjugiert(mat^tr) -CalculateAdjoint := function(mat, mode, hom, n) - local transposed, i, j; - transposed := TransposedMat(mat); - if mode = false then - return transposed; - fi; - if mode then - return transposed^hom; - fi; - return fail; -end; - -# follows forms package recognition.gi (See : https://github.com/gap-packages/forms/blob/master/lib/recognition_new.gi) -# the reason for own implementation is to reuse the minpol computation (maybe just ignore this and use the one from forms package anyways???) -CalculateLambdas := function(F, n, g, g_star_inv, mode, hom) - local t, t_star_inv, p, p_deg, cyc, I, as, gcd_rep, l, a; - t := Trace(g); - t_star_inv := Trace(g_star_inv); - cyc := fail; - if t = Zero(F) and t_star_inv <> Zero(F) then - return fail; - fi; - if t <> Zero(F) and t_star_inv = Zero(F) then - return fail; - fi; - if t <> Zero(F) and t_star_inv <> Zero(F) then - # TODO - return [t * Inverse(t_star_inv), fail]; - fi; - # diser ganze ansatz hat den nachteil, das die suche nach dem minimalpolynom eigentlich einen zyklischen vektor liefert. Am besten geben wir diesen zurück statt true/false/fail. Dafür müsste aber die methode für das minpol angepasst werden. - p := MinimalPolynomial(g); - - # the reasom - p_deg := Degree(p); - as := CoefficientsOfUnivariatePolynomial(p); - I := Filtered([0..p_deg], x -> as[x+1] <> Zero(F)); - - # muss symmetrisch sein, sonst wird keine non-deg form invariant gelassen. - if ForAny(I, x -> not (p_deg-x) in I) then - return fail; - fi; - - gcd_rep := GcdRepresentation(I); - - if mode = false then - l:=List([1..Length(I)-1], x ->((as[1])*as[p_deg-I[x]+1]/(as[I[x]+1]))); - else - l:=List([1..Length(I)-1], x ->((as[1]^hom)*as[p_deg-I[x]+1]/(as[I[x]+1]^hom))); - fi; - # todo a is not guranateed to be Lambdas here, only Lambdas^gcd = a! - a:= Product([1..Length(I)-1], x->l[x]^gcd_rep[x]); - - if Degree(p) = n then - cyc := true; - else - cyc := false; - fi; - #TODO komplizierte analyse um Lambdas zu finden.. - return [a, cyc]; -end; - -RandomMatrixInvertible := function(n, q) - local F, M, i, j; - F := GF(q); - while true do - # M := ZeroMatrix(F, n, n); - M := NullMat(n, n, F); - for i in [1..n] do - for j in [1..n] do - M[i][j] := PseudoRandom(F); - od; - od; - ConvertToMatrixRep(M, F); - if RankMat(M) = n then - return M; - fi; - od; -end; - -##### --------- uses functions from Geck "nofoma" package - -# Avoids the use of PseudoRandomElement(G), since it is slow and the actual "randomness" is irrelevant. -#returns g cyclic, scalar that belongs to g, -# has some issues!!!!!!! TODO FIX ME -FindCyclicGroupElementAndScalars := function(Gens, Lambdas) - local cur_group_element, cur_scalar, known_elements, i, mode, n, res, j, known_scalars, best_known_element_index, best_known_res, best_known_length, mod_elem, g, e; - - known_elements := ShallowCopy(Gens); - known_scalars := ShallowCopy(Lambdas); - - n := DimensionsMat(Gens[1])[1]; - i := Size(known_elements); - mod_elem := 1; - best_known_length := n + 1; - while i < 25 do - # no accidental identity mat - if false then - mode := 1; - else - mode := PseudoRandom([1, 2]); - fi; - j := PseudoRandom([1..Size(known_elements)]); - cur_group_element := known_elements[j]; - cur_scalar := known_scalars[j]; - - if mode = 1 then - j := PseudoRandom([1..Size(known_elements)]); - cur_group_element := cur_group_element * known_elements[j]; - cur_scalar := cur_scalar * known_scalars[j]; - elif mode = 2 then - j := PseudoRandom([1..Size(known_elements)]); - cur_group_element := cur_group_element * Inverse(known_elements[j]); - cur_scalar := cur_scalar * Inverse(known_scalars[j]); - fi; - if i mod mod_elem = 0 then - res := FrobeniusNormalForm(cur_group_element); - if Size(res[3]) = 1 then - return Concatenation([cur_group_element, cur_scalar], res, [i]); - fi; - if Size(res[3]) <= best_known_length and not (cur_group_element in Gens) then - best_known_element_index := i + 1; - best_known_res := res; - best_known_length := Size(res[3]); - fi; - fi; - Add(known_elements, cur_group_element); - Add(known_scalars, cur_scalar); - i := i + 1; - od; - ## This fixes all the issues for some ungodly reason!!! why :( - # best_known_element_index := PseudoRandom(Group(Gens)); - # return Concatenation([best_known_element_index, 1], FrobeniusNormalForm(best_known_element_index), [-1]); - Print("only found element of length ", best_known_length, "\n"); - # TODO: möglichst kurze zyklische modul basis usw.... - return Concatenation([known_elements[best_known_element_index], known_scalars[best_known_element_index]], best_known_res, [i]); - # return fail; -end; - -# turns the jn vector into a j times n matrix -VectorReorganize := function(vec, j, F, n) - local A, i; - A := NullMat(j, n, F); - ConvertToMatrixRep(A, F); - for i in [1..j] do - A[i] := vec{[((i - 1) * n + 1)..(i*n)]}; - od; - return A; -end; - -# p is given as a list of coefficients. -EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) - local ws, C, i, end_pos, j, k; - ws := []; - j := Size(frob_base[3]); - for k in [1..j] do - # function(F, n, g, v, coeffs) - Add(ws, EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); - od; - C := NullMat(n, n, F); - ConvertToMatrixRep(C, F); - for k in [1..j] do - end_pos := 0; - if j = k then - end_pos := n; - else - end_pos := frob_base[3][k + 1]; - fi; - for i in [0..(end_pos - frob_base[3][k])] do - if i = 0 then - C[frob_base[3][k] + i] := ws[k]; - else - C[frob_base[3][k] + i] := C[frob_base[3][k] + i - 1]*g; - fi; - od; - od; - ## FrobBasSpin needed? - return frob_base_inv * C; -end; - -ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) - local coeffs_c, coeffs_f, Ps, i, j, b_end, b_start, cpol, fpol; - coeffs_c := (u * h) * frob_base_inv; - coeffs_f := (u * frob_base_inv) * scalar_h; - # Display(coeffs_c); - j := Size(frob_base[3]); - Ps := NullMat(n * j, n, F); - ConvertToMatrixRep(Ps, F); - # Print(frob_base[3], "\n"); - for i in [1..j] do - if i = j then - b_end := n; - else - b_end := frob_base[3][i + 1] - 1; - fi; - # Print("[", ((i - 1)*n + 1), ",", (i*n), "\n"); - #Print("->", frob_base[3][i],",",b_end, "\n"); - Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := - EvaluatePolynomialWithFrobenius(coeffs_c{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n) * h_star - EvaluatePolynomialWithFrobenius(coeffs_f{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n); - # cpol := UnivariatePolynomial(F, coeffs_c); - # fpol := UnivariatePolynomial(F, coeffs_f); - # Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := - # cpol(g_star_inv_scaled) * h_star - fpol(g_star_inv_scaled); - # Print(aua); - od; - return Ps; -end; - -FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) - local A, j, i, k, end_pos; - j := Size(frob_base_blocks); - A := NullMat(n, n, F); - ConvertToMatrixRep(A, F); - for i in [1..j] do - if i = j then - end_pos := n; - else - end_pos := frob_base_blocks[i + 1] - 1; - fi; - A[frob_base_blocks[i]] := Images[i]; - for k in [(frob_base_blocks[i] + 1)..end_pos] do - A[k] := A[k - 1]*spin_elem; - od; - od; - return A; -end; - -FindFormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) - local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; - first := true; - needs_checking := false; ## maybe remove? - - for i in [1..d] do - if needs_checking then - break; - fi; - h := Gens[i]; - h_star := CalculateAdjoint(h, unitary, hom, n); - for j in [1..n] do - # vec := RandomVector(F, n); - vec := g_res[4][j]; - # Display(vec); - Conds := - ComputeConditionMatrixFrob(vec, h, h_star, Lambdas[i], g_star_inv_scaled, g_star_inv_scaled_frob, g_inv_frob, frob_base_inv_star, F, n); - - ConvertToMatrixRep(Conds, F); - if not first then - nspace := NullspaceMat(W * Conds); - ConvertToMatrixRep(nspace, F); - if Size(nspace) = 0 then - # Print("empty"); - return []; - fi; - W := nspace * W; - fi; - if first then - nspace := NullspaceMat(Conds); - ConvertToMatrixRep(nspace, F); - if Size(nspace) = 0 then - # Print("empty"); - return []; - fi; - W := nspace; - first := false; - fi; - if Size(nspace) = 1 then - needs_checking := true; - break; - fi; - od; - od; - O := []; - for w in W do - A := g_inv_frob * FrobSpin(VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); - if needs_checking then - failed_check := false; - for i in [1..d] do - if not failed_check and Gens[i] * A * CalculateAdjoint(Gens[i], unitary, hom, n) <> Lambdas[i] * A then - failed_check := true; - fi; - od; - if not failed_check then - Add(O, A); - fi; - fi; - if not needs_checking then - Add(O, A); - fi; - od; - - return O; - -end; - -FindFormspace := function(G, Lambdas, unitary) - local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star; - if not IsMatrixGroup(G) then - # Print("The method only works for matrix groups. \n"); - return; - fi; - F := DefaultFieldOfMatrixGroup(G); - p_exponent := DegreeOverPrimeField(F); - if unitary and (p_exponent mod 2 <> 0) then - Print("Field does not admit field automorphism of order two!"); - return; - fi; - # Prüfen ob es sich um einen endlichen körper handelt?? - Gens := GeneratorsOfGroup(G); - # F := DefaultFieldOfMatrix(Gens[1]); - n := DimensionsMat(Gens[1])[1]; - d := Size(Gens); - hom := fail; - - if d = 1 then - # Todo.... !! - fi; - - if unitary then - hom := FrobeniusAutomorphism(F)^(p_exponent/2); - fi; - #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute - g_res := FindCyclicGroupElementAndScalars(Gens, Lambdas); - g_inv_frob := Inverse(g_res[4]); - #CalculateAdjoint := function(mat, mode, hom, n) - g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); - if unitary then - g_star_inv_unscaled := g_star_inv_unscaled^hom; - fi; - #* g_res[2]; - # Todo the computation of this can probably be sped up by using the known information about g!!! - g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled * g_res[2]); - frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); - - return FindFormspaceInternal(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n); -end; - -# todo scalars -FindForms := function(G) - local F, p_exponent, Gens, n, d, first, hom, g_res, g_inv_frob, g_star_inv_unscaled, g_star_inv_scaled_frob, frob_base_inv_star, Lambdas, Out, i; - Out := []; - if not IsMatrixGroup(G) then - # Print("The method only works for matrix groups. \n"); - return; - fi; - F := DefaultFieldOfMatrixGroup(G); - p_exponent := DegreeOverPrimeField(F); - # Prüfen ob es sich um einen endlichen körper handelt?? - Gens := GeneratorsOfGroup(G); - # F := DefaultFieldOfMatrix(Gens[1]); - n := DimensionsMat(Gens[1])[1]; - d := Size(Gens); - hom := fail; - - if d = 1 then - # Todo.... !! - fi; - - #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute - Lambdas := []; - for i in [1..d] do - Add(Lambdas, One(F)); - od; - g_res := FindCyclicGroupElementAndScalars(Gens, Lambdas); - ConvertToMatrixRep(g_res[1], F); - ConvertToMatrixRep(g_res[4], F); - g_inv_frob := Inverse(g_res[4]); - #CalculateAdjoint := function(mat, mode, hom, n) - g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); - #* g_res[2]; - # Todo the computation of this can probably be sped up by using the known information about g!!! - g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled); # hier ist eventuell noch ein bug mit den skalaren - frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); - - Add(Out, FindFormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); - if p_exponent mod 2 = 0 then - hom := FrobeniusAutomorphism(F)^(p_exponent/2); - g_star_inv_unscaled := g_star_inv_unscaled^hom; - g_star_inv_scaled_frob[2] := g_star_inv_scaled_frob[2]^hom; - frob_base_inv_star := frob_base_inv_star^hom; - Add(Out, FindFormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); - fi; - return Out; -end; \ No newline at end of file diff --git a/interesting_groups.g b/tst/interesting_groups.g similarity index 100% rename from interesting_groups.g rename to tst/interesting_groups.g From 8299f6902a693e0c9fe962f491247ef80614af0f Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Tue, 9 Dec 2025 16:33:38 +0100 Subject: [PATCH 06/21] renamed poly_eval_test.g to custom_test_functions.g --- tst/formspace/{poly_eval_test.g => custom_test_functions.g} | 0 tst/testall.g | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tst/formspace/{poly_eval_test.g => custom_test_functions.g} (100%) diff --git a/tst/formspace/poly_eval_test.g b/tst/formspace/custom_test_functions.g similarity index 100% rename from tst/formspace/poly_eval_test.g rename to tst/formspace/custom_test_functions.g diff --git a/tst/testall.g b/tst/testall.g index 661d900..7d4935b 100644 --- a/tst/testall.g +++ b/tst/testall.g @@ -6,7 +6,7 @@ if not IsBound(DescribesInvariantQuadraticForm) then Add( exclude, "adv/classic.tst" ); fi; -ReadPackage("forms", "tst/formspace/poly_eval_test.g"); +ReadPackage("forms", "tst/formspace/custom_test_functions.g.g"); TestDirectory(DirectoriesPackageLibrary("forms", "tst"), rec( From 202c1c009979e6cfe9ace14a234a220c4d95c0f7 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 17:20:37 +0100 Subject: [PATCH 07/21] Added tests, TODO: tests with interesting scalars are missing --- lib/formspace.gi | 6 +- tst/formspace/custom_test_functions.g | 118 ++++++++++++++++++ tst/formspace/generate_formspace_tests.g | 64 ++++++++++ tst/formspace/preserved_formspace/test_G1.tst | 14 +++ tst/formspace/preserved_formspace/test_G2.tst | 14 +++ tst/formspace/preserved_formspace/test_G3.tst | 14 +++ tst/formspace/preserved_formspace/test_G4.tst | 14 +++ tst/formspace/preserved_formspace/test_G5.tst | 14 +++ tst/formspace/preserved_formspace/test_G6.tst | 14 +++ tst/formspace/preserved_formspace/test_G7.tst | 14 +++ tst/formspace/preserved_formspace/test_G8.tst | 14 +++ .../preserved_formspace/test_GO__5_3__.tst | 14 +++ .../preserved_formspace/test_GP22.tst | 14 +++ .../preserved_formspace/test_Gtriv.tst | 14 +++ .../preserved_formspace/test_SU__4_5__.tst | 14 +++ .../preserved_formspace/test_Sp__4_5__.tst | 14 +++ tst/interesting_groups.g | 8 +- tst/testall.g | 2 +- 18 files changed, 372 insertions(+), 8 deletions(-) create mode 100644 tst/formspace/generate_formspace_tests.g create mode 100644 tst/formspace/preserved_formspace/test_G1.tst create mode 100644 tst/formspace/preserved_formspace/test_G2.tst create mode 100644 tst/formspace/preserved_formspace/test_G3.tst create mode 100644 tst/formspace/preserved_formspace/test_G4.tst create mode 100644 tst/formspace/preserved_formspace/test_G5.tst create mode 100644 tst/formspace/preserved_formspace/test_G6.tst create mode 100644 tst/formspace/preserved_formspace/test_G7.tst create mode 100644 tst/formspace/preserved_formspace/test_G8.tst create mode 100644 tst/formspace/preserved_formspace/test_GO__5_3__.tst create mode 100644 tst/formspace/preserved_formspace/test_GP22.tst create mode 100644 tst/formspace/preserved_formspace/test_Gtriv.tst create mode 100644 tst/formspace/preserved_formspace/test_SU__4_5__.tst create mode 100644 tst/formspace/preserved_formspace/test_Sp__4_5__.tst diff --git a/lib/formspace.gi b/lib/formspace.gi index ce1d483..72bc3bf 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -405,7 +405,7 @@ end; #! G is a finitely generated matrix group over a finite field $K$. #! L is a list of scalars corresponding to the group generators. I.e. $\Lambda(G_i)$ = L[i] for $i = 1, \dots, $Size(GeneratorsOfGroup(G)). #! If unitary is true, the function uses $h(x) = x$ for all $x \in K$. -#! If unitary is false, the function tries to use a field automorphism of order two for $h$ or will report failure if no such field automorphism exists. +#! If unitary is false, the function tries to use a field automorphism of order two for $h$. If no such field automorphism exists, it will return []. InstallMethod(PreservedFormspace, "for matrix group over finite field, with given scalars, and search for unitary forms", [IsMatrixGroup, IsVector and IsFFECollection, IsBool], function(G, Lambdas, unitary) @@ -413,8 +413,8 @@ InstallMethod(PreservedFormspace, F := DefaultFieldOfMatrixGroup(G); p_exponent := DegreeOverPrimeField(F); if unitary and (p_exponent mod 2 <> 0) then - Print("Field does not admit field automorphism of order two!"); - return; + # Print("Field does not admit field automorphism of order two!"); + return []; fi; # Prüfen ob es sich um einen endlichen körper handelt?? Gens := GeneratorsOfGroup(G); diff --git a/tst/formspace/custom_test_functions.g b/tst/formspace/custom_test_functions.g index cc42dbd..9736ad8 100644 --- a/tst/formspace/custom_test_functions.g +++ b/tst/formspace/custom_test_functions.g @@ -51,4 +51,122 @@ TestPolyEval := function(benchmark) Print("Frob: ", time_average_frob, " Normal: ", time_average_normal, "\n"); fi; return "Ok"; +end; + +TestMatricesAreForms := function(G, Lambdas, unitary, forms) + local p_exponent, hom, F, f, g, i, Gens, n, j; + F := DefaultFieldOfMatrixGroup(G); + Gens := GeneratorsOfGroup(G); + n := DimensionsMat(Gens[1])[1]; + p_exponent := DegreeOverPrimeField(F); + hom := fail; + if unitary then + if p_exponent mod 2 <> 0 then + if Size(forms) = 0 then + return "Ok"; + else + Error("Claims to have found unitary form although the field does not admit a field automorphism of order two!"); + fi; + fi; + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + fi; + + for i in [1..Size(forms)] do + f := forms[i]; + for j in [1..Size(Gens)] do + g := Gens[j]; + if g * f * __FORMSPACE__INTERNAL__CalculateAdjoint(g, unitary, hom, n, F) <> Lambdas[j] * f then + Error("Computed non formspace element ", f, "group " , G, " unitary ", unitary, " Lambdas ", Lambdas); + fi; + od; + od; + return "Ok"; +end; + +TestMatricesAreForms2 := function(G, forms) + local F, n, lambdas, Gens, i; + F := DefaultFieldOfMatrixGroup(G); + Gens := GeneratorsOfGroup(G); + n := DimensionsMat(Gens[1])[1]; + lambdas := []; + for i in [1..n] do + Add(lambdas, One(F)); + od; + return [TestMatricesAreForms(G, lambdas, false, forms[1]), TestMatricesAreForms(G, lambdas, true, forms[2])]; +end; + +# computes F by solving big system of linear equations. +# this is a good idea for testing to see that the presered formspace function actually computes the entire formspace not just a subspace. (this is the function that provides the formsace solutions used in other tests) +# however maybe we should test the test? this seems a little stupid +TestComputeFormspaceBruteForce := function(G, Lambdas, unitary) + local Gens, i, j, F, n, base, b, g, eqs, p_exponent, ComputeMatrixVectorSpaceBasis, VectorToMatrix, MatrixToVector, sol, out, s, hom, v; + Gens := GeneratorsOfGroup(G); + n := DimensionsMat(Gens[1])[1]; + F := DefaultFieldOfMatrixGroup(G); + + ComputeMatrixVectorSpaceBasis := function(F, n) + local O, i, j, m; + O := []; + for i in [1..n] do + for j in [1..n] do + m := NullMat(n, n, F); + m[i][j] := One(F); + Add(O, m); + od; + od; + return O; + end; + + VectorToMatrix := function(vec, F, n) + local i, j, m; + m := NullMat(n, n, F); + for i in [1..n] do + for j in [1..n] do + m[i][j] := vec[(i-1)*n + j]; + od; + od; + return m; + end; + + MatrixToVector := function(mat, F, n) + local vec, i, j; + vec := ZeroVector(F, n^2); + for i in [1..n] do + for j in [1..n] do + vec[(i-1)*n + j] := mat[i][j]; + od; + od; + return vec; + end; + + p_exponent := DegreeOverPrimeField(F); + hom := fail; + if unitary then + if p_exponent mod 2 <> 0 then + return []; + fi; + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + fi; + base := ComputeMatrixVectorSpaceBasis(F, n); + eqs := []; + + for j in [1..Size(base)] do + for i in [1..Size(Gens)] do + b := base[j]; + v := MatrixToVector(Gens[i] * b * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n, F) - Lambdas[i] * b, F, n); + if i = 1 then + Add(eqs, v); + else + eqs[j] := Concatenation(List(eqs[j]), List(v)); + fi; + od; + od; + # Print(aaa); + sol := NullspaceMat(eqs); + out := []; + for s in sol do + Add(out, VectorToMatrix(s, F, n)); + od; + # Print(aaa); + return out; end; \ No newline at end of file diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g new file mode 100644 index 0000000..e26541c --- /dev/null +++ b/tst/formspace/generate_formspace_tests.g @@ -0,0 +1,64 @@ +# you do not need to run this. this creates .tst files that should already exist and be correct! + +ReadPackage("forms", "tst/formspace/custom_test_functions.g"); +ReadPackage("forms", "tst/interesting_groups.g"); + +## TODO: Tests with scalars that are not equal to one are desperately missing!!! + +WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expected_normal_d, f_space_expected_unitary_d) + local full_name, start_test, end_test, stream, file_name, dir, full_path; + full_name := StringFormatted("test_{}.tst", name); + full_name := ReplacedString(full_name, "(", "__"); + full_name := ReplacedString(full_name, ")", "__"); + full_name := ReplacedString(full_name, ",", "_"); + full_path := StringFormatted("{}/{}", path, full_name); + + start_test := StringFormatted("gap> START_TEST(\"Formspace: Preserved Formspace {}\");\n", name); + end_test := StringFormatted("gap> STOP_TEST(\"Formspace: Preserved Formspace {}\");\n", name); + dir := DirectoriesPackageLibrary("forms", path); + # create file with this + PrintTo(full_path, ""); + + file_name := Filename(dir, full_name); + + #write to file with this + stream := OutputTextFile(file_name, true); + WriteAll(stream, start_test); + WriteAll(stream, StringFormatted("gap> G := {};; # Some groups are defined in interesting_groups.g\n", G[1])); + WriteAll(stream, StringFormatted("gap> R := PseudoRandom(GL({}, {}));;\n", n, F)); + WriteAll(stream, "gap> G := G^R;;\n"); + WriteAll(stream, StringFormatted("gap> f_space_expected_normal_d := {};; # the dimensions of the expected formspaces \n", f_space_expected_normal_d)); + WriteAll(stream, StringFormatted("gap> f_space_expected_unitary_d := {};;\n", f_space_expected_unitary_d)); + WriteAll(stream, "gap> L:=PreservedFormspace(G);;\n"); + WriteAll(stream, "gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not\n"); + WriteAll(stream, "[ \"Ok\", \"Ok\" ]\n"); + WriteAll(stream, "gap> Size(L[1])=f_space_expected_normal_d;\n"); + WriteAll(stream, "true\n"); + WriteAll(stream, "gap> Size(L[2])=f_space_expected_unitary_d;\n"); + WriteAll(stream, "true\n"); + WriteAll(stream, end_test); + CloseStream(stream); +end; + +GenerateTestsForPreservedFormspace := function() + local Groups, R, G, GG, n, F, Gens, path, lambdas, i, conjugated, f_space_expected_normal_d, f_space_expected_unitary_d; + path := "tst/formspace/preserved_formspace"; + Groups := [["GO(5,3)", GO(5, 3)], ["SU(4,5)", SU(4, 5)], ["Sp(4,5)", Sp(4, 5)], ["Gtriv", Gtriv], ["G1", G1], ["G2", G2], ["G3", G3], ["G4", G4], ["G5", G5], ["G6", G6], ["G7", G7], ["G8", G8], ["GP22", GP22]]; + for GG in Groups do + G := GG[2]; + Gens := GeneratorsOfGroup(G); + n := DimensionsMat(Gens[1])[1]; + F := DefaultFieldOfMatrixGroup(G); + R := PseudoRandom(GL(n, F)); + lambdas := []; + for i in [1..n] do + Add(lambdas, One(F)); + od; + conjugated := GG[2]^R; + f_space_expected_normal_d := Size(TestComputeFormspaceBruteForce(conjugated, lambdas, false)); + f_space_expected_unitary_d := Size(TestComputeFormspaceBruteForce(conjugated, lambdas, true)); + WriteTestFilePreservedFormspaceTest(path, GG[1], GG, n, F, f_space_expected_normal_d, f_space_expected_unitary_d); + od; +end; + + diff --git a/tst/formspace/preserved_formspace/test_G1.tst b/tst/formspace/preserved_formspace/test_G1.tst new file mode 100644 index 0000000..c847240 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G1.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G1"); +gap> G := G1;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(10, GF(5^4)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 2;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G1"); diff --git a/tst/formspace/preserved_formspace/test_G2.tst b/tst/formspace/preserved_formspace/test_G2.tst new file mode 100644 index 0000000..e985e5f --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G2.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G2"); +gap> G := G2;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(4, GF(5^4)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 2;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G2"); diff --git a/tst/formspace/preserved_formspace/test_G3.tst b/tst/formspace/preserved_formspace/test_G3.tst new file mode 100644 index 0000000..ea40d0d --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G3.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G3"); +gap> G := G3;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(7, GF(5^2)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 2;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 1;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G3"); diff --git a/tst/formspace/preserved_formspace/test_G4.tst b/tst/formspace/preserved_formspace/test_G4.tst new file mode 100644 index 0000000..2dcfc74 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G4.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G4"); +gap> G := G4;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(14, GF(7)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 2;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G4"); diff --git a/tst/formspace/preserved_formspace/test_G5.tst b/tst/formspace/preserved_formspace/test_G5.tst new file mode 100644 index 0000000..c5dff94 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G5.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G5"); +gap> G := G5;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(14, GF(11^2)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 2;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G5"); diff --git a/tst/formspace/preserved_formspace/test_G6.tst b/tst/formspace/preserved_formspace/test_G6.tst new file mode 100644 index 0000000..cd5bb05 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G6.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G6"); +gap> G := G6;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(10, GF(2^8)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 1;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G6"); diff --git a/tst/formspace/preserved_formspace/test_G7.tst b/tst/formspace/preserved_formspace/test_G7.tst new file mode 100644 index 0000000..2111c5b --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G7.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G7"); +gap> G := G7;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(10, GF(2^8)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 2;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G7"); diff --git a/tst/formspace/preserved_formspace/test_G8.tst b/tst/formspace/preserved_formspace/test_G8.tst new file mode 100644 index 0000000..fd46fd2 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_G8.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace G8"); +gap> G := G8;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(10, GF(2^8)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 2;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace G8"); diff --git a/tst/formspace/preserved_formspace/test_GO__5_3__.tst b/tst/formspace/preserved_formspace/test_GO__5_3__.tst new file mode 100644 index 0000000..d5aac70 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_GO__5_3__.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace GO(5,3)"); +gap> G := GO(5,3);; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(5, GF(3)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 1;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace GO(5,3)"); diff --git a/tst/formspace/preserved_formspace/test_GP22.tst b/tst/formspace/preserved_formspace/test_GP22.tst new file mode 100644 index 0000000..0aaf41a --- /dev/null +++ b/tst/formspace/preserved_formspace/test_GP22.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace GP22"); +gap> G := GP22;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(3, GF(7^2)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 1;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace GP22"); diff --git a/tst/formspace/preserved_formspace/test_Gtriv.tst b/tst/formspace/preserved_formspace/test_Gtriv.tst new file mode 100644 index 0000000..7c9af42 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_Gtriv.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace Gtriv"); +gap> G := Gtriv;; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(10, GF(5)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 100;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace Gtriv"); diff --git a/tst/formspace/preserved_formspace/test_SU__4_5__.tst b/tst/formspace/preserved_formspace/test_SU__4_5__.tst new file mode 100644 index 0000000..be18de1 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_SU__4_5__.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace SU(4,5)"); +gap> G := SU(4,5);; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(4, GF(5^2)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 0;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 1;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace SU(4,5)"); diff --git a/tst/formspace/preserved_formspace/test_Sp__4_5__.tst b/tst/formspace/preserved_formspace/test_Sp__4_5__.tst new file mode 100644 index 0000000..57749a9 --- /dev/null +++ b/tst/formspace/preserved_formspace/test_Sp__4_5__.tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace Sp(4,5)"); +gap> G := Sp(4,5);; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(4, GF(5)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 1;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace Sp(4,5)"); diff --git a/tst/interesting_groups.g b/tst/interesting_groups.g index 95c7f5f..66003f4 100644 --- a/tst/interesting_groups.g +++ b/tst/interesting_groups.g @@ -10,7 +10,7 @@ # end; # gap --packagedirs $PWD -# Read("tst/formspace/poly_eval_test.g"); +# Read("tst/formspace/custom_test_functions.g"); ## various micselaneous functions.. @@ -41,7 +41,7 @@ end; ## groups -# trivial group +# trivial group over GF(5) Gtriv := Group([[ Z(5^4), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], @@ -126,7 +126,7 @@ G3 := Group([ [ Z(5^2)^5, Z(5^2)^9, 0*Z(5), 0*Z(5), 0*Z(5), Z(5^2)^21, Z(5^2)^13 ); ## Subgroup of O+(14, 7) which is irreducible, but not absolutely irreducible -## Intersting is that the foms package seems to reliably find a hermitian and quadratic form, my function sometimes (there must be a bug!!!) finds a 10d form space, It seems that it is hard to find a cyclic group element in this particular group! Needs Fix !!!! +## Intersting is that the foms package seems to reliably find a hermitian and quadratic form, It seems that it is hard to find a cyclic group element in this particular group! G4 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], [ 0*Z(7), Z(7)^4, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^3, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], [ 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ], @@ -173,7 +173,7 @@ G4 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), -# Subgroup of O-(14, 11^2) another group which is irreducible but not absolutely irreducible. it is intersting that once again my program fails to find a cyclic element. It also does not find a presrved formspace. There seems to be some error in the implementation +# Subgroup of O-(14, 11^2) another group which is irreducible but not absolutely irreducible. it is intersting that once again my program fails to find a cyclic element. G5 := Group([ [ 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], [ 0*Z(11), 0*Z(11), 0*Z(11), Z(11)^0, 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11), 0*Z(11) ], diff --git a/tst/testall.g b/tst/testall.g index 7d4935b..bb5b65a 100644 --- a/tst/testall.g +++ b/tst/testall.g @@ -6,7 +6,7 @@ if not IsBound(DescribesInvariantQuadraticForm) then Add( exclude, "adv/classic.tst" ); fi; -ReadPackage("forms", "tst/formspace/custom_test_functions.g.g"); +ReadPackage("forms", "tst/formspace/custom_test_functions.g"); TestDirectory(DirectoriesPackageLibrary("forms", "tst"), rec( From aeed217f67068f572d2ad9b6bc93b7cc8daddb3a Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 17:35:02 +0100 Subject: [PATCH 08/21] forgot to load interesting_groups.g in testall.g --- tst/testall.g | 1 + 1 file changed, 1 insertion(+) diff --git a/tst/testall.g b/tst/testall.g index bb5b65a..7deec07 100644 --- a/tst/testall.g +++ b/tst/testall.g @@ -6,6 +6,7 @@ if not IsBound(DescribesInvariantQuadraticForm) then Add( exclude, "adv/classic.tst" ); fi; +ReadPackage("forms", "tst/interesting_groups.g"); ReadPackage("forms", "tst/formspace/custom_test_functions.g"); TestDirectory(DirectoriesPackageLibrary("forms", "tst"), From cf59bfb14141dc135702d73dadd0bbe230f4567c Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 17:43:01 +0100 Subject: [PATCH 09/21] changed test names, added test from github issue 39 --- tst/formspace/generate_formspace_tests.g | 4 +--- .../{test_GO__5_3__.tst => test_GO(5_3).tst} | 0 .../preserved_formspace/test_Group(SP(4_5).1).tst | 14 ++++++++++++++ .../{test_SU__4_5__.tst => test_SU(4_5).tst} | 0 .../{test_Sp__4_5__.tst => test_Sp(4_5).tst} | 0 5 files changed, 15 insertions(+), 3 deletions(-) rename tst/formspace/preserved_formspace/{test_GO__5_3__.tst => test_GO(5_3).tst} (100%) create mode 100644 tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst rename tst/formspace/preserved_formspace/{test_SU__4_5__.tst => test_SU(4_5).tst} (100%) rename tst/formspace/preserved_formspace/{test_Sp__4_5__.tst => test_Sp(4_5).tst} (100%) diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g index e26541c..b63bccc 100644 --- a/tst/formspace/generate_formspace_tests.g +++ b/tst/formspace/generate_formspace_tests.g @@ -8,8 +8,6 @@ ReadPackage("forms", "tst/interesting_groups.g"); WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expected_normal_d, f_space_expected_unitary_d) local full_name, start_test, end_test, stream, file_name, dir, full_path; full_name := StringFormatted("test_{}.tst", name); - full_name := ReplacedString(full_name, "(", "__"); - full_name := ReplacedString(full_name, ")", "__"); full_name := ReplacedString(full_name, ",", "_"); full_path := StringFormatted("{}/{}", path, full_name); @@ -43,7 +41,7 @@ end; GenerateTestsForPreservedFormspace := function() local Groups, R, G, GG, n, F, Gens, path, lambdas, i, conjugated, f_space_expected_normal_d, f_space_expected_unitary_d; path := "tst/formspace/preserved_formspace"; - Groups := [["GO(5,3)", GO(5, 3)], ["SU(4,5)", SU(4, 5)], ["Sp(4,5)", Sp(4, 5)], ["Gtriv", Gtriv], ["G1", G1], ["G2", G2], ["G3", G3], ["G4", G4], ["G5", G5], ["G6", G6], ["G7", G7], ["G8", G8], ["GP22", GP22]]; + Groups := [["GO(5,3)", GO(5, 3)], ["SU(4,5)", SU(4, 5)], ["Sp(4,5)", Sp(4, 5)], ["Gtriv", Gtriv], ["G1", G1], ["G2", G2], ["G3", G3], ["G4", G4], ["G5", G5], ["G6", G6], ["G7", G7], ["G8", G8], ["GP22", GP22], ["Group(SP(4,5).1)", Group(SP(4,5).1)]]; for GG in Groups do G := GG[2]; Gens := GeneratorsOfGroup(G); diff --git a/tst/formspace/preserved_formspace/test_GO__5_3__.tst b/tst/formspace/preserved_formspace/test_GO(5_3).tst similarity index 100% rename from tst/formspace/preserved_formspace/test_GO__5_3__.tst rename to tst/formspace/preserved_formspace/test_GO(5_3).tst diff --git a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst new file mode 100644 index 0000000..d26026c --- /dev/null +++ b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst @@ -0,0 +1,14 @@ +gap> START_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); +gap> G := Group(SP(4,5).1);; # Some groups are defined in interesting_groups.g +gap> R := PseudoRandom(GL(4, GF(5)));; +gap> G := G^R;; +gap> f_space_expected_normal_d := 6;; # the dimensions of the expected formspaces +gap> f_space_expected_unitary_d := 0;; +gap> L:=PreservedFormspace(G);; +gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not +[ "Ok", "Ok" ] +gap> Size(L[1])=f_space_expected_normal_d; +true +gap> Size(L[2])=f_space_expected_unitary_d; +true +gap> STOP_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); diff --git a/tst/formspace/preserved_formspace/test_SU__4_5__.tst b/tst/formspace/preserved_formspace/test_SU(4_5).tst similarity index 100% rename from tst/formspace/preserved_formspace/test_SU__4_5__.tst rename to tst/formspace/preserved_formspace/test_SU(4_5).tst diff --git a/tst/formspace/preserved_formspace/test_Sp__4_5__.tst b/tst/formspace/preserved_formspace/test_Sp(4_5).tst similarity index 100% rename from tst/formspace/preserved_formspace/test_Sp__4_5__.tst rename to tst/formspace/preserved_formspace/test_Sp(4_5).tst From 870cfccd728a45e378cef2615b176ffcb5c70859 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 17:44:45 +0100 Subject: [PATCH 10/21] small bug fix --- tst/formspace/custom_test_functions.g | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tst/formspace/custom_test_functions.g b/tst/formspace/custom_test_functions.g index 9736ad8..561bf85 100644 --- a/tst/formspace/custom_test_functions.g +++ b/tst/formspace/custom_test_functions.g @@ -89,7 +89,7 @@ TestMatricesAreForms2 := function(G, forms) Gens := GeneratorsOfGroup(G); n := DimensionsMat(Gens[1])[1]; lambdas := []; - for i in [1..n] do + for i in [1..Size(Gens)] do Add(lambdas, One(F)); od; return [TestMatricesAreForms(G, lambdas, false, forms[1]), TestMatricesAreForms(G, lambdas, true, forms[2])]; From a7cb0a793d1d2673715a2f49aff1796c6764c56f Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 17:56:42 +0100 Subject: [PATCH 11/21] fixed bug, where wrong basis change matrix was used when computing the formspace for cyclic groups --- lib/formspace.gi | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/formspace.gi b/lib/formspace.gi index 72bc3bf..9bfde86 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -293,7 +293,7 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) end; # Compute the formspace for cyclic matrix group. TODO!! -__FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n) +__FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, frob_inv_base_change, F, n) # maybe recoginize the trivial group here as a special case local p, mat, outspace, i, j, w, OutForms; @@ -307,7 +307,7 @@ __FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, for i in [1..Size(outspace)] do for w in outspace[i] do - Add(OutForms, frob_inv_star_base_change * __FORMSPACE__INTERNAL__FrobSpinAtBlock(w, Gen_adjoint_inv_scaled, frob[3], i, n, F)); + Add(OutForms, frob_inv_base_change * __FORMSPACE__INTERNAL__FrobSpinAtBlock(w, Gen_adjoint_inv_scaled, frob[3], i, n, F)); od; od; return OutForms; @@ -436,7 +436,7 @@ InstallMethod(PreservedFormspace, frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); - return __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, Lambda[1], unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n); + return __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, Lambda[1], unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, Inverse(frob[2]), F, n); fi; #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); @@ -483,8 +483,9 @@ InstallMethod(PreservedFormspace, frob := FrobeniusNormalForm(Gen); frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); + g_inv_frob := Inverse(frob[2]); - Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), false, fail, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n)); + Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), false, fail, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); if p_exponent mod 2 = 0 then hom := FrobeniusAutomorphism(F)^(p_exponent/2); @@ -492,7 +493,7 @@ InstallMethod(PreservedFormspace, frob_inv_star_base_change := frob_inv_star_base_change^hom; frob_inv_star_scaled[2] := frob_inv_star_scaled[2]^hom; - Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), true, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, F, n)); + Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), true, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); else Add(Out, []); fi; From 46918dd3fa899581c3c0bf59b7074855757d01a5 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 18:02:27 +0100 Subject: [PATCH 12/21] changed tests to use vectos space dimension --- tst/formspace/generate_formspace_tests.g | 4 ++-- tst/formspace/preserved_formspace/test_G1.tst | 4 ++-- tst/formspace/preserved_formspace/test_G2.tst | 4 ++-- tst/formspace/preserved_formspace/test_G3.tst | 4 ++-- tst/formspace/preserved_formspace/test_G4.tst | 4 ++-- tst/formspace/preserved_formspace/test_G5.tst | 4 ++-- tst/formspace/preserved_formspace/test_G6.tst | 4 ++-- tst/formspace/preserved_formspace/test_G7.tst | 4 ++-- tst/formspace/preserved_formspace/test_G8.tst | 4 ++-- tst/formspace/preserved_formspace/test_GO(5_3).tst | 4 ++-- tst/formspace/preserved_formspace/test_GP22.tst | 4 ++-- tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst | 4 ++-- tst/formspace/preserved_formspace/test_Gtriv.tst | 4 ++-- tst/formspace/preserved_formspace/test_SU(4_5).tst | 4 ++-- tst/formspace/preserved_formspace/test_Sp(4_5).tst | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g index b63bccc..423f3ac 100644 --- a/tst/formspace/generate_formspace_tests.g +++ b/tst/formspace/generate_formspace_tests.g @@ -30,9 +30,9 @@ WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expe WriteAll(stream, "gap> L:=PreservedFormspace(G);;\n"); WriteAll(stream, "gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not\n"); WriteAll(stream, "[ \"Ok\", \"Ok\" ]\n"); - WriteAll(stream, "gap> Size(L[1])=f_space_expected_normal_d;\n"); + WriteAll(stream, "gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d;\n"); WriteAll(stream, "true\n"); - WriteAll(stream, "gap> Size(L[2])=f_space_expected_unitary_d;\n"); + WriteAll(stream, "gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); WriteAll(stream, "true\n"); WriteAll(stream, end_test); CloseStream(stream); diff --git a/tst/formspace/preserved_formspace/test_G1.tst b/tst/formspace/preserved_formspace/test_G1.tst index c847240..cb16952 100644 --- a/tst/formspace/preserved_formspace/test_G1.tst +++ b/tst/formspace/preserved_formspace/test_G1.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G1"); diff --git a/tst/formspace/preserved_formspace/test_G2.tst b/tst/formspace/preserved_formspace/test_G2.tst index e985e5f..3f41f3f 100644 --- a/tst/formspace/preserved_formspace/test_G2.tst +++ b/tst/formspace/preserved_formspace/test_G2.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G2"); diff --git a/tst/formspace/preserved_formspace/test_G3.tst b/tst/formspace/preserved_formspace/test_G3.tst index ea40d0d..0731e86 100644 --- a/tst/formspace/preserved_formspace/test_G3.tst +++ b/tst/formspace/preserved_formspace/test_G3.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G3"); diff --git a/tst/formspace/preserved_formspace/test_G4.tst b/tst/formspace/preserved_formspace/test_G4.tst index 2dcfc74..095a564 100644 --- a/tst/formspace/preserved_formspace/test_G4.tst +++ b/tst/formspace/preserved_formspace/test_G4.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G4"); diff --git a/tst/formspace/preserved_formspace/test_G5.tst b/tst/formspace/preserved_formspace/test_G5.tst index c5dff94..11c0a2e 100644 --- a/tst/formspace/preserved_formspace/test_G5.tst +++ b/tst/formspace/preserved_formspace/test_G5.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G5"); diff --git a/tst/formspace/preserved_formspace/test_G6.tst b/tst/formspace/preserved_formspace/test_G6.tst index cd5bb05..97d5791 100644 --- a/tst/formspace/preserved_formspace/test_G6.tst +++ b/tst/formspace/preserved_formspace/test_G6.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G6"); diff --git a/tst/formspace/preserved_formspace/test_G7.tst b/tst/formspace/preserved_formspace/test_G7.tst index 2111c5b..c4ff0b9 100644 --- a/tst/formspace/preserved_formspace/test_G7.tst +++ b/tst/formspace/preserved_formspace/test_G7.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G7"); diff --git a/tst/formspace/preserved_formspace/test_G8.tst b/tst/formspace/preserved_formspace/test_G8.tst index fd46fd2..7050450 100644 --- a/tst/formspace/preserved_formspace/test_G8.tst +++ b/tst/formspace/preserved_formspace/test_G8.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G8"); diff --git a/tst/formspace/preserved_formspace/test_GO(5_3).tst b/tst/formspace/preserved_formspace/test_GO(5_3).tst index d5aac70..b7aeb32 100644 --- a/tst/formspace/preserved_formspace/test_GO(5_3).tst +++ b/tst/formspace/preserved_formspace/test_GO(5_3).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GO(5,3)"); diff --git a/tst/formspace/preserved_formspace/test_GP22.tst b/tst/formspace/preserved_formspace/test_GP22.tst index 0aaf41a..07d10cb 100644 --- a/tst/formspace/preserved_formspace/test_GP22.tst +++ b/tst/formspace/preserved_formspace/test_GP22.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GP22"); diff --git a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst index d26026c..baca22a 100644 --- a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst +++ b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); diff --git a/tst/formspace/preserved_formspace/test_Gtriv.tst b/tst/formspace/preserved_formspace/test_Gtriv.tst index 7c9af42..f48dfee 100644 --- a/tst/formspace/preserved_formspace/test_Gtriv.tst +++ b/tst/formspace/preserved_formspace/test_Gtriv.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Gtriv"); diff --git a/tst/formspace/preserved_formspace/test_SU(4_5).tst b/tst/formspace/preserved_formspace/test_SU(4_5).tst index be18de1..f026972 100644 --- a/tst/formspace/preserved_formspace/test_SU(4_5).tst +++ b/tst/formspace/preserved_formspace/test_SU(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace SU(4,5)"); diff --git a/tst/formspace/preserved_formspace/test_Sp(4_5).tst b/tst/formspace/preserved_formspace/test_Sp(4_5).tst index 57749a9..85e10b5 100644 --- a/tst/formspace/preserved_formspace/test_Sp(4_5).tst +++ b/tst/formspace/preserved_formspace/test_Sp(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Size(L[1])=f_space_expected_normal_d; +gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Size(L[2])=f_space_expected_unitary_d; +gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Sp(4,5)"); From 26f348a07dbe1d7ddddb2a3b8af2ba4a749e8554 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 18:09:45 +0100 Subject: [PATCH 13/21] fixed tests, forgot to set field --- tst/formspace/generate_formspace_tests.g | 4 ++-- tst/formspace/preserved_formspace/test_G1.tst | 4 ++-- tst/formspace/preserved_formspace/test_G2.tst | 4 ++-- tst/formspace/preserved_formspace/test_G3.tst | 4 ++-- tst/formspace/preserved_formspace/test_G4.tst | 4 ++-- tst/formspace/preserved_formspace/test_G5.tst | 4 ++-- tst/formspace/preserved_formspace/test_G6.tst | 4 ++-- tst/formspace/preserved_formspace/test_G7.tst | 4 ++-- tst/formspace/preserved_formspace/test_G8.tst | 4 ++-- tst/formspace/preserved_formspace/test_GO(5_3).tst | 4 ++-- tst/formspace/preserved_formspace/test_GP22.tst | 4 ++-- tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst | 4 ++-- tst/formspace/preserved_formspace/test_Gtriv.tst | 4 ++-- tst/formspace/preserved_formspace/test_SU(4_5).tst | 4 ++-- tst/formspace/preserved_formspace/test_Sp(4_5).tst | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g index 423f3ac..5fb73a9 100644 --- a/tst/formspace/generate_formspace_tests.g +++ b/tst/formspace/generate_formspace_tests.g @@ -30,9 +30,9 @@ WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expe WriteAll(stream, "gap> L:=PreservedFormspace(G);;\n"); WriteAll(stream, "gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not\n"); WriteAll(stream, "[ \"Ok\", \"Ok\" ]\n"); - WriteAll(stream, "gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d;\n"); + WriteAll(stream, "gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d;\n"); WriteAll(stream, "true\n"); - WriteAll(stream, "gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); + WriteAll(stream, "gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); WriteAll(stream, "true\n"); WriteAll(stream, end_test); CloseStream(stream); diff --git a/tst/formspace/preserved_formspace/test_G1.tst b/tst/formspace/preserved_formspace/test_G1.tst index cb16952..9a1f426 100644 --- a/tst/formspace/preserved_formspace/test_G1.tst +++ b/tst/formspace/preserved_formspace/test_G1.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G1"); diff --git a/tst/formspace/preserved_formspace/test_G2.tst b/tst/formspace/preserved_formspace/test_G2.tst index 3f41f3f..48e0e31 100644 --- a/tst/formspace/preserved_formspace/test_G2.tst +++ b/tst/formspace/preserved_formspace/test_G2.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G2"); diff --git a/tst/formspace/preserved_formspace/test_G3.tst b/tst/formspace/preserved_formspace/test_G3.tst index 0731e86..e957ec1 100644 --- a/tst/formspace/preserved_formspace/test_G3.tst +++ b/tst/formspace/preserved_formspace/test_G3.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G3"); diff --git a/tst/formspace/preserved_formspace/test_G4.tst b/tst/formspace/preserved_formspace/test_G4.tst index 095a564..010c4f2 100644 --- a/tst/formspace/preserved_formspace/test_G4.tst +++ b/tst/formspace/preserved_formspace/test_G4.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G4"); diff --git a/tst/formspace/preserved_formspace/test_G5.tst b/tst/formspace/preserved_formspace/test_G5.tst index 11c0a2e..7171cc6 100644 --- a/tst/formspace/preserved_formspace/test_G5.tst +++ b/tst/formspace/preserved_formspace/test_G5.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G5"); diff --git a/tst/formspace/preserved_formspace/test_G6.tst b/tst/formspace/preserved_formspace/test_G6.tst index 97d5791..c9780fd 100644 --- a/tst/formspace/preserved_formspace/test_G6.tst +++ b/tst/formspace/preserved_formspace/test_G6.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G6"); diff --git a/tst/formspace/preserved_formspace/test_G7.tst b/tst/formspace/preserved_formspace/test_G7.tst index c4ff0b9..dfb60bc 100644 --- a/tst/formspace/preserved_formspace/test_G7.tst +++ b/tst/formspace/preserved_formspace/test_G7.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G7"); diff --git a/tst/formspace/preserved_formspace/test_G8.tst b/tst/formspace/preserved_formspace/test_G8.tst index 7050450..aefd33d 100644 --- a/tst/formspace/preserved_formspace/test_G8.tst +++ b/tst/formspace/preserved_formspace/test_G8.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G8"); diff --git a/tst/formspace/preserved_formspace/test_GO(5_3).tst b/tst/formspace/preserved_formspace/test_GO(5_3).tst index b7aeb32..47998fe 100644 --- a/tst/formspace/preserved_formspace/test_GO(5_3).tst +++ b/tst/formspace/preserved_formspace/test_GO(5_3).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GO(5,3)"); diff --git a/tst/formspace/preserved_formspace/test_GP22.tst b/tst/formspace/preserved_formspace/test_GP22.tst index 07d10cb..900f4ee 100644 --- a/tst/formspace/preserved_formspace/test_GP22.tst +++ b/tst/formspace/preserved_formspace/test_GP22.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GP22"); diff --git a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst index baca22a..f0c3bbe 100644 --- a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst +++ b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); diff --git a/tst/formspace/preserved_formspace/test_Gtriv.tst b/tst/formspace/preserved_formspace/test_Gtriv.tst index f48dfee..76fc6bc 100644 --- a/tst/formspace/preserved_formspace/test_Gtriv.tst +++ b/tst/formspace/preserved_formspace/test_Gtriv.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Gtriv"); diff --git a/tst/formspace/preserved_formspace/test_SU(4_5).tst b/tst/formspace/preserved_formspace/test_SU(4_5).tst index f026972..1908d94 100644 --- a/tst/formspace/preserved_formspace/test_SU(4_5).tst +++ b/tst/formspace/preserved_formspace/test_SU(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace SU(4,5)"); diff --git a/tst/formspace/preserved_formspace/test_Sp(4_5).tst b/tst/formspace/preserved_formspace/test_Sp(4_5).tst index 85e10b5..f1b9697 100644 --- a/tst/formspace/preserved_formspace/test_Sp(4_5).tst +++ b/tst/formspace/preserved_formspace/test_Sp(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Sp(4,5)"); From f1a1b72a5d7e907862a65c7fbc264f5c49f250c5 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 18:11:57 +0100 Subject: [PATCH 14/21] fixed typo .... --- tst/formspace/generate_formspace_tests.g | 4 ++-- tst/formspace/preserved_formspace/test_G1.tst | 4 ++-- tst/formspace/preserved_formspace/test_G2.tst | 4 ++-- tst/formspace/preserved_formspace/test_G3.tst | 4 ++-- tst/formspace/preserved_formspace/test_G4.tst | 4 ++-- tst/formspace/preserved_formspace/test_G5.tst | 4 ++-- tst/formspace/preserved_formspace/test_G6.tst | 4 ++-- tst/formspace/preserved_formspace/test_G7.tst | 4 ++-- tst/formspace/preserved_formspace/test_G8.tst | 4 ++-- tst/formspace/preserved_formspace/test_GO(5_3).tst | 4 ++-- tst/formspace/preserved_formspace/test_GP22.tst | 4 ++-- tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst | 4 ++-- tst/formspace/preserved_formspace/test_Gtriv.tst | 4 ++-- tst/formspace/preserved_formspace/test_SU(4_5).tst | 4 ++-- tst/formspace/preserved_formspace/test_Sp(4_5).tst | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g index 5fb73a9..8a590b4 100644 --- a/tst/formspace/generate_formspace_tests.g +++ b/tst/formspace/generate_formspace_tests.g @@ -30,9 +30,9 @@ WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expe WriteAll(stream, "gap> L:=PreservedFormspace(G);;\n"); WriteAll(stream, "gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not\n"); WriteAll(stream, "[ \"Ok\", \"Ok\" ]\n"); - WriteAll(stream, "gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d;\n"); + WriteAll(stream, "gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d;\n"); WriteAll(stream, "true\n"); - WriteAll(stream, "gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); + WriteAll(stream, "gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); WriteAll(stream, "true\n"); WriteAll(stream, end_test); CloseStream(stream); diff --git a/tst/formspace/preserved_formspace/test_G1.tst b/tst/formspace/preserved_formspace/test_G1.tst index 9a1f426..002cede 100644 --- a/tst/formspace/preserved_formspace/test_G1.tst +++ b/tst/formspace/preserved_formspace/test_G1.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G1"); diff --git a/tst/formspace/preserved_formspace/test_G2.tst b/tst/formspace/preserved_formspace/test_G2.tst index 48e0e31..cffec13 100644 --- a/tst/formspace/preserved_formspace/test_G2.tst +++ b/tst/formspace/preserved_formspace/test_G2.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G2"); diff --git a/tst/formspace/preserved_formspace/test_G3.tst b/tst/formspace/preserved_formspace/test_G3.tst index e957ec1..a554d21 100644 --- a/tst/formspace/preserved_formspace/test_G3.tst +++ b/tst/formspace/preserved_formspace/test_G3.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G3"); diff --git a/tst/formspace/preserved_formspace/test_G4.tst b/tst/formspace/preserved_formspace/test_G4.tst index 010c4f2..f8bdebf 100644 --- a/tst/formspace/preserved_formspace/test_G4.tst +++ b/tst/formspace/preserved_formspace/test_G4.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G4"); diff --git a/tst/formspace/preserved_formspace/test_G5.tst b/tst/formspace/preserved_formspace/test_G5.tst index 7171cc6..b9af879 100644 --- a/tst/formspace/preserved_formspace/test_G5.tst +++ b/tst/formspace/preserved_formspace/test_G5.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G5"); diff --git a/tst/formspace/preserved_formspace/test_G6.tst b/tst/formspace/preserved_formspace/test_G6.tst index c9780fd..e53731e 100644 --- a/tst/formspace/preserved_formspace/test_G6.tst +++ b/tst/formspace/preserved_formspace/test_G6.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G6"); diff --git a/tst/formspace/preserved_formspace/test_G7.tst b/tst/formspace/preserved_formspace/test_G7.tst index dfb60bc..b3c2bc8 100644 --- a/tst/formspace/preserved_formspace/test_G7.tst +++ b/tst/formspace/preserved_formspace/test_G7.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G7"); diff --git a/tst/formspace/preserved_formspace/test_G8.tst b/tst/formspace/preserved_formspace/test_G8.tst index aefd33d..2f240a7 100644 --- a/tst/formspace/preserved_formspace/test_G8.tst +++ b/tst/formspace/preserved_formspace/test_G8.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G8"); diff --git a/tst/formspace/preserved_formspace/test_GO(5_3).tst b/tst/formspace/preserved_formspace/test_GO(5_3).tst index 47998fe..a9733c1 100644 --- a/tst/formspace/preserved_formspace/test_GO(5_3).tst +++ b/tst/formspace/preserved_formspace/test_GO(5_3).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GO(5,3)"); diff --git a/tst/formspace/preserved_formspace/test_GP22.tst b/tst/formspace/preserved_formspace/test_GP22.tst index 900f4ee..06e3dff 100644 --- a/tst/formspace/preserved_formspace/test_GP22.tst +++ b/tst/formspace/preserved_formspace/test_GP22.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GP22"); diff --git a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst index f0c3bbe..5af31b8 100644 --- a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst +++ b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); diff --git a/tst/formspace/preserved_formspace/test_Gtriv.tst b/tst/formspace/preserved_formspace/test_Gtriv.tst index 76fc6bc..58a2676 100644 --- a/tst/formspace/preserved_formspace/test_Gtriv.tst +++ b/tst/formspace/preserved_formspace/test_Gtriv.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Gtriv"); diff --git a/tst/formspace/preserved_formspace/test_SU(4_5).tst b/tst/formspace/preserved_formspace/test_SU(4_5).tst index 1908d94..e338778 100644 --- a/tst/formspace/preserved_formspace/test_SU(4_5).tst +++ b/tst/formspace/preserved_formspace/test_SU(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace SU(4,5)"); diff --git a/tst/formspace/preserved_formspace/test_Sp(4_5).tst b/tst/formspace/preserved_formspace/test_Sp(4_5).tst index f1b9697..a597887 100644 --- a/tst/formspace/preserved_formspace/test_Sp(4_5).tst +++ b/tst/formspace/preserved_formspace/test_Sp(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; true -gap> Dimension(DefualtFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Sp(4,5)"); From d777d4305ef649c647fdb6238dfc0704393dd13f Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Wed, 10 Dec 2025 19:06:49 +0100 Subject: [PATCH 15/21] changed back test files to only compare list size instead of vector space dimension because gap was being annoying. This could be a future todo tho --- tst/formspace/generate_formspace_tests.g | 4 ++-- tst/formspace/preserved_formspace/test_G1.tst | 4 ++-- tst/formspace/preserved_formspace/test_G2.tst | 4 ++-- tst/formspace/preserved_formspace/test_G3.tst | 4 ++-- tst/formspace/preserved_formspace/test_G4.tst | 4 ++-- tst/formspace/preserved_formspace/test_G5.tst | 4 ++-- tst/formspace/preserved_formspace/test_G6.tst | 4 ++-- tst/formspace/preserved_formspace/test_G7.tst | 4 ++-- tst/formspace/preserved_formspace/test_G8.tst | 4 ++-- tst/formspace/preserved_formspace/test_GO(5_3).tst | 4 ++-- tst/formspace/preserved_formspace/test_GP22.tst | 4 ++-- tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst | 4 ++-- tst/formspace/preserved_formspace/test_Gtriv.tst | 4 ++-- tst/formspace/preserved_formspace/test_SU(4_5).tst | 4 ++-- tst/formspace/preserved_formspace/test_Sp(4_5).tst | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tst/formspace/generate_formspace_tests.g b/tst/formspace/generate_formspace_tests.g index 8a590b4..b63bccc 100644 --- a/tst/formspace/generate_formspace_tests.g +++ b/tst/formspace/generate_formspace_tests.g @@ -30,9 +30,9 @@ WriteTestFilePreservedFormspaceTest := function(path, name, G, n, F,f_space_expe WriteAll(stream, "gap> L:=PreservedFormspace(G);;\n"); WriteAll(stream, "gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not\n"); WriteAll(stream, "[ \"Ok\", \"Ok\" ]\n"); - WriteAll(stream, "gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d;\n"); + WriteAll(stream, "gap> Size(L[1])=f_space_expected_normal_d;\n"); WriteAll(stream, "true\n"); - WriteAll(stream, "gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d;\n"); + WriteAll(stream, "gap> Size(L[2])=f_space_expected_unitary_d;\n"); WriteAll(stream, "true\n"); WriteAll(stream, end_test); CloseStream(stream); diff --git a/tst/formspace/preserved_formspace/test_G1.tst b/tst/formspace/preserved_formspace/test_G1.tst index 002cede..c847240 100644 --- a/tst/formspace/preserved_formspace/test_G1.tst +++ b/tst/formspace/preserved_formspace/test_G1.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G1"); diff --git a/tst/formspace/preserved_formspace/test_G2.tst b/tst/formspace/preserved_formspace/test_G2.tst index cffec13..e985e5f 100644 --- a/tst/formspace/preserved_formspace/test_G2.tst +++ b/tst/formspace/preserved_formspace/test_G2.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G2"); diff --git a/tst/formspace/preserved_formspace/test_G3.tst b/tst/formspace/preserved_formspace/test_G3.tst index a554d21..ea40d0d 100644 --- a/tst/formspace/preserved_formspace/test_G3.tst +++ b/tst/formspace/preserved_formspace/test_G3.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G3"); diff --git a/tst/formspace/preserved_formspace/test_G4.tst b/tst/formspace/preserved_formspace/test_G4.tst index f8bdebf..2dcfc74 100644 --- a/tst/formspace/preserved_formspace/test_G4.tst +++ b/tst/formspace/preserved_formspace/test_G4.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G4"); diff --git a/tst/formspace/preserved_formspace/test_G5.tst b/tst/formspace/preserved_formspace/test_G5.tst index b9af879..c5dff94 100644 --- a/tst/formspace/preserved_formspace/test_G5.tst +++ b/tst/formspace/preserved_formspace/test_G5.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G5"); diff --git a/tst/formspace/preserved_formspace/test_G6.tst b/tst/formspace/preserved_formspace/test_G6.tst index e53731e..cd5bb05 100644 --- a/tst/formspace/preserved_formspace/test_G6.tst +++ b/tst/formspace/preserved_formspace/test_G6.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G6"); diff --git a/tst/formspace/preserved_formspace/test_G7.tst b/tst/formspace/preserved_formspace/test_G7.tst index b3c2bc8..2111c5b 100644 --- a/tst/formspace/preserved_formspace/test_G7.tst +++ b/tst/formspace/preserved_formspace/test_G7.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G7"); diff --git a/tst/formspace/preserved_formspace/test_G8.tst b/tst/formspace/preserved_formspace/test_G8.tst index 2f240a7..fd46fd2 100644 --- a/tst/formspace/preserved_formspace/test_G8.tst +++ b/tst/formspace/preserved_formspace/test_G8.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 2;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace G8"); diff --git a/tst/formspace/preserved_formspace/test_GO(5_3).tst b/tst/formspace/preserved_formspace/test_GO(5_3).tst index a9733c1..d5aac70 100644 --- a/tst/formspace/preserved_formspace/test_GO(5_3).tst +++ b/tst/formspace/preserved_formspace/test_GO(5_3).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GO(5,3)"); diff --git a/tst/formspace/preserved_formspace/test_GP22.tst b/tst/formspace/preserved_formspace/test_GP22.tst index 06e3dff..0aaf41a 100644 --- a/tst/formspace/preserved_formspace/test_GP22.tst +++ b/tst/formspace/preserved_formspace/test_GP22.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace GP22"); diff --git a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst index 5af31b8..d26026c 100644 --- a/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst +++ b/tst/formspace/preserved_formspace/test_Group(SP(4_5).1).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Group(SP(4,5).1)"); diff --git a/tst/formspace/preserved_formspace/test_Gtriv.tst b/tst/formspace/preserved_formspace/test_Gtriv.tst index 58a2676..7c9af42 100644 --- a/tst/formspace/preserved_formspace/test_Gtriv.tst +++ b/tst/formspace/preserved_formspace/test_Gtriv.tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Gtriv"); diff --git a/tst/formspace/preserved_formspace/test_SU(4_5).tst b/tst/formspace/preserved_formspace/test_SU(4_5).tst index e338778..be18de1 100644 --- a/tst/formspace/preserved_formspace/test_SU(4_5).tst +++ b/tst/formspace/preserved_formspace/test_SU(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 1;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace SU(4,5)"); diff --git a/tst/formspace/preserved_formspace/test_Sp(4_5).tst b/tst/formspace/preserved_formspace/test_Sp(4_5).tst index a597887..57749a9 100644 --- a/tst/formspace/preserved_formspace/test_Sp(4_5).tst +++ b/tst/formspace/preserved_formspace/test_Sp(4_5).tst @@ -7,8 +7,8 @@ gap> f_space_expected_unitary_d := 0;; gap> L:=PreservedFormspace(G);; gap> TestMatricesAreForms2(G, L); # found in custom_test_functions.g, Tests whether the matrices returned are forms preserved by G or not [ "Ok", "Ok" ] -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[1]))=f_space_expected_normal_d; +gap> Size(L[1])=f_space_expected_normal_d; true -gap> Dimension(DefaultFieldOfMatrixGroup(G), Vectorspace(L[2]))=f_space_expected_unitary_d; +gap> Size(L[2])=f_space_expected_unitary_d; true gap> STOP_TEST("Formspace: Preserved Formspace Sp(4,5)"); From 6ed901ac4a578eb8370f957618ed09024062032d Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Thu, 11 Dec 2025 10:27:24 +0100 Subject: [PATCH 16/21] deleted useless latex files in doc dir --- doc/forms.fdb_latexmk | 155 ---------------------- doc/forms.fls | 295 ------------------------------------------ lib/formspace.gi | 2 +- 3 files changed, 1 insertion(+), 451 deletions(-) delete mode 100644 doc/forms.fdb_latexmk delete mode 100644 doc/forms.fls diff --git a/doc/forms.fdb_latexmk b/doc/forms.fdb_latexmk deleted file mode 100644 index 441f5af..0000000 --- a/doc/forms.fdb_latexmk +++ /dev/null @@ -1,155 +0,0 @@ -# Fdb version 4 -["bibtex forms"] 1765202050.69469 "forms.aux" "forms.bbl" "forms" 1765202050.90178 2 - "./forms.bib" 1761741498.47844 2393 6df7f12e20895f946dc65a09d29ae696 "" - "/usr/local/texlive/2024/texmf-dist/bibtex/bst/base/alpha.bst" 1292289607 23907 a5f93555796fb564b924339521f10a7c "" - "forms.aux" 1765202050.83191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" - (generated) - "forms.bbl" - "forms.blg" - (rewritten before read) -["makeindex forms.idx"] 1765202050.49548 "forms.idx" "forms.ind" "forms" 1765202050.89851 0 - "forms.idx" 1765202050.65191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" - (generated) - "forms.ilg" - "forms.ind" - (rewritten before read) -["pdflatex"] 1765202048.75552 "/home/peter/BA/forms-pkg/forms/doc/forms.tex" "forms.pdf" "forms" 1765202050.89879 0 - "/home/peter/BA/forms-pkg/forms/doc/forms.tex" 1765202047.83191 150901 1d8e9e906ffab0953d2497743708af55 "" - "/usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab "" - "/usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc" 1136849721 2971 def0b6c1f0b107b3b936def894055589 "" - "/usr/local/texlive/2024/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8r.tfm" 1136768653 4712 9ef4d7d106579d4b136e1529e1a4533c "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm" 1136768653 7040 b2bd27e2bfe6f6948cbc3239cae7444f "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm" 1136768653 1408 5937f58aa508ea2cea4901c07d10f5fe "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm" 1136768653 1544 23a042a74981a3e4b6ce2e350e390409 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm" 1136768653 2172 fd0c924230362ff848a33632ed45dc23 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm" 1136768653 4524 6bce29db5bc272ba5f332261583fee9c "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm" 1136768653 6880 f19b8995b61c334d78fc734065f6b4d4 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm" 1136768653 1352 fa28a7e6d323c65ce7d13d5342ff6be2 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm" 1136768653 4408 25b74d011a4c66b7f212c0cc3c90061b "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm" 1136768653 6672 e3ab9e37e925f3045c9005e6d1473d56 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmrc8t.tfm" 1136768653 16648 7e91c60ebf91b9c60e16ef52b3070f9c "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm" 1136768653 2288 f478fc8fed18759effb59f3dad7f3084 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm" 1136768653 4640 532ca3305aad10cc01d769f3f91f1029 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm" 1136768653 6944 94c55ad86e6ea2826f78ba2240d50df9 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8r.tfm" 1136768653 4548 f370a182a02c40d95c5554802dc0f174 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm" 1136768653 6792 47ec25d9cde9feef87a90c47a9fbc4d5 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm" 1136768653 2232 db256afffc8202da192b4641df14d602 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm" 1136768653 2172 1d00c2a0d10f23031be62329457a870c "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm" 1136768653 1032 20febbd0f0c9a48eb78616f897008286 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm" 1136768653 1520 ad7b3c1a480a03b3e41b5fbb13d938f2 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecit1095.tfm" 1136768653 1536 bf65fdffa21a3aa11d43ef2786a93442 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecst1095.tfm" 1136768653 1536 31c32aa0109a9aa82e54137f7be41f6c "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectc1095.tfm" 1136768653 1536 cccb8b9b6c0a5257696004439c0d7d95 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1000.tfm" 1136768653 1536 06717a2b50de47d4087ac0e6cd759455 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1095.tfm" 1136768653 1536 a988bfe554c1f79514bd46d13c3c64ce "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm" 1136768653 1528 abec98dbc43e172678c11b3b9031252a "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm" 1136768653 1296 45809c5a464d5f32c8f98ba97c1bb47f "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" - "/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm" 1229303445 688 37338d6ab346c2f1466b29e195316aa4 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb" 1248133631 30251 6afa5cb1d0204815a708a080681d4674 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb" 1215737283 162237 5a140a750812280b19b4bd0d60e3da8e "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfst1095.pfb" 1215737283 160886 e7cc7d55761bbb7edc62829b16cfc7a8 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftc1095.pfb" 1215737283 141588 76d69251545f98f0ced3b73c2788cd96 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1000.pfb" 1215737283 169201 9ebf99020dde51a5086e186761a34e8f "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb" 1215737283 169670 48d12e69c9a3b23c81f6d703ccbd4554 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb" 1136849748 44648 23115b2a545ebfe2c526c3ca99db8b95 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/symbol/usyr.pfb" 1136849748 33709 b09d2e140b7e807d3a97058263ab6693 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmb8a.pfb" 1136849748 44729 811d6c62865936705a31c797a1d5dada "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb" 1136849748 46026 6dab18b61c907687b520c72847215a68 "" - "/usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmri8a.pfb" 1136849748 45458 a3faba884469519614ca56ba5f6b1de1 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/helvetic/phvr8t.vf" 1136768653 2344 44ff28c9ef2fc97180cd884f900fee71 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf" 1136768653 2340 df9c920cc5688ebbf16a93f45ce7bdd3 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf" 1136768653 3556 8a9a6dcbcd146ef985683f677f4758a6 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf" 1136768653 2348 91706c542228501c410c266421fbe30c "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmrc8t.vf" 1136768653 3608 78e4c999d9e69f03f448158d01821741 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf" 1136768653 2328 6cd7df782b09b29cfc4d93e55b6b9a59 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmro8t.vf" 1136768653 2356 c62a9e3d92ec3ebab0f81e654c0829a1 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf" 1136768653 1132 27520247d3fe18d4266a226b461885c2 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf" 1136768653 1108 d271d6f9de4122c3f8d3b65666167fac "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7v.vf" 1136768653 1012 046369ac6a83af997c3aa05a43256ad5 "" - "/usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf" 1136768653 964 5673178ff30617b900214de28ab32b38 "" - "/usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty" 1644112042 7237 bdd120a32c8fdb4b433cf9ca2e7cd98a "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1701727651 17865 1a9bd36b4f98178fa551aca822290953 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty" 1575152242 21514 b7557edcee22835ef6b03ede1802dad4 "" - "/usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1717359999 2963 e56732bbb93cfa019febfd0c7eaf1d21 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1717359999 2378 05fbb4f2b23b0e142f8cd3440c37e72e "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty" 1717359999 5275 b64d8404d74d2860b9c6558239dd0784 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty" 1717359999 5048 7ebf0f2edf1ef6783e8fe2201a95d0e8 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty" 1705352648 1939 3225e20a81cec31e51c1e216d6385103 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls" 1717359999 23203 02a38c89d2f3aef55ce8b1288a372bbb "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo" 1717359999 8464 6b4d01be31907866396cf4ac23881d2d "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd" 1705352648 2443 790016d75def8d3127df5c216a45abcc "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty" 1717359999 2846 50113a9b2387b6447504672739a4a25b "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty" 1561238569 51697 f8f08183cd2080d9d18a41432d651dfb "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1601931149 46845 3b58f70c6e861a13d927bff09d35ecbc "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty" 1705955721 43712 c3d93734f3bc56e03c21b3dc69268d3c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def" 1713382759 19440 9da9dcbb27470349a580fca7372d454b "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty" 1717359999 7233 b3e7845a2bdbf185cb9b9798e7df4dc4 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty" 1717359999 2671 70891d50dac933918b827d326687c6e8 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1667332637 2885 9c645d672ae17285bba324998918efd8 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty" 1705871765 14055 c38f88a3b3682869125143ef481d88f3 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def" 1720644236 48154 c55ef1b9fe7eb198bd7ba0e01cbf5189 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty" 1720644236 220493 bbff330ab3155b3f5df1de2445e80c9f "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty" 1705871765 11026 182c63f139a71afd30a28e5f1ed2cd1c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def" 1720644236 14249 4eb911d2c8c7a7c4cb846c83cb2cc309 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def" 1720644236 117112 df92f59263f7368ce05087964c585de5 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1655478651 22555 6d8e155cfef6d82c3d5c742fea7c992e "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1665067230 13815 760b0c02f691ea230f5359c4e1de23a7 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1716410060 29785 9f93ab201fe5dd053afcc6c1bcf7d266 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty" 1586716065 1499 de0ad166b701b820e03588a29bb30798 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty" 1586716065 4631 6e41de2b7a83dfa5d2c4b0a2fe01f046 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd" 1137110629 411 12564a37a279e4e0b533cdf5e03eeb7c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd" 1137110629 348 f4ce75d394e7d9ac12ca7aac4045ed77 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd" 1137110629 329 c8cddcc90b6f567b28408eb374773c9c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd" 1137110629 961 15056f4a61917ceed3a44e4ac11fcc52 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd" 1137110629 329 aee7226812ba4138ac67a018466b488d "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd" 1586716065 1483 47067fbe7c3ffed1ede7aaa7b8549d7a "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd" 1137110629 774 61d7da1e9f9e74989b196d147e623736 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd" 1137110629 619 96f56dc5d1ef1fe1121f1cfeec70ee0c "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1657483315 9714 ba3194bd52c8499b3f1e3eb91d409670 "" - "/usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 "" - "/usr/local/texlive/2024/texmf-dist/web2c/texmf.cnf" 1719785820 42007 0b741a3c21a5ca32b40e3846e75b3548 "" - "/usr/local/texlive/2024/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1726064662 5498206 6c0f03cb370063b7ddbd563e5f9ce23a "" - "/usr/local/texlive/2024/texmf-var/web2c/pdftex/pdflatex.fmt" 1726064801 3326093 ffa583039ecb32896d937cb909ab926e "" - "/usr/local/texlive/2024/texmf.cnf" 1726064657.46038 455 5b996dcaa0eb4ef14a83b026bc0a008c "" - "forms.aux" 1765202050.83191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" - "forms.bbl" 1765202050.88191 0 d41d8cd98f00b204e9800998ecf8427e "bibtex forms" - "forms.ind" 1765202050.68191 0 d41d8cd98f00b204e9800998ecf8427e "makeindex forms.idx" - "forms.out" 1765202050.85191 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" - "forms.tex" 1765202047.83191 150901 1d8e9e906ffab0953d2497743708af55 "" - "forms.toc" 1765202050.11191 9035 1035c02923f0f40ca577d4540a04a69d "pdflatex" - (generated) - "forms.aux" - "forms.idx" - "forms.log" - "forms.out" - "forms.pdf" - "forms.pnr" - "forms.toc" - (rewritten before read) diff --git a/doc/forms.fls b/doc/forms.fls deleted file mode 100644 index 4f602b0..0000000 --- a/doc/forms.fls +++ /dev/null @@ -1,295 +0,0 @@ -PWD /home/peter/BA/forms-pkg/forms/doc -INPUT /usr/local/texlive/2024/texmf.cnf -INPUT /usr/local/texlive/2024/texmf-dist/web2c/texmf.cnf -INPUT /usr/local/texlive/2024/texmf-var/web2c/pdftex/pdflatex.fmt -INPUT /home/peter/BA/forms-pkg/forms/doc/forms.tex -OUTPUT forms.log -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/report.cls -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/size11.clo -INPUT /usr/local/texlive/2024/texmf-dist/fonts/map/fontname/texfonts.map -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/geometry/geometry.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/ifvtex.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amssymb.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/amsfonts/amsfonts.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/inputenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/makeidx.sty -OUTPUT forms.idx -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/color.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-cfg/color.cfg -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics-def/pdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/graphics/mathcolor.ltx -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/mathptmx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/helvet.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/fontenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/textcomp.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hyperref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdfescape/pdfescape.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hycolor/hycolor.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/nameref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/stringenc/stringenc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/pd1enc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/intcalc/intcalc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/puenc.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/backref.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/atveryend/atveryend.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atveryend-ltx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/url/url.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/bitset/bitset.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/generic/atbegshi/atbegshi.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/atbegshi-ltx.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/hyperref/hpdftex.def -OUTPUT forms.pnr -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/enumitem/enumitem.sty -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def -INPUT ./forms.aux -INPUT ./forms.aux -INPUT forms.aux -OUTPUT forms.aux -INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -INPUT /usr/local/texlive/2024/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -OUTPUT forms.out -OUTPUT forms.pdf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/base/t1cmtt.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1000.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-var/fonts/map/pdftex/updmap/pdftex.map -INPUT /usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/base/8r.enc -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ts1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmro8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmro8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf -OUTPUT forms.toc -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/t1phv.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectt1095.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/helvetic/phvr8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/helvetic/phvr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omlztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omsztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/omxztmcm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/tex/latex/psnfss/ot1ptm.fd -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7m.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7y.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/zptmcm7v.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7m.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/psyro.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7y.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/rsfs/rsfs10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmrc8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecit1095.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmrc8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ectc1095.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/jknappen/ec/ecst1095.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/vf/adobe/times/zptmcm7v.vf -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmex10.tfm -INPUT /usr/local/texlive/2024/texmf-dist/fonts/tfm/adobe/symbol/psyr.tfm -INPUT ./forms.bbl -INPUT ./forms.bbl -INPUT forms.bbl -INPUT forms.aux -INPUT ./forms.out -INPUT ./forms.out -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sfst1095.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftc1095.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1000.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/symbol/usyr.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmb8a.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmr8a.pfb -INPUT /usr/local/texlive/2024/texmf-dist/fonts/type1/urw/times/utmri8a.pfb diff --git a/lib/formspace.gi b/lib/formspace.gi index 9bfde86..0b7e330 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -233,7 +233,7 @@ __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q return RootFFE(F, Inverse(lambda), q - 1); end; -# find symplectic and symmetric forms +# find symplectic and symmetric matrices in Forms __FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) # TODO end; From db5c8b3034682c664a7bc9043ddcc7c002d72056 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Thu, 11 Dec 2025 17:39:25 +0100 Subject: [PATCH 17/21] Added function Filter Formspace to compute Symmetric/Symplectic/Hermitian matrices: TODO: The case of characteristic two is still open for hermitian matrices and probably very poorly implemented for symmetric matrices --- lib/formspace.gd | 5 +- lib/formspace.gi | 191 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 170 insertions(+), 26 deletions(-) diff --git a/lib/formspace.gd b/lib/formspace.gd index 542a279..835ecba 100644 --- a/lib/formspace.gd +++ b/lib/formspace.gd @@ -1,5 +1,4 @@ -# #! @Arguments matrix group, scalars, unitary -# #! @Returns a basis of the formspace preserved by group modulo scalars consisting of bilinear forms if unitary = false and unitary forms if unitary = true DeclareOperation("PreservedFormspace", [IsMatrixGroup, IsVector and IsFFECollection, IsBool]); +DeclareOperation("PreservedFormspace", [IsMatrixGroup]); -DeclareOperation("PreservedFormspace", [IsMatrixGroup]); \ No newline at end of file +DeclareOperation("FilterFormspace", [IsList, IsFinite and IsField, IsBool]); \ No newline at end of file diff --git a/lib/formspace.gi b/lib/formspace.gi index 0b7e330..54bc710 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -108,6 +108,16 @@ __FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) return A; end; +# turns the F^{j times n} matrix into F^{jn} vector +__FORMSPACE__INTERNAL__MatrixReorganize := function(mat, j, F, n) + local vec, i; + vec := ZeroVector(F, j*n); + for i in [1..j] do + vec{[((i - 1) * n + 1)..(i*n)]} := mat[i]; + od; + return vec; +end; + # Evaluates the univariate polynomial p (given as coefficients) in the matrix g \in F^{n\times n}. frob_base = FrobeniusNormalForm(g) must be satisfied and frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]). The reason these two parameters are given, and not computed in the function itself is to not compute FrobeniusNormalForm(g) multiple times when evaluating multiple polynomials in g. __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) # frob_base_inv useless, right now this is not actually evaluating the polynomial frob_base_inv missing local ws, C, i, end_pos, j, k; @@ -219,7 +229,7 @@ __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q for j in [1..n] do if Form[i][j] <> Zero(F) then if Form[j][i] = Zero(F) then - return []; + return fail; fi; if lambda <> fail and Form[i][j] * lambda <> hom(Form[j][i]) then return fail; @@ -234,14 +244,105 @@ __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q end; # find symplectic and symmetric matrices in Forms +# returns bases [[symmetric forms], [symplectic forms]] __FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) - # TODO + local transposed_equal_result, form, symmetric_base, symplectic_base, transposed_form, TransposedEqual, symmetric_base_vecs, symplectic_base_vecs, char_2_eqs, sol, out; + + # computes if f = f^T or f = -f^T or none + # return 0 if f = -f^T + # return 1 if f = f^T + # return 2 if f <> f^T and f <> -f^T + TransposedEqual := function(f, F, n) + local i, j, symmetric_possible, symplectic_possible; + + if Characteristic(F) mod 2 = 0 then + # - = + now + for i in [1..n] do + for j in [1..n] do + if f[i][j] <> f[j][i] then + return 2; + fi; + od; + od; + return 1; + fi; + symmetric_possible := true; + symplectic_possible := true; + for i in [1..n] do + for j in [1..n] do + if symmetric_possible and f[i][j] <> f[j][i] then + symmetric_possible := false; + fi; + if symplectic_possible and f[i][j] <> -f[j][i] then + symplectic_possible := false; + fi; + od; + od; + if symmetric_possible then + return 1; + fi; + if symplectic_possible then + return 0; + fi; + return 2; + end; + + if Size(Forms) = 0 then + return []; + fi; + if Size(Forms) = 1 then + transposed_equal_result := TransposedEqual(Forms[1], F, n); + if transposed_equal_result = 2 then + return []; + fi; + if transposed_equal_result = 1 then + return [[Forms[1]], []]; + fi; + if transposed_equal_result = 2 then + return [[], [Forms[1]]]; + fi; + + fi; + + if Characteristic(F) mod 2 <> 0 then + symmetric_base := MutableBasis(F, [NullMat(n, n, F)]); + symplectic_base := MutableBasis(F, [NullMat(n, n, F)]); + for form in Forms do + transposed_form := TransposedMat(form); + CloseMutableBasis(symmetric_base, transposed_form + form); + 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 + symmetric_base_vecs := BasisVectors(ImmutableBasis(symmetric_base)); + symplectic_base_vecs := BasisVectors(ImmutableBasis(symplectic_base)); + + if Size(symmetric_base_vecs) + Size(symplectic_base_vecs) <> Size(Forms) then + Error("This should not have happend!! there are supposedly ", Size(symmetric_base_vecs), " linearly independent symmetric forms and ", Size(symplectic_base_vecs), " linearly independent symplectic forms, yet the dimension of the formspace is ", Size(Forms), "\n"); + fi; + return [symmetric_base_vecs, symplectic_base_vecs]; + + fi; + # TODO: ignore the diagonal entries for the symmetric matrices, for symplectic these need to be zero. + # TODO: solve this in some efficient way that does not formulate this by solving sets of linear equations of matrices. Instead it would be better to gradually consider entries of the matrices. Then use some heuristic to determine we are done and just check wether the resulting matrices are infact symmetric. this should be faster because now worst case we are solving a system of linear equations that consists of n^2 equations and Size(Forms) indeterminates. + # TODO: maybe do these todos for all characteristics the nice thing about the current algorithm for char F <> 2 is that we do not have to solve many systems of equations, rather just check wether we have the zero matrix + + char_2_eqs := []; + for form in Forms do + Add(char_2_eqs, __FORMSPACE__INTERNAL__MatrixReorganize(form - TransposedMat(form), n, F, n)); + od; + sol := NullspaceMatDestructive(char_2_eqs); + out := []; + for form in sol do + Add(out, __FORMSPACE__INTERNAL__VectorReorganize(form, n, F, n)); + od; + return out; end; # tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION # there must be a better way to compute these matrices.. __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) - local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs; + local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base; if Size(Forms) = 0 then return []; fi; @@ -257,7 +358,7 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) return []; fi; - return [HermitianFormByMatrix(Forms[1] * l, F)]; + return [Forms[1] * l]; fi; # this is where it gets interesting # Print("ahhh this needs work!\n"); @@ -267,31 +368,45 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) ## 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 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 :( ## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well - Base := MutableBasis(F, [NullMat(n, n, F)]); - for FF in Forms do - l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(FF, F, n, hom, p, q); - if l = fail then + if Characteristic(F) mod 2 <> 0 then + Base := MutableBasis(F, [NullMat(n, n, F)]); + gf_base := BasisVectors(Basis(GF(GF(q), 2)))[2]; + for FF in Forms do + Add(FF, gf_base * FF); + od; + for FF in Forms do + # l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(FF, F, n, hom, p, q); + # if l = fail then tr_form := TransposedMat(FF^hom); CloseMutableBasis(Base, FF + tr_form); - else - CloseMutableBasis(Base, l * FF); - fi; - od; + # else + # CloseMutableBasis(Base, l * FF); + # fi; + od; - O := []; - baseVecs := ImmutableBasis(Base); - for FF in baseVecs do - Add(O, HermitianFormByMatrix(FF, F)); - od; + O := []; + baseVecs := ImmutableBasis(Base); + # for FF in baseVecs do + # Add(O, HermitianFormByMatrix(FF, F)); + # od; - if Size(O) = Size(Forms) then - return O; - fi; + # if Size(O) = Size(Forms) then + # return O; + # fi; + # if Size(baseVecs) = Size(Forms) then + # return baseVecs; + # fi; - Print("Could not find a basis of Forms. Returned hermitian Forms, Bigger space of matrices that contains all possible hermitian forms. \n"); - return [O, Forms]; + return BasisVectors(baseVecs); + fi; + Print("char 2 case is missing!!"); + # # TODO this function definetly needs work!!! + # 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"); + # return [baseVecs, Forms]; end; + + # Compute the formspace for cyclic matrix group. TODO!! __FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, frob_inv_base_change, F, n) # maybe recoginize the trivial group here as a special case @@ -399,6 +514,7 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom return O; end; + #! @Arguments G, L, unitary #! @Returns a basis of $\mathcal{F}_h(G, \Lambda)$ #! @Description @@ -529,4 +645,33 @@ InstallMethod(PreservedFormspace, fi; return Out; end -); \ No newline at end of file +); + +#! @Arguments Forms, Field, unitary +#! @Returns basis of the spaces of symmetric/symplectic matrices or a basis of the hermitian matrices contained in Forms +#! @Description +#! In the case where unitary is false, this will return a list that contains to lists of matrices. The first is a basis of the symmetric matrices, the second is a basis of the symplectic matrices. Be carefull: If the characteristic of the field is 2, then symplectic matrices and symmetric matrices are the same. Hence only one basis will be returned. If unitary is false this will return a basis of the hermitian matrices. +#! The reason the the field must be given as an argument, is so that the Field automorphims of order two, which is used to compute the adjoined, is specified. +InstallMethod(FilterFormspace, "for list of matrices, F finite field, bool hermitian", [IsList, IsFinite and IsField, IsBool], function(Forms, F, unitary) + local n, hom, p_exponent; + if Size(Forms) = 0 then + return []; + fi; + n := NrRows(Forms[1]); + + if Size(Forms) = n^2 then + # TODO: special case where we should just return a precomputed basis... + fi; + + if not unitary then + return __FORMSPACE__INTERNAL__FilterBilinearForms(Forms, F, n); + else + p_exponent := DegreeOverPrimeField(F); + if p_exponent mod 2 <> 0 then + Error("The given Field ", F, " must admit a field automorphism of order two for unitary = true\n"); + return []; + fi; + hom := FrobeniusAutomorphism(F)^(p_exponent/2); + return __FORMSPACE__INTERNAL__FilterUnitaryForms(Forms, F, n, hom); + fi; +end); \ No newline at end of file From 5fea15861f7365cafcfa645d4ca3babbd97f0c11 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Mon, 15 Dec 2025 16:56:06 +0100 Subject: [PATCH 18/21] made filter unitary forms return a gf(q) basis (instead of a weird gf(q^2) one, added comment for todo regarding the forms computation for cyclic groups --- lib/formspace.gi | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/formspace.gi b/lib/formspace.gi index 54bc710..c3ea532 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -342,7 +342,7 @@ end; # tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION # there must be a better way to compute these matrices.. __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) - local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base; + local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base; if Size(Forms) = 0 then return []; fi; @@ -369,16 +369,15 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) ## 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 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 :( ## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well if Characteristic(F) mod 2 <> 0 then - Base := MutableBasis(F, [NullMat(n, n, F)]); + Base := MutableBasis(GF(q), [NullMat(n, n, F)]); gf_base := BasisVectors(Basis(GF(GF(q), 2)))[2]; - for FF in Forms do - Add(FF, gf_base * FF); - od; + hgf_base := hom(gf_base); for FF in Forms do # l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(FF, F, n, hom, p, q); # if l = fail then tr_form := TransposedMat(FF^hom); CloseMutableBasis(Base, FF + tr_form); + CloseMutableBasis(Base, gf_base * FF + hgf_base*tr_form); # else # CloseMutableBasis(Base, l * FF); # fi; @@ -407,7 +406,10 @@ end; -# Compute the formspace for cyclic matrix group. TODO!! +# Compute the formspace for cyclic matrix group. +# TODO: optimizations: +# this function (sometimes) yields a very large formspace +# to better recognize forms in this case it would be good to add a function that does not do this (since we only care about non degenerate classical forms). to find a bilinear/symplectic/hermitian form we can just compute a invertibe matrix S such that gS = Sg^{-*} (with frobenius normal form) and hope that S + S^*, S - S^* are also inevertible. Then we have found symmetric/symplectic non degenrate forms This seems like a good idea? idk __FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, frob_inv_base_change, F, n) # maybe recoginize the trivial group here as a special case local p, mat, outspace, i, j, w, OutForms; From 902f5fde40292cecfa542b88d933856bc4dc239f Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Mon, 15 Dec 2025 16:58:54 +0100 Subject: [PATCH 19/21] replaced prefix for internal methods --- lib/formspace.gi | 78 ++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/lib/formspace.gi b/lib/formspace.gi index c3ea532..f4fc69d 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -5,7 +5,7 @@ #! For details on how the form space is computed SEE: somewhere that does not exist yet # underlying field F, g is in F^{n\times n}, v is in F^n, coeffs are the coefficients of a polynomial p in F[X]. Returns vp(g). -__FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) +FORMS_EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) local res, i, deg; deg := Size(coeffs); v := Vector(v); @@ -28,7 +28,7 @@ end; # Given mat in F^{n\times n} F Field, n \in N, mode says whether to apply hom or not. Returns (mat^T)^hom. # mode = False \iff mat* := mat^tr, mode = True \iff mat* = komplex_konjugiert(mat^tr) -__FORMSPACE__INTERNAL__CalculateAdjoint := function(mat, mode, hom, n, F) +FORMS_CalculateAdjoint := function(mat, mode, hom, n, F) local transposed, i, j; transposed := TransposedMat(mat); ConvertToMatrixRep(transposed, F); @@ -44,7 +44,7 @@ end; # tries to find a element g \in such that the Frobenius Normal form of g has as few blocks as possible. Lambdas describes a group homomorphism induced by Phi : Gens[i] \mapsto Lambdas[i] # Returns [g, Phi(g), FrobeniusNormalForm(g), nrOfTries] # nrOfTries contains the number of random elements tested before g was found. -__FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambdas) +FORMS_FindCyclicGroupElementAndScalars := function(Gens, Lambdas) local cur_group_element, cur_scalar, known_elements, i, mode, n, res, j, known_scalars, best_known_element_index, best_known_res, best_known_length, mod_elem, g, e; known_elements := ShallowCopy(Gens); @@ -98,7 +98,7 @@ __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars := function(Gens, Lambda end; # turns the (jn) vector vec in F^{jn} and returns a F^{j times n} matrix -__FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) +FORMS_VectorReorganize := function(vec, j, F, n) local A, i; A := NullMat(j, n, F); ConvertToMatrixRep(A, F); @@ -109,7 +109,7 @@ __FORMSPACE__INTERNAL__VectorReorganize := function(vec, j, F, n) end; # turns the F^{j times n} matrix into F^{jn} vector -__FORMSPACE__INTERNAL__MatrixReorganize := function(mat, j, F, n) +FORMS_MatrixReorganize := function(mat, j, F, n) local vec, i; vec := ZeroVector(F, j*n); for i in [1..j] do @@ -119,13 +119,13 @@ __FORMSPACE__INTERNAL__MatrixReorganize := function(mat, j, F, n) end; # Evaluates the univariate polynomial p (given as coefficients) in the matrix g \in F^{n\times n}. frob_base = FrobeniusNormalForm(g) must be satisfied and frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]). The reason these two parameters are given, and not computed in the function itself is to not compute FrobeniusNormalForm(g) multiple times when evaluating multiple polynomials in g. -__FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) # frob_base_inv useless, right now this is not actually evaluating the polynomial frob_base_inv missing +FORMS_EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) # frob_base_inv useless, right now this is not actually evaluating the polynomial frob_base_inv missing local ws, C, i, end_pos, j, k; ws := []; j := Size(frob_base[3]); for k in [1..j] do # function(F, n, g, v, coeffs) - Add(ws, __FORMSPACE__INTERNAL__EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); + Add(ws, FORMS_EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); od; C := NullMat(n, n, F); #ConvertToMatrixRep(C, F); @@ -156,7 +156,7 @@ end; # This computes (and returns) the matrix \mathcal{P}_{h, u} from the bachelors thesis. # Here we have u, h \in F^{n\times n}, h_star = h^*, scalar_h = \lambda_h, g_star_inv_scaled = g^{-*}*lambda_g, frob_base = FrobeniusNormalForm(g^{-*}), frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]), frob_base_inv_star = Inverse(frob_base[2]). The reason we to give ten billion parameters is to avoid computing the same matrices multiple times. TODO: better names!!!!!! -__FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) +FORMS_ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_scaled, frob_base, frob_base_inv, frob_base_inv_star, F, n) local coeffs_c, coeffs_f, Ps, i, j, b_end, b_start, cpol, fpol; coeffs_c := (u * h) * frob_base_inv; coeffs_f := (u * frob_base_inv) * scalar_h; @@ -174,7 +174,7 @@ __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scal # Print("[", ((i - 1)*n + 1), ",", (i*n), "\n"); #Print("->", frob_base[3][i],",",b_end, "\n"); Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := - __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs_c{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n) * h_star - __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs_f{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n); + FORMS_EvaluatePolynomialWithFrobenius(coeffs_c{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n) * h_star - FORMS_EvaluatePolynomialWithFrobenius(coeffs_f{[frob_base[3][i]..b_end]}, g_star_inv_scaled, frob_base, frob_base_inv_star, F, n); # cpol := UnivariatePolynomial(F, coeffs_c); # fpol := UnivariatePolynomial(F, coeffs_f); # Ps{[((i - 1)*n + 1)..(i*n)]}{[1..n]} := @@ -185,7 +185,7 @@ __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob := function(u, h, h_star, scal end; # Spins the stuff -__FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) +FORMS_FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) local A, j, i, k, end_pos; j := Size(frob_base_blocks); A := NullMat(n, n, F); @@ -204,7 +204,7 @@ __FORMSPACE__INTERNAL__FrobSpin := function(Images, spin_elem, frob_base_blocks, return A; end; -__FORMSPACE__INTERNAL__FrobSpinAtBlock := function(Image, spin_elem, frob_base_blocks, block_index, n, F) +FORMS_FrobSpinAtBlock := function(Image, spin_elem, frob_base_blocks, block_index, n, F) local A, j, i, k, end_pos; j := Size(frob_base_blocks); A := NullMat(n, n, F); @@ -222,7 +222,7 @@ __FORMSPACE__INTERNAL__FrobSpinAtBlock := function(Image, spin_elem, frob_base_b end; # checks if (Form^T)^hom = c Form for some c in F and returns d such that d * Form = ((d Form)^T)^hom if possible or if not possibe fail -__FORMSPACE__INTERNAL__ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q) +FORMS_ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q) local lambda, i, j; lambda := fail; for i in [1..n] do @@ -245,7 +245,7 @@ end; # find symplectic and symmetric matrices in Forms # returns bases [[symmetric forms], [symplectic forms]] -__FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) +FORMS_FilterBilinearForms := function(Forms, F, n) local transposed_equal_result, form, symmetric_base, symplectic_base, transposed_form, TransposedEqual, symmetric_base_vecs, symplectic_base_vecs, char_2_eqs, sol, out; # computes if f = f^T or f = -f^T or none @@ -329,19 +329,19 @@ __FORMSPACE__INTERNAL__FilterBilinearForms := function(Forms, F, n) char_2_eqs := []; for form in Forms do - Add(char_2_eqs, __FORMSPACE__INTERNAL__MatrixReorganize(form - TransposedMat(form), n, F, n)); + Add(char_2_eqs, FORMS_MatrixReorganize(form - TransposedMat(form), n, F, n)); od; sol := NullspaceMatDestructive(char_2_eqs); out := []; for form in sol do - Add(out, __FORMSPACE__INTERNAL__VectorReorganize(form, n, F, n)); + Add(out, FORMS_VectorReorganize(form, n, F, n)); od; return out; end; # tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION # there must be a better way to compute these matrices.. -__FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) +FORMS_FilterUnitaryForms := function(Forms, F, n, hom) local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base; if Size(Forms) = 0 then return []; @@ -353,7 +353,7 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) #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) # 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. # Print(ff); - l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(Forms[1], F, n, hom, p, q); + l := FORMS_ScalarFormIdentifyCheck(Forms[1], F, n, hom, p, q); if l = fail then return []; fi; @@ -373,7 +373,7 @@ __FORMSPACE__INTERNAL__FilterUnitaryForms := function(Forms, F, n, hom) gf_base := BasisVectors(Basis(GF(GF(q), 2)))[2]; hgf_base := hom(gf_base); for FF in Forms do - # l := __FORMSPACE__INTERNAL__ScalarFormIdentifyCheck(FF, F, n, hom, p, q); + # l := FORMS_ScalarFormIdentifyCheck(FF, F, n, hom, p, q); # if l = fail then tr_form := TransposedMat(FF^hom); CloseMutableBasis(Base, FF + tr_form); @@ -410,13 +410,13 @@ end; # TODO: optimizations: # this function (sometimes) yields a very large formspace # to better recognize forms in this case it would be good to add a function that does not do this (since we only care about non degenerate classical forms). to find a bilinear/symplectic/hermitian form we can just compute a invertibe matrix S such that gS = Sg^{-*} (with frobenius normal form) and hope that S + S^*, S - S^* are also inevertible. Then we have found symmetric/symplectic non degenrate forms This seems like a good idea? idk -__FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, frob_inv_base_change, F, n) +FORMS_CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, Lambda, unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, frob_inv_base_change, F, n) # maybe recoginize the trivial group here as a special case local p, mat, outspace, i, j, w, OutForms; outspace := []; for p in frob[1] do#function(p, g, frob_base, frob_base_inv, F, n) - mat := __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(p), Gen_adjoint_inv_scaled * Lambda, frob_inv_star_scaled, frob_inv_star_base_change, F, n); + mat := FORMS_EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(p), Gen_adjoint_inv_scaled * Lambda, frob_inv_star_scaled, frob_inv_star_base_change, F, n); Add(outspace, NullspaceMatDestructive(mat)); od; OutForms := []; @@ -424,14 +424,14 @@ __FORMSPACE__INTERNAL__CyclicGroupCase := function(Gen, Gen_adjoint_inv_scaled, for i in [1..Size(outspace)] do for w in outspace[i] do - Add(OutForms, frob_inv_base_change * __FORMSPACE__INTERNAL__FrobSpinAtBlock(w, Gen_adjoint_inv_scaled, frob[3], i, n, F)); + Add(OutForms, frob_inv_base_change * FORMS_FrobSpinAtBlock(w, Gen_adjoint_inv_scaled, frob[3], i, n, F)); od; od; return OutForms; end; # Returns formspace preserved by the group modulo Lambdas. Unitary says wheter to look for unitary forms or not. hom can be the Field Automorphism of order two. g_res = [g, Lambda_g, ## The elements of ## FrobeniusNormalForm(g)]. Where g is randomly determenied. g_inv_frob = Inverse(FrobeniusNormalForm(g)[2]). g_star_inv_scaled = g^{-*} * Lambda_g, g_star_inv_scaled_frob = FrobeniusNormalForm(g^{-*} * Lambda_g), frob_base_inv_star = Inverse(g_star_inv_scaled_frob[2]). d = Size(Gens), F is base field and n is the matrix dimension. -__FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) +FORMS_FormspaceInternal := function(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_scaled, g_star_inv_scaled_frob, frob_base_inv_star, d, F, n) local k, i, W, first, j, Cond, Conds, h_star, h, w, O, needs_checking, A, failed_check, nspace, vec; first := true; @@ -442,13 +442,13 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom break; fi; h := Gens[i]; - h_star := __FORMSPACE__INTERNAL__CalculateAdjoint(h, unitary, hom, n, F); + h_star := FORMS_CalculateAdjoint(h, unitary, hom, n, F); for j in [1..n] do # vec := RandomVector(F, n); vec := g_res[4][j]; # Display(vec); Conds := - __FORMSPACE__INTERNAL__ComputeConditionMatrixFrob(vec, h, h_star, Lambdas[i], g_star_inv_scaled, g_star_inv_scaled_frob, g_inv_frob, frob_base_inv_star, F, n); + FORMS_ComputeConditionMatrixFrob(vec, h, h_star, Lambdas[i], g_star_inv_scaled, g_star_inv_scaled_frob, g_inv_frob, frob_base_inv_star, F, n); ConvertToMatrixRep(Conds, F); if not first then @@ -481,12 +481,12 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom # W := frob_base_inv_star * W; # Print(WWW); for w in W do - A := g_inv_frob * __FORMSPACE__INTERNAL__FrobSpin(__FORMSPACE__INTERNAL__VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); + A := g_inv_frob * FORMS_FrobSpin(FORMS_VectorReorganize(w, Size(g_res[5]), F, n), g_star_inv_scaled, g_res[5], n, F); ## This whole checking should be removed, it is stupid to always check!!! if needs_checking then failed_check := false; for i in [1..d] do - if not failed_check and Gens[i] * A * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n, F) <> Lambdas[i] * A then + if not failed_check and Gens[i] * A * FORMS_CalculateAdjoint(Gens[i], unitary, hom, n, F) <> Lambdas[i] * A then failed_check := true; fi; od; @@ -511,7 +511,7 @@ __FORMSPACE__INTERNAL__FormspaceInternal := function(Gens, Lambdas, unitary, hom fi; od; # if unitary then - # return __FORMSPACE__INTERNAL__FilterUnitaryForms(O, F, n, hom); + # return FORMS_FilterUnitaryForms(O, F, n, hom); # fi; return O; end; @@ -548,16 +548,16 @@ InstallMethod(PreservedFormspace, if d = 1 then Gen := Gens[1]; - Gen_adjoint := __FORMSPACE__INTERNAL__CalculateAdjoint(Gen, unitary, hom, n, F); + Gen_adjoint := FORMS_CalculateAdjoint(Gen, unitary, hom, n, F); Gen_adjoint_inv_scaled := Lambda[1]*Inverse(Gen_adjoint); frob := FrobeniusNormalForm(Gen); frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); - return __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, Lambda[1], unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, Inverse(frob[2]), F, n); + return FORMS_CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, Lambda[1], unitary, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, Inverse(frob[2]), F, n); fi; #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute - g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); + g_res := FORMS_FindCyclicGroupElementAndScalars(Gens, Lambdas); g_inv_frob := Inverse(g_res[4]); #CalculateAdjoint := function(mat, mode, hom, n) g_star_inv_unscaled := TransposedMat(Inverse(g_res[1])); @@ -569,7 +569,7 @@ InstallMethod(PreservedFormspace, g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled * g_res[2]); frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); - return __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n); + return FORMS_FormspaceInternal(Gens, Lambdas, unitary, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n); end ); @@ -596,14 +596,14 @@ InstallMethod(PreservedFormspace, if d = 1 then # Todo.... !! Gen := Gens[1]; - Gen_adjoint := __FORMSPACE__INTERNAL__CalculateAdjoint(Gen, false, fail, n, F); + Gen_adjoint := FORMS_CalculateAdjoint(Gen, false, fail, n, F); Gen_adjoint_inv_scaled := One(F)*Inverse(Gen_adjoint); # scaling happens here!! frob := FrobeniusNormalForm(Gen); frob_inv_star_scaled := FrobeniusNormalForm(Gen_adjoint_inv_scaled); frob_inv_star_base_change := Inverse(frob_inv_star_scaled[2]); g_inv_frob := Inverse(frob[2]); - Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), false, fail, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); + Add(Out, FORMS_CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), false, fail, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); if p_exponent mod 2 = 0 then hom := FrobeniusAutomorphism(F)^(p_exponent/2); @@ -611,7 +611,7 @@ InstallMethod(PreservedFormspace, frob_inv_star_base_change := frob_inv_star_base_change^hom; frob_inv_star_scaled[2] := frob_inv_star_scaled[2]^hom; - Add(Out, __FORMSPACE__INTERNAL__CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), true, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); + Add(Out, FORMS_CyclicGroupCase(Gen, Gen_adjoint_inv_scaled, One(F), true, hom, frob, frob_inv_star_scaled, frob_inv_star_base_change, g_inv_frob, F, n)); else Add(Out, []); fi; @@ -623,7 +623,7 @@ InstallMethod(PreservedFormspace, Add(Lambdas, One(F)); od; #contains group element, scalar, (factors of minopol), Basis change to Frobenius (v, vg, vg^2, ...), Frobenius block lengths, number of iterations to compute - g_res := __FORMSPACE__INTERNAL__FindCyclicGroupElementAndScalars(Gens, Lambdas); + g_res := FORMS_FindCyclicGroupElementAndScalars(Gens, Lambdas); ConvertToMatrixRep(g_res[1], F); ConvertToMatrixRep(g_res[4], F); g_inv_frob := Inverse(g_res[4]); @@ -634,14 +634,14 @@ InstallMethod(PreservedFormspace, g_star_inv_scaled_frob := FrobeniusNormalForm(g_star_inv_unscaled); # hier ist eventuell noch ein bug mit den skalaren frob_base_inv_star := Inverse(g_star_inv_scaled_frob[2]); - Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + Add(Out, FORMS_FormspaceInternal(Gens, Lambdas, false, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); if p_exponent mod 2 = 0 then # is ^hom actually cheaper than computing the frobenius normal form?? investigate! certainly makes the code ugly... oh well hom := FrobeniusAutomorphism(F)^(p_exponent/2); g_star_inv_unscaled := g_star_inv_unscaled^hom; g_star_inv_scaled_frob[2] := g_star_inv_scaled_frob[2]^hom; frob_base_inv_star := frob_base_inv_star^hom; - Add(Out, __FORMSPACE__INTERNAL__FormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); + Add(Out, FORMS_FormspaceInternal(Gens, Lambdas, true, hom, g_res, g_inv_frob, g_star_inv_unscaled * g_res[2], g_star_inv_scaled_frob, frob_base_inv_star, d, F, n)); else Add(Out, []); fi; @@ -666,7 +666,7 @@ InstallMethod(FilterFormspace, "for list of matrices, F finite field, bool hermi fi; if not unitary then - return __FORMSPACE__INTERNAL__FilterBilinearForms(Forms, F, n); + return FORMS_FilterBilinearForms(Forms, F, n); else p_exponent := DegreeOverPrimeField(F); if p_exponent mod 2 <> 0 then @@ -674,6 +674,6 @@ InstallMethod(FilterFormspace, "for list of matrices, F finite field, bool hermi return []; fi; hom := FrobeniusAutomorphism(F)^(p_exponent/2); - return __FORMSPACE__INTERNAL__FilterUnitaryForms(Forms, F, n, hom); + return FORMS_FilterUnitaryForms(Forms, F, n, hom); fi; end); \ No newline at end of file From 8d6449a024fe5b73debb98691ac9e9845ba9b5bc Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Mon, 15 Dec 2025 16:59:30 +0100 Subject: [PATCH 20/21] fixed test (new prefix) --- tst/formspace/custom_test_functions.g | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tst/formspace/custom_test_functions.g b/tst/formspace/custom_test_functions.g index 561bf85..2eb8ae6 100644 --- a/tst/formspace/custom_test_functions.g +++ b/tst/formspace/custom_test_functions.g @@ -35,7 +35,7 @@ TestPolyEval := function(benchmark) f := UnivariatePolynomial(F, coeffs); time_start := NanosecondsSinceEpoch(); frob := FrobeniusNormalForm(mat); - eval := __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(coeffs, Matrix(mat), frob, Inverse(frob[2]), F, n); + eval := FORMS_EvaluatePolynomialWithFrobenius(coeffs, Matrix(mat), frob, Inverse(frob[2]), F, n); time_average_frob := time_average_frob + (NanosecondsSinceEpoch() - time_start); time_start := NanosecondsSinceEpoch(); @@ -75,7 +75,7 @@ TestMatricesAreForms := function(G, Lambdas, unitary, forms) f := forms[i]; for j in [1..Size(Gens)] do g := Gens[j]; - if g * f * __FORMSPACE__INTERNAL__CalculateAdjoint(g, unitary, hom, n, F) <> Lambdas[j] * f then + if g * f * FORMS_CalculateAdjoint(g, unitary, hom, n, F) <> Lambdas[j] * f then Error("Computed non formspace element ", f, "group " , G, " unitary ", unitary, " Lambdas ", Lambdas); fi; od; @@ -153,7 +153,7 @@ TestComputeFormspaceBruteForce := function(G, Lambdas, unitary) for j in [1..Size(base)] do for i in [1..Size(Gens)] do b := base[j]; - v := MatrixToVector(Gens[i] * b * __FORMSPACE__INTERNAL__CalculateAdjoint(Gens[i], unitary, hom, n, F) - Lambdas[i] * b, F, n); + v := MatrixToVector(Gens[i] * b * FORMS_CalculateAdjoint(Gens[i], unitary, hom, n, F) - Lambdas[i] * b, F, n); if i = 1 then Add(eqs, v); else From 89a2aa2178a306e0f89edb9038cddfce3dcb7f89 Mon Sep 17 00:00:00 2001 From: Peter Seidemann Date: Mon, 15 Dec 2025 18:26:45 +0100 Subject: [PATCH 21/21] changed most of max nitpicks --- PackageInfo.g | 2 +- init.g | 2 - lib/formspace.gd | 2 +- lib/formspace.gi | 154 +++++++++++++------------- tst/formspace/custom_test_functions.g | 36 +----- tst/interesting_groups.g | 4 +- 6 files changed, 88 insertions(+), 112 deletions(-) diff --git a/PackageInfo.g b/PackageInfo.g index 68f57cc..4ae14a1 100644 --- a/PackageInfo.g +++ b/PackageInfo.g @@ -99,7 +99,7 @@ PackageDoc := rec( Dependencies := rec( GAP := ">=4.9", - NeededOtherPackages := [], + NeededOtherPackages := [["nofoma", "1.0"]], SuggestedOtherPackages := [], ExternalConditions := []), diff --git a/init.g b/init.g index 762f871..2c82f60 100644 --- a/init.g +++ b/init.g @@ -12,8 +12,6 @@ ## ############################################################################# - ReadPackage("forms","lib/forms.gd"); ReadPackage("forms","lib/recognition.gd"); -LoadPackage("nofoma"); ReadPackage("forms","lib/formspace.gd"); \ No newline at end of file diff --git a/lib/formspace.gd b/lib/formspace.gd index 835ecba..817f6c0 100644 --- a/lib/formspace.gd +++ b/lib/formspace.gd @@ -1,4 +1,4 @@ DeclareOperation("PreservedFormspace", [IsMatrixGroup, IsVector and IsFFECollection, IsBool]); DeclareOperation("PreservedFormspace", [IsMatrixGroup]); -DeclareOperation("FilterFormspace", [IsList, IsFinite and IsField, IsBool]); \ No newline at end of file +DeclareOperation("FilterFormspace", [IsList, IsFinite and IsField, IsBool]); diff --git a/lib/formspace.gi b/lib/formspace.gi index f4fc69d..5de3e6e 100644 --- a/lib/formspace.gi +++ b/lib/formspace.gi @@ -8,7 +8,7 @@ FORMS_EvaluateMatrixPolynomialWithVector := function(F, n, g, v, coeffs) local res, i, deg; deg := Size(coeffs); - v := Vector(v); + if deg = 0 then return ZeroVector(F, n); fi; @@ -31,10 +31,9 @@ end; FORMS_CalculateAdjoint := function(mat, mode, hom, n, F) local transposed, i, j; transposed := TransposedMat(mat); - ConvertToMatrixRep(transposed, F); + # ConvertToMatrixRep(transposed, F); if mode = false then - return transposed; # this is apparently very slow????? what why? - fi; + return transposed; if mode then return transposed^hom; fi; @@ -50,29 +49,29 @@ FORMS_FindCyclicGroupElementAndScalars := function(Gens, Lambdas) known_elements := ShallowCopy(Gens); known_scalars := ShallowCopy(Lambdas); - n := DimensionsMat(Gens[1])[1]; + n := NrRows(Gens[1]); i := Size(known_elements); mod_elem := 1; best_known_length := n + 1; while i < 25 do # 25 is a magic number. maybe investigate a good number here # no accidental identity mat - if false then + if i < 10 then # dont start with inverting to not accidentally make the identity mode := 1; else - mode := PseudoRandom([1, 2]); + mode := Random(1, 2); fi; - j := PseudoRandom([1..Size(known_elements)]); + j := Random([1..Size(known_elements)]); cur_group_element := known_elements[j]; cur_scalar := known_scalars[j]; if mode = 1 then - j := PseudoRandom([1..Size(known_elements)]); + j := Random([1..Size(known_elements)]); cur_group_element := cur_group_element * known_elements[j]; cur_scalar := cur_scalar * known_scalars[j]; elif mode = 2 then - j := PseudoRandom([1..Size(known_elements)]); - cur_group_element := cur_group_element * Inverse(known_elements[j]); - cur_scalar := cur_scalar * Inverse(known_scalars[j]); + j := Random([1..Size(known_elements)]); + cur_group_element := cur_group_element / known_elements[j]; + cur_scalar := cur_scalar / Inverse(known_scalars[j]); fi; if i mod mod_elem = 0 then res := FrobeniusNormalForm(cur_group_element); @@ -90,7 +89,6 @@ FORMS_FindCyclicGroupElementAndScalars := function(Gens, Lambdas) i := i + 1; od; # Print("only found element of length ", best_known_length, "\n"); - # TODO: möglichst kurze zyklische modul basis usw.... if best_known_length = n + 1 then return Concatenation([Gens[1], Lambdas[1]], FrobeniusNormalForm(Gens[1]), [-1]); fi; @@ -118,37 +116,40 @@ FORMS_MatrixReorganize := function(mat, j, F, n) return vec; end; +# Spins the stuff +FORMS_FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) + local A, j, i, k, end_pos; + j := Size(frob_base_blocks); + A := NullMat(n, n, F); + for i in [1..j] do + if i = j then + end_pos := n; + else + end_pos := frob_base_blocks[i + 1] - 1; + fi; + A[frob_base_blocks[i]] := Images[i]; + for k in [(frob_base_blocks[i] + 1)..end_pos] do + A[k] := A[k - 1]*spin_elem; + od; + od; + ConvertToMatrixRep(A, F); + return A; +end; + # Evaluates the univariate polynomial p (given as coefficients) in the matrix g \in F^{n\times n}. frob_base = FrobeniusNormalForm(g) must be satisfied and frob_base_inv = Inverse(FrobeniusNormalForm(g)[2]). The reason these two parameters are given, and not computed in the function itself is to not compute FrobeniusNormalForm(g) multiple times when evaluating multiple polynomials in g. -FORMS_EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) # frob_base_inv useless, right now this is not actually evaluating the polynomial frob_base_inv missing +FORMS_EvaluatePolynomialWithFrobenius := function(p, g, frob_base, frob_base_inv, F, n) local ws, C, i, end_pos, j, k; ws := []; j := Size(frob_base[3]); for k in [1..j] do - # function(F, n, g, v, coeffs) Add(ws, FORMS_EvaluateMatrixPolynomialWithVector(F, n, g, frob_base[2][frob_base[3][k]]{[1..n]}, p)); od; - C := NullMat(n, n, F); - #ConvertToMatrixRep(C, F); - for k in [1..j] do - end_pos := 0; - if j = k then - end_pos := n; - else - end_pos := frob_base[3][k + 1]; - fi; - for i in [0..(end_pos - frob_base[3][k])] do - if i = 0 then - C[frob_base[3][k] + i] := ws[k]; - else - C[frob_base[3][k] + i] := C[frob_base[3][k] + i - 1]*g; - fi; - od; - od; + C := FORMS_FrobSpin(ws, g, frob_base[3], n, F); ## FrobBasSpin needed? # this mulitiplication might not be needed here # just multiply the found basis in the end when all the condition matrices null spaces got found already (i.e. just return C here)# # this could potentially save up to n*d*B matrix matrix multiplications so quite significant!!! definetly investigate! - ConvertToMatrixRep(C, F); + # ConvertToMatrixRep(C, F); return frob_base_inv * C; #to actually evaluate the polynomial # return frob_base_inv * C; @@ -184,25 +185,7 @@ FORMS_ComputeConditionMatrixFrob := function(u, h, h_star, scalar_h, g_star_inv_ return Ps; end; -# Spins the stuff -FORMS_FrobSpin := function(Images, spin_elem, frob_base_blocks, n, F) - local A, j, i, k, end_pos; - j := Size(frob_base_blocks); - A := NullMat(n, n, F); - for i in [1..j] do - if i = j then - end_pos := n; - else - end_pos := frob_base_blocks[i + 1] - 1; - fi; - A[frob_base_blocks[i]] := Images[i]; - for k in [(frob_base_blocks[i] + 1)..end_pos] do - A[k] := A[k - 1]*spin_elem; - od; - od; - ConvertToMatrixRep(A, F); - return A; -end; + FORMS_FrobSpinAtBlock := function(Image, spin_elem, frob_base_blocks, block_index, n, F) local A, j, i, k, end_pos; @@ -227,15 +210,15 @@ FORMS_ScalarFormIdentifyCheck := function(Form, F, n, hom, p, q) lambda := fail; for i in [1..n] do for j in [1..n] do - if Form[i][j] <> Zero(F) then - if Form[j][i] = Zero(F) then + if not IsZero(Form[i, j]) then + if IsZero(Form[j, i]) then return fail; fi; - if lambda <> fail and Form[i][j] * lambda <> hom(Form[j][i]) then + if lambda <> fail and Form[i, j] * lambda <> hom(Form[j, i]) then return fail; fi; if lambda = fail then - lambda := hom(Form[j][i]) * Inverse(Form[i][j]); + lambda := hom(Form[j, i]) * Inverse(Form[i, j]); fi; fi; od; @@ -246,20 +229,20 @@ end; # find symplectic and symmetric matrices in Forms # returns bases [[symmetric forms], [symplectic forms]] FORMS_FilterBilinearForms := function(Forms, F, n) - local transposed_equal_result, form, symmetric_base, symplectic_base, transposed_form, TransposedEqual, symmetric_base_vecs, symplectic_base_vecs, char_2_eqs, sol, out; + local transposed_equal_result, form, symmetric_base, symplectic_base, transposed_form, TransposedEqual, symmetric_base_vecs, symplectic_base_vecs, char_2_eqs, sol, out, mat; # computes if f = f^T or f = -f^T or none # return 0 if f = -f^T # return 1 if f = f^T # return 2 if f <> f^T and f <> -f^T TransposedEqual := function(f, F, n) - local i, j, symmetric_possible, symplectic_possible; + local i, j, symmetric_possible, symplectic_possible, mat; - if Characteristic(F) mod 2 = 0 then + if Characteristic(F) = 2 then # - = + now for i in [1..n] do for j in [1..n] do - if f[i][j] <> f[j][i] then + if f[i, j] <> f[j, i] then return 2; fi; od; @@ -269,12 +252,18 @@ FORMS_FilterBilinearForms := function(Forms, F, n) symmetric_possible := true; symplectic_possible := true; for i in [1..n] do - for j in [1..n] do - if symmetric_possible and f[i][j] <> f[j][i] then + for j in [i..n] do + if symmetric_possible and f[i, j] <> f[j, i] then symmetric_possible := false; + if not symplectic_possible then + return 2; + fi; fi; - if symplectic_possible and f[i][j] <> -f[j][i] then + if symplectic_possible and f[i, j] <> -f[j, i] then symplectic_possible := false; + if not symmetric_possible then + return 2; + fi; fi; od; od; @@ -304,19 +293,30 @@ FORMS_FilterBilinearForms := function(Forms, F, n) fi; - if Characteristic(F) mod 2 <> 0 then + if Characteristic(F) <> 2 then + # maybe not use these mutable bases 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)); for form in Forms do transposed_form := TransposedMat(form); CloseMutableBasis(symmetric_base, transposed_form + form); 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 + symmetric_base_vecs := BasisVectors(ImmutableBasis(symmetric_base)); symplectic_base_vecs := BasisVectors(ImmutableBasis(symplectic_base)); + # for mat in symmetric_base_vecs do + # ConvertToMatrixRep(mat, F); + # od; + + # for mat in symplectic_base_vecs do + # ConvertToMatrixRep(mat, F); + # od; + if Size(symmetric_base_vecs) + Size(symplectic_base_vecs) <> Size(Forms) then Error("This should not have happend!! there are supposedly ", Size(symmetric_base_vecs), " linearly independent symmetric forms and ", Size(symplectic_base_vecs), " linearly independent symplectic forms, yet the dimension of the formspace is ", Size(Forms), "\n"); fi; @@ -327,6 +327,7 @@ FORMS_FilterBilinearForms := function(Forms, F, n) # TODO: solve this in some efficient way that does not formulate this by solving sets of linear equations of matrices. Instead it would be better to gradually consider entries of the matrices. Then use some heuristic to determine we are done and just check wether the resulting matrices are infact symmetric. this should be faster because now worst case we are solving a system of linear equations that consists of n^2 equations and Size(Forms) indeterminates. # TODO: maybe do these todos for all characteristics the nice thing about the current algorithm for char F <> 2 is that we do not have to solve many systems of equations, rather just check wether we have the zero matrix + ## TODO: this code is broken right now, FIX!! the issue seems to lie in the function FORMS_MatrixReorganize char_2_eqs := []; for form in Forms do Add(char_2_eqs, FORMS_MatrixReorganize(form - TransposedMat(form), n, F, n)); @@ -342,7 +343,7 @@ end; # tries to filter the F = GF(q^2) vectorspace generated by and return the GF(q) vector space A such that A = \cap B where B = {A \in F^{n\times n}, A* = A} TODO: THIS NEEDS SOME FURTHER INVESTIGATION # there must be a better way to compute these matrices.. FORMS_FilterUnitaryForms := function(Forms, F, n, hom) - local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base; + local i, j, ent, q, half, O, l, FF, p, tr_form, Base, baseVecs, gf_base, hgf_base, mat; if Size(Forms) = 0 then return []; fi; @@ -368,8 +369,9 @@ FORMS_FilterUnitaryForms := function(Forms, F, n, hom) ## 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 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 :( ## for char = 2 this can be a bad idea as it can make the diagonal disaapear.. oh well - if Characteristic(F) mod 2 <> 0 then - Base := MutableBasis(GF(q), [NullMat(n, n, F)]); + if p <> 2 then + Base := MutableBasis(GF(q), [NullMat(n, n, GF(q))]); + # Base := MutableBasis(GF(q), [], ZeroVector(GF(q), n)); gf_base := BasisVectors(Basis(GF(GF(q), 2)))[2]; hgf_base := hom(gf_base); for FF in Forms do @@ -384,7 +386,7 @@ FORMS_FilterUnitaryForms := function(Forms, F, n, hom) od; O := []; - baseVecs := ImmutableBasis(Base); + baseVecs := BasisVectors(ImmutableBasis(Base)); # for FF in baseVecs do # Add(O, HermitianFormByMatrix(FF, F)); # od; @@ -395,8 +397,10 @@ FORMS_FilterUnitaryForms := function(Forms, F, n, hom) # if Size(baseVecs) = Size(Forms) then # return baseVecs; # fi; - - return BasisVectors(baseVecs); + # for mat in baseVecs do + # ConvertToMatrixRep(mat, F); + # od; + return baseVecs; fi; Print("char 2 case is missing!!"); # # TODO this function definetly needs work!!! @@ -404,8 +408,6 @@ FORMS_FilterUnitaryForms := function(Forms, F, n, hom) # return [baseVecs, Forms]; end; - - # Compute the formspace for cyclic matrix group. # TODO: optimizations: # this function (sometimes) yields a very large formspace @@ -537,7 +539,7 @@ InstallMethod(PreservedFormspace, # Prüfen ob es sich um einen endlichen körper handelt?? Gens := GeneratorsOfGroup(G); # F := DefaultFieldOfMatrix(Gens[1]); - n := DimensionsMat(Gens[1])[1]; + n := NrRows(Gens[1]); d := Size(Gens); hom := fail; @@ -589,7 +591,7 @@ InstallMethod(PreservedFormspace, # Prüfen ob es sich um einen endlichen körper handelt?? Gens := GeneratorsOfGroup(G); # F := DefaultFieldOfMatrix(Gens[1]); - n := DimensionsMat(Gens[1])[1]; + n := NrRows(Gens[1]); d := Size(Gens); hom := fail; @@ -676,4 +678,4 @@ InstallMethod(FilterFormspace, "for list of matrices, F finite field, bool hermi hom := FrobeniusAutomorphism(F)^(p_exponent/2); return FORMS_FilterUnitaryForms(Forms, F, n, hom); fi; -end); \ No newline at end of file +end); diff --git a/tst/formspace/custom_test_functions.g b/tst/formspace/custom_test_functions.g index 2eb8ae6..e15acf0 100644 --- a/tst/formspace/custom_test_functions.g +++ b/tst/formspace/custom_test_functions.g @@ -1,37 +1,13 @@ -RandomVector:=function(F, n) - local randvec, i; - randvec := EmptyPlist(n); - for i in [1..n] do - randvec[i] := PseudoRandom(F); - od; - return randvec; -end; - -RandomMatrix := function(n, F) - local M, i, j; - while true do - # M := ZeroMatrix(F, n, n); - M := NullMat(n, n, F); - for i in [1..n] do - for j in [1..n] do - M[i][j] := PseudoRandom(F); - od; - od; - ConvertToMatrixRep(M, F); - return M; - od; -end; - TestPolyEval := function(benchmark) - local iters, n, F, mat, coeffs, f, frob, eval, i, time_start, time_average_frob, time_average_normal, normal_eval; + local iters, n, F, mat, coeffs, f, frob, eval, i, time_start, time_average_frob, time_average_normal, normal_eval, x; iters := 50; time_average_frob := 0; time_average_normal := 0; for i in [1..iters] do - n := PseudoRandom([1..200]); - F := GF(PseudoRandom([2, 3, 5])^(PseudoRandom([1, 2, 3]))); - mat := RandomMatrix(n, F); - coeffs := RandomVector(F, PseudoRandom([0..300])); + n := Random([1..200]); + F := GF(Random([2, 3, 5])^(Random(1, 3))); + mat := RandomMat(n, n, F); + coeffs := List([1..Random(1, 300)], x -> Random(F)); f := UnivariatePolynomial(F, coeffs); time_start := NanosecondsSinceEpoch(); frob := FrobeniusNormalForm(mat); @@ -169,4 +145,4 @@ TestComputeFormspaceBruteForce := function(G, Lambdas, unitary) od; # Print(aaa); return out; -end; \ No newline at end of file +end; diff --git a/tst/interesting_groups.g b/tst/interesting_groups.g index 66003f4..8af73e1 100644 --- a/tst/interesting_groups.g +++ b/tst/interesting_groups.g @@ -35,7 +35,7 @@ PolyEval := function(f, M) n := DimensionsMat(M)[1]; F := DefaultFieldOfMatrix(M); frob := FrobeniusNormalForm(M); - return __FORMSPACE__INTERNAL__EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(f), M, frob, Inverse(frob[2]), F, n); + return FORMS_EvaluatePolynomialWithFrobenius(CoefficientsOfUnivariatePolynomial(f), M, frob, Inverse(frob[2]), F, n); end; @@ -370,4 +370,4 @@ G8 := Group([ [ Z(2^8), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ] ]); # The group from the forms package pull request https://github.com/gap-packages/forms/issues/22 -GP22 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7) ], [ Z(7^2)^33, Z(7^2)^14, Z(7^2)^26 ], [ Z(7^2)^19, Z(7^2)^31, Z(7^2)^5 ] ], [ [ Z(7^2)^39, Z(7^2)^9, Z(7)^3 ], [ Z(7^2)^25, Z(7)^2, Z(7^2)^6 ], [ Z(7^2)^7, Z(7)^4, Z(7^2)^28 ] ]); \ No newline at end of file +GP22 := Group([ [ Z(7)^0, 0*Z(7), 0*Z(7) ], [ Z(7^2)^33, Z(7^2)^14, Z(7^2)^26 ], [ Z(7^2)^19, Z(7^2)^31, Z(7^2)^5 ] ], [ [ Z(7^2)^39, Z(7^2)^9, Z(7)^3 ], [ Z(7^2)^25, Z(7)^2, Z(7^2)^6 ], [ Z(7^2)^7, Z(7)^4, Z(7^2)^28 ] ]);