// check classes; centraliser and order; also conjugation 
// Eamonn O'Brian and Gulliani De Franceschi

"Linear groups";
time for d in [2..4] do
  for q in [2,3,4,5] do
     G := SL (d, q);
     X := Classes (G);
//     d, q, "#X is", #X;
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     if not (g^(h) eq g^x) then "Conjugation failed"; end if;;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"Symplectic groups";
time for d in [4..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("Sp", d, q);
//     d, q, "#X is", #X;
     G := Sp (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;


"GO -";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("GO-", d, q);
//     d, q, "#X is", #X;
     G := GOMinus (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;
     
"GO +";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("GO+", d, q);
//     d, q, "#X is", #X;
     G := GOPlus (d, q);
     if d gt 2 then 
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
    end if;
  end for;
end for;

"SO -";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("SO-", d, q);
//     d, q, "#X is", #X;
     G := SOMinus (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"SO +";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("SO+", d, q);
//     d, q, "#X is", #X;
     G := SOPlus (d, q);
     if d gt 2 then 
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
     end if;
  end for;
end for;

"Omega +";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("Omega+", d, q);
//     d, q, "#X is", #X;
     G := OmegaPlus (d, q);
     if d gt 2 then 
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
    end if;
  end for;
end for;


"Omega -";
time for d in [2..6 by 2] do
  for q in [2,3,4,5] do
     X := ClassicalConjugacyClasses ("Omega-", d, q);
//     d, q, "#X is", #X;
     G := OmegaMinus (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"GO";
time for d in [3..6 by 2] do
  for q in [3,5,7] do
     X := ClassicalConjugacyClasses ("GO", d, q);
//     d, q, "#X is", #X;
     G := GO (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"SO";
time for d in [3..6 by 2] do
  for q in [3,5,7] do
     X := ClassicalConjugacyClasses ("SO", d, q);
//     d, q, "#X is", #X;
     G := SO (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"Omega";
time for d in [3..6 by 2] do
  for q in [3,5,7] do
     X := ClassicalConjugacyClasses ("Omega", d, q);
//     d, q, "#X is", #X;
     G := Omega (d, q);
     for i in [1..#X] do 
//     "process i = ", i;
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"Unitary GU";
time for d in [2,3,4] do
  for q in [2,3,4] do
     X := ClassicalConjugacyClasses ("GU", d, q);
//     d, q, "#X is", #X;
     G := GU (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;

"Unitary SU";
time for d in [2,3,4] do
  for q in [2,3,4] do
     X := ClassicalConjugacyClasses ("SU", d, q);
//     d, q, "#X is", #X;
     G := SU (d, q);
     for i in [1..#X] do 
     g := X[i][3];
     x := Random (G);
     flag, h := ClassicalIsConjugate (G, g, g^x);
     assert flag;
     assert h in G;
     assert g^(h) eq g^x;
     C := ClassicalCentraliser (G, g);
     assert forall{j: j in [1..Ngens (C)] | C.j in G};
     assert IsCentral (C, g);
     o := LMGOrder (C);
     assert #G div o eq X[i][2];
     end for;
  end for;
end for;
