# Quantum Clifford Algebras#

AUTHORS:

• Travis Scrimshaw (2021-05): initial version

class sage.algebras.quantum_clifford.QuantumCliffordAlgebra(n, k, q, F, psi, indices)#

The quantum Clifford algebra.

The quantum Clifford algebra, or $$q$$-Clifford algebra, of rank $$n$$ and twist $$k$$ is the unital associative algebra $$\mathrm{Cl}_{q}(n, k)$$ over a field $$F$$ with generators $$\psi_a, \psi_a^*, \omega_a$$ for $$a = 1, \ldots, n$$ that satisfy the following relations:

\begin{split}\begin{aligned} \omega_a \omega_b & = \omega_b \omega_a, & \omega_a^{4k} & = (1 + q^{-2k}) \omega_a^{2k} - q^{-2k}, \\ \omega_a \psi_b & = q^{\delta_{ab}} \psi_b \omega_a, & \omega_a \psi^*_b & = \psi^*_b \omega_a, \\ \psi_a \psi_b & + \psi_b \psi_a = 0, & \psi^*_a \psi^*_b & + \psi^*_b \psi^*_a = 0, \\ \psi_a \psi^*_a & + q^k \psi^*_a \psi_a = \omega_a^{-k}, & \psi^*_a \psi_a & + q^{-k} \psi^*_a \psi_a = \omega_a^k, \\ \psi_a \psi^*_b & + \psi_b^* \psi_a = 0 & & \text{if } a \neq b. \end{aligned}\end{split}

When $$k = 2$$, we recover the original definition given by Hayashi in [Hayashi1990]. The $$k = 1$$ version was used in [Kwon2014].

INPUT:

• n – positive integer; the rank

• k – positive integer (default: 1); the twist

• q – (optional) the parameter $$q$$

• F – (default: $$\QQ(q)$$) the base field that contains q

EXAMPLES:

We construct the rank 3 and twist 1 $$q$$-Clifford algebra:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl
Quantum Clifford algebra of rank 3 and twist 1 with q=q over
Fraction Field of Univariate Polynomial Ring in q over Integer Ring
sage: q = Cl.q()


Some sample computations:

sage: p0, p1, p2, d0, d1, d2, w0, w1, w2 = Cl.gens()
sage: p0 * p1
psi0*psi1
sage: p1 * p0
-psi0*psi1
sage: p0 * w0 * p1 * d0 * w2
(1/(q^3-q))*psi1*w2 + (-q/(q^2-1))*psi1*w0^2*w2
sage: w0^4
-1/q^2 + ((q^2+1)/q^2)*w0^2


We construct the homomorphism from $$U_q(\mathfrak{sl}_3)$$ to $$\mathrm{Cl}(3, 1)$$ given in (3.17) of [Hayashi1990]:

sage: e1 = p0*d1; e2 = p1*d2
sage: f1 = p1*d0; f2 = p2*d1
sage: k1 = w0*~w1; k2 = w1*~w2
sage: k1i = w1*~w0; k2i = w2*~w1
sage: (e1, e2, f1, f2, k1, k2, k1i, k2i)
(psi0*psid1, psi1*psid2,
-psid0*psi1, -psid1*psi2,
(q^2+1)*w0*w1 - q^2*w0*w1^3, (q^2+1)*w1*w2 - q^2*w1*w2^3,
(q^2+1)*w0*w1 - q^2*w0^3*w1, (q^2+1)*w1*w2 - q^2*w1^3*w2)


We check that $$k_i$$ and $$k_i^{-1}$$ are inverses:

sage: k1 * k1i
1
sage: k2 * k2i
1


The relations between $$e_i$$, $$f_i$$, and $$k_i$$:

sage: k1 * f1 == q^-2 * f1 * k1
True
sage: k2 * f1 == q^1 * f1 * k2
True
sage: k2 * e1 == q^-1 * e1 * k2
True
sage: k1 * e1 == q^2 * e1 * k1
True
sage: e1 * f1 - f1 * e1 == (k1 - k1i)/(q-q^-1)
True
sage: e2 * f1 - f1 * e2
0


The $$q$$-Serre relations:

sage: e1 * e1 * e2 - (q^1 + q^-1) * e1 * e2 * e1 + e2 * e1 * e1
0
sage: f1 * f1 * f2 - (q^1 + q^-1) * f1 * f2 * f1 + f2 * f1 * f1
0


This also can be constructed at the special point when $$q^{2k} = 1$$, but the basis used is different:

sage: Cl = algebras.QuantumClifford(1, 1, -1)
sage: Cl.inject_variables()
Defining psi0, psid0, w0
sage: psi0 * psid0
psi0*psid0
sage: psid0 * psi0
-w0 + psi0*psid0
sage: w0^2
1

algebra_generators()#

Return the algebra generators of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.algebra_generators()
Finite family {'psi0': psi0, 'psi1': psi1, 'psi2': psi2,
'psid0': psid0, 'psid1': psid1, 'psid2': psid2,
'w0': w0, 'w1': w1, 'w2': w2}

dimension()#

Return the dimension of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.dimension()
512

sage: Cl = algebras.QuantumClifford(4, 2)  # long time
sage: Cl.dimension()  # long time
65536

gens()#

Return the generators of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.gens()
(psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2)

one_basis()#

Return the index of the basis element of $$1$$.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.one_basis()
((0, 0, 0), (0, 0, 0))

q()#

Return the $$q$$ of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.q()
q

sage: Cl = algebras.QuantumClifford(3, q=QQ(-5))
sage: Cl.q()
-5

rank()#

Return the rank $$k$$ of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3, 2)
sage: Cl.rank()
3

twist()#

Return the twist $$k$$ of self.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3, 2)
sage: Cl.twist()
2

class sage.algebras.quantum_clifford.QuantumCliffordAlgebraGeneric(n, k, q, F)#

The quantum Clifford algebra when $$q^{2k} \neq 1$$.

The quantum Clifford algebra, or $$q$$-Clifford algebra, of rank $$n$$ and twist $$k$$ is the unital associative algebra $$\mathrm{Cl}_{q}(n, k)$$ over a field $$F$$ with generators $$\psi_a, \psi_a^*, \omega_a$$ for $$a = 1, \ldots, n$$ that satisfy the following relations:

\begin{split}\begin{aligned} \omega_a \omega_b & = \omega_b \omega_a, & \omega_a^{4k} & = (1 + q^{-2k}) \omega_a^{2k} - q^{-2k}, \\ \omega_a \psi_b & = q^{\delta_{ab}} \psi_b \omega_a, & \omega_a \psi^*_b & = \psi^*_b \omega_a, \\ \psi_a \psi_b & + \psi_b \psi_a = 0, & \psi^*_a \psi^*_b & + \psi^*_b \psi^*_a = 0, \\ \psi_a \psi^*_a & = \frac{q^k \omega_a^{3k} - q^{-k} \omega_a^k}{q^k - q^{-k}}, & \psi^*_a \psi_a & = \frac{q^{2k} (\omega_a - \omega_a^{3k})}{q^k - q^{-k}}, \\ \psi_a \psi^*_b & + \psi_b^* \psi_a = 0 & & \text{if } a \neq b, \end{aligned}\end{split}

where $$q \in F$$ such that $$q^{2k} \neq 1$$.

When $$k = 2$$, we recover the original definition given by Hayashi in [Hayashi1990]. The $$k = 1$$ version was used in [Kwon2014].

class Element#
inverse()#

Return the inverse if self is a basis element.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(2)
sage: Cl.inject_variables()
Defining psi0, psi1, psid0, psid1, w0, w1
sage: w0^-1
(q^2+1)*w0 - q^2*w0^3
sage: w0^-1 * w0
1
sage: w0^-2
(q^2+1) - q^2*w0^2
sage: w0^-2 * w0^2
1
sage: w0^-2 * w0 == w0^-1
True
sage: w = w0 * w1
sage: w^-1
(q^4+2*q^2+1)*w0*w1 + (-q^4-q^2)*w0*w1^3
+ (-q^4-q^2)*w0^3*w1 + q^4*w0^3*w1^3
sage: w^-1 * w
1
sage: w * w^-1
1

sage: (2*w0)^-1
((q^2+1)/2)*w0 - q^2/2*w0^3

sage: (w0 + w1)^-1
Traceback (most recent call last):
...
ValueError: cannot invert self (= w1 + w0)
sage: (psi0 * w0)^-1
Traceback (most recent call last):
...
ValueError: cannot invert self (= psi0*w0)

sage: Cl = algebras.QuantumClifford(1, 2)
sage: Cl.inject_variables()
Defining psi0, psid0, w0
sage: (psi0 + psid0).inverse()
psid0*w0^2 + q^2*psi0*w0^2

sage: Cl = algebras.QuantumClifford(2, 2)
sage: Cl.inject_variables()
Defining psi0, psi1, psid0, psid1, w0, w1
sage: w0^-1
(q^4+1)*w0^3 - q^4*w0^7
sage: w0 * w0^-1
1

product_on_basis(m1, m2)#

Return the product of the basis elements indexed by m1 and m2.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3)
sage: Cl.inject_variables()
Defining psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2
sage: psi0^2  # indirect doctest
0
sage: psid0^2
0
sage: w0 * psi0
q*psi0*w0
sage: w0 * psid0
1/q*psid0*w0
sage: w2 * w0
w0*w2
sage: w0^4
-1/q^2 + ((q^2+1)/q^2)*w0^2

class sage.algebras.quantum_clifford.QuantumCliffordAlgebraRootUnity(n, k, q, F)#

The quantum Clifford algebra when $$q^{2k} = 1$$.

The quantum Clifford algebra, or $$q$$-Clifford algebra, of rank $$n$$ and twist $$k$$ is the unital associative algebra $$\mathrm{Cl}_{q}(n, k)$$ over a field $$F$$ with generators $$\psi_a, \psi_a^*, \omega_a$$ for $$a = 1, \ldots, n$$ that satisfy the following relations:

\begin{split}\begin{aligned} \omega_a \omega_b & = \omega_b \omega_a, & \omega_a^{2k} & = 1, \\ \omega_a \psi_b & = q^{\delta_{ab}} \psi_b \omega_a, & \omega_a \psi^*_b & = \psi^*_b \omega_a, \\ \psi_a \psi_b & + \psi_b \psi_a = 0, & \psi^*_a \psi^*_b & + \psi^*_b \psi^*_a = 0, \\ \psi_a \psi^*_a & + q^k \psi^*_a \psi_a = \omega_a^k & \psi_a \psi^*_b & + \psi_b^* \psi_a = 0 \quad (a \neq b), \end{aligned}\end{split}

where $$q \in F$$ such that $$q^{2k} = 1$$. This has further relations of

\begin{split}\begin{aligned} \psi^*_a \psi_a \psi^*_a & = \psi^*_a \omega_a^k, \\ \psi_a \psi^*_a \psi_a & = q^k \psi_a \omega_a^k, \\ (\psi_a \psi^*_a)^2 & = \psi_a \psi^*_a \omega_a^k. \end{aligned}\end{split}
class Element#
inverse()#

Return the inverse if self is a basis element.

EXAMPLES:

sage: Cl = algebras.QuantumClifford(3, 3, -1)
sage: Cl.inject_variables()
Defining psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2
sage: w0^-1
w0^5
sage: w0^-1 * w0
1
sage: w0^-2
w0^4
sage: w0^-2 * w0^2
1
sage: w0^-2 * w0 == w0^-1
True
sage: w = w0 * w1^3
sage: w^-1
w0^5*w1^3
sage: w^-1 * w
1
sage: w * w^-1
1

sage: (2*w0)^-1
1/2*w0^5

sage: Cl = algebras.QuantumClifford(3, 1, -1)
sage: Cl.inject_variables()
Defining psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2

sage: (w0 + w1)^-1
Traceback (most recent call last):
...
ValueError: cannot invert self (= w1 + w0)
sage: (psi0 * w0)^-1
Traceback (most recent call last):
...
ValueError: cannot invert self (= psi0*w0)

sage: z = CyclotomicField(6).gen()
sage: Cl = algebras.QuantumClifford(1, 3, z)
sage: Cl.inject_variables()
Defining psi0, psid0, w0
sage: (psi0 + psid0).inverse()
psid0*w0^3 - psi0*w0^3

sage: Cl = algebras.QuantumClifford(2, 2, -1)
sage: Cl.inject_variables()
Defining psi0, psi1, psid0, psid1, w0, w1
sage: w0^-1
w0^3
sage: w0 * w0^-1
1

product_on_basis(m1, m2)#

Return the product of the basis elements indexed by m1 and m2.

EXAMPLES:

sage: z = CyclotomicField(3).gen()
sage: Cl = algebras.QuantumClifford(3, 3, z)
sage: Cl.inject_variables()
Defining psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2
sage: psi0^2  # indirect doctest
0
sage: psid0^2
0
sage: w0 * psi0
-(-zeta3)*psi0*w0
sage: w0 * psid0
-(zeta3+1)*psid0*w0
sage: psi0 * psid0
psi0*psid0
sage: psid0 * psi0
w0^3 - psi0*psid0
sage: w2 * w0
w0*w2
sage: w0^6
1
sage: psi0 * psi1
psi0*psi1
sage: psi1 * psi0
-psi0*psi1
sage: psi1 * (psi0 * psi2)
-psi0*psi1*psi2

sage: z = CyclotomicField(6).gen()
sage: Cl = algebras.QuantumClifford(3, 3, z)
sage: Cl.inject_variables()
Defining psi0, psi1, psi2, psid0, psid1, psid2, w0, w1, w2

sage: psid1 * (psi1 * psid1)
psid1*w1^3
sage: (psi1* psid1) * (psi1 * psid1)
psi1*psid1*w1^3
sage: (psi1 * psid1) * psi1
-psi1*w1^3