decode := func< k | [Integers()| x : x in [1..#S] | S[x] eq 1] where S is Intseq(k-1,2) >;
encode := func< L | IsEmpty(L) select 1 else 1 + &+[ 2^(k-1) : k in L ] >;

t1 := [<[1,3],3>];
t2 := [<[1],1>];
v1 := [<[1,2],3>,<[1,2,4],5>,<[5],9>];
v2 := [<[1],1>,<[1,2,4],-5>,<[5],2>];

C,V,f := CliffordAlgebra(-IdentityMatrix(Rationals(),5));
for ss in [t1,t2,v1,v2] do
  assert SeqFromClifford(SeqToClifford(C,ss)) eq ss;
end for;

/* The root system of type A_n */
n := 5;
F<a> := QuadraticField(2);
B := MatrixAlgebra(F,n)!1;
C,V,f := CliffordAlgebra(F,B);

roots := [
  SeqToClifford(C,[<[i],1/a>,<[j],-1/a>]) : j in [1..n], i in [1..n] | i ne j];
   
group := function(gen);
  glist := gen;
  ndx := 1;
  while ndx le #glist do
    h := glist[ndx];
    for g in gen do
      Include(~glist,h*g);
    end for;
    ndx +:= 1;
//    print ndx, #glist;
  end while;
  return glist;
end function;

G := group(roots);
#G;
for j := 1 to 30 do
  g1 := Random(G);
  g2 := Random(G);
  assert g1*g2 in G;
  assert g1 eq SeqToClifford(C,SeqFromClifford(g1));
end for;
// F<a> := QuadraticField(2);
F1<z> := GF(9);
a1 := z^2;

B1 := MatrixAlgebra(F1,n)!1;
C1,V1,f1 := CliffordAlgebra(F1,B1);

F2<z> := GF(4);
B2 := Matrix(4,4,[F2| 1,0,0,1, 0,1,1,0, 0,0,1,0, 0,0,0,1]);
C2,V2,f2 := CliffordAlgebra(F2,B2);

K<a> := QuadraticField(15);
Q := Matrix(3,[1,0,1/2*(a-1),0,-a+6,-a+3,0,0,-a+7]);
C<x_,y_,z_>,V,f := CliffordAlgebra(Q);
AssignNames(~C,["x","y"]);
x := x_; y := y_;
Z,h := Centre(C);
X := OrthogonalComplement(V,sub<V|V.1,V.2>);
w := V!X.1;
wz := x*y*f(w);
AsPolynomial(wz);
wz in Image(h);
 
r1 := OrthogonalReflection(V.1+V.2+V.3);
r2 := OrthogonalReflection(a*V.2+V.3);
g := r1*r2;
e1 := V.1*g;
e2 := V.2*g;
e3 := w*g;

ez := f(e1)*f(e2)*f(e3);
ez in Image(h);

