torth := procedure()
  for d := 2 to 50 do
    for q in [2^2,3^3,5^5,7^7] do
      J := StandardSymmetricForm(d,q);
      X := Random(GL(d,q));
      B := X*J*Transpose(X);
      D,A := GramSchmidtPair(B);
      assert A*B*Transpose(A) eq D;
    end for;
  end for;
end procedure;

talt := procedure()
  for d := 2 to 50 by 2 do
    for q in [2^2,3^3,5^5,7^7] do
      J := StandardAlternatingForm(d,q);
      X := Random(GL(d,q));
      B := X*J*Transpose(X);
      D,A := GramSchmidtPair(B);
      assert A*B*Transpose(A) eq D;
    end for;
  end for;
end procedure;

therm := procedure()
  for d := 2 to 30 do
    for q in [2,2^2,3,3^3,5,5^5,7,7^7] do
      J,_ := StandardHermitianForm(d,q);
      X := Random(GL(d,q^2));
      flag, p, e := IsPrimePower(q);
      B := X*J*FrobeniusImage(Transpose(X),e);
      D,A := GramSchmidtPair(B);
      assert A*B*FrobeniusImage(Transpose(A),e) eq D;
    end for;
  end for;
end procedure;

tskew := procedure()
  for d := 2 to 30 do
    for q in [2,2^2,3,3^3,5,5^5,7,7^7] do
      F := GF(q^2);
      i := SquareRoot(F!-1);
      J,_ := StandardHermitianForm(d,q);
      flag, p, e := IsPrimePower(q);
      X := Random(GL(d,q^2));
      B := ScalarMatrix(F,d,i)*X*J*FrobeniusImage(Transpose(X),e);
      D,A := GramSchmidtPair(B);
      assert A*B*FrobeniusImage(Transpose(A),e) eq D;
    end for;
  end for;
end procedure;

tGauss := procedure()
  F<i> := QuadraticField(-1);
  sigma := hom< F -> F | x :-> ComplexConjugate(x) >;
  for d := 2 to 10 do
    M := Matrix(F,d,d,[ Random(10) - 5 : x in [1..d*d]]);
    N := Matrix(F,d,d,[ Random(10) - 5 : x in [1..d*d]]);
    J := (M + i*N)*Transpose(M - i*N);
    D,A := GramSchmidtPair(J);
    assert A*J*ConjugateTranspose(A,sigma) eq D;
  end for;
end procedure;

time torth();
time talt();
time therm();
time tskew();
time tGauss();


