|
- import clifford as lc
- from numpy import *
- from scipy.linalg import sqrtm
-
- sqy = sqrtm(1j * lc.py)
- msqy = sqrtm(-1j * lc.py)
- sqz = sqrtm(1j * lc.pz)
- msqz = sqrtm(-1j * lc.pz)
- sqx = sqrtm(1j * lc.px)
- msqx = sqrtm(-1j * lc.px)
- paulis = (lc.px, lc.py, lc.pz)
-
-
- def find_u(u, unitaries):
- """ Find the index of a given u within a list of unitaries """
- for i, t in enumerate(unitaries):
- if allclose(t, u):
- return i
- return -1
-
-
- def identify_pauli(m):
- """ Given a signed Pauli matrix, name it. """
- for sign in (+1, -1):
- for pauli_label, pauli in zip("xyz", paulis):
- if allclose(sign * pauli, m):
- return sign, pauli_label
-
-
- def get_action(u):
- """ What does this unitary operator do to the Paulis? """
- return [identify_pauli(u * p * u.H) for p in paulis]
-
-
- def format_action(action):
- return "".join("{}{}".format("+" if s >= 0 else "-", p) for s, p in action)
-
-
- def test_we_have_24_matrices():
- """ Check that we have 24 unique actions on the Bloch sphere """
- actions = set(tuple(get_action(u)) for u in lc.unitaries)
- assert len(set(actions)) == 24
-
-
- def test_we_have_all_useful_gates():
- """ Check that all the interesting gates are included up to a global phase """
- names = "i", "px", "py", "pz", "h", "p"
- unitaries = lc.i, lc.px, lc.py, lc.pz, lc.h, lc.p
- for name, unitary in zip(names, unitaries):
- i = find_u(unitary, lc.unitaries)
- assert i >= 0
- print "{}\t=\tlc.unitaries[{}]".format(name, i)
-
- names = "sqrt(ix)", "sqrt(-ix)", "sqrt(iy)", "sqrt(-iy)", "sqrt(iz)", "sqrt(-iz)",
- unitaries = sqz, msqz, sqy, msqy, sqx, msqx
- for name, unitary in zip(names, unitaries):
- rotated = [exp(1j * phase * pi / 4.) * unitary for phase in range(8)]
- results = [find_u(r, lc.unitaries) for r in rotated]
- assert any(x > 0 for x in results)
- phase, index = [(i, r) for i, r in enumerate(results) if r>=0][0]
- print "exp(1j*{}*pi/4) . {}\t=\tlc.unitaries[{}]".format(phase, name, index)
-
-
- def test_group():
- """ Test we are really in a group """
- for a in lc.unitaries:
- for b in lc.unitaries:
- unitary = a*b
- rotated = [exp(1j * phase * pi / 4.) * unitary for phase in range(8)]
- results = [find_u(r, lc.unitaries) for r in rotated]
- assert len([x for x in results if x>=0])==1
-
-
|