@@ -1,3 +1,4 @@ | |||||
tables.pkl | |||||
papers/ | papers/ | ||||
# Project-specific | # Project-specific | ||||
@@ -11,33 +11,37 @@ Following the prescription of Anders (thesis pg. 26): | |||||
> indicated by the column header and the opposite sign otherwise. | > indicated by the column header and the opposite sign otherwise. | ||||
""" | """ | ||||
from numpy import * | |||||
import numpy as np | |||||
from qi import * | |||||
from tqdm import tqdm | from tqdm import tqdm | ||||
import cPickle,os | |||||
def find_up_to_phase(u): | def find_up_to_phase(u): | ||||
""" Find the index of a given u within a list of unitaries, up to a global phase """ | """ Find the index of a given u within a list of unitaries, up to a global phase """ | ||||
global unitaries | global unitaries | ||||
for i, t in enumerate(unitaries): | for i, t in enumerate(unitaries): | ||||
for phase in range(8): | for phase in range(8): | ||||
if allclose(t, exp(1j*phase*pi/4.)*u): | |||||
if np.allclose(t, np.exp(1j*phase*np.pi/4.)*u): | |||||
return i, phase | return i, phase | ||||
raise IndexError | raise IndexError | ||||
def construct_tables(): | def construct_tables(): | ||||
""" Constructs multiplication and conjugation tables """ | """ Constructs multiplication and conjugation tables """ | ||||
permutations = (id, ha, ph, ha*ph, ha*ph*ha, ha*ph*ha*ph) | |||||
signs = (id, px, py, pz) | |||||
unitaries = [p*s for p in permutations for s in signs] | |||||
conjugation_table = [find_up_to_phase(u.H)[0] for i, u in enumerate(unitaries)] | conjugation_table = [find_up_to_phase(u.H)[0] for i, u in enumerate(unitaries)] | ||||
times_table = [[find_up_to_phase(u*v)[0] for v in unitaries] | times_table = [[find_up_to_phase(u*v)[0] for v in unitaries] | ||||
for u in tqdm(unitaries, "Building times-table")] | for u in tqdm(unitaries, "Building times-table")] | ||||
with open("tables.pkl", "w") as f: | |||||
cPickle.dump((conjugation_table, times_table), f) | |||||
id = matrix(eye(2, dtype=complex)) | |||||
px = matrix([[0, 1], [1, 0]], dtype=complex) | |||||
py = matrix([[0, -1j], [1j, 0]], dtype=complex) | |||||
pz = matrix([[1, 0], [0, -1]], dtype=complex) | |||||
ha = matrix([[1, 1], [1, -1]], dtype=complex) / sqrt(2) | |||||
ph = matrix([[1, 0], [0, 1j]], dtype=complex) | |||||
permutations = (id, ha, ph, ha*ph, ha*ph*ha, ha*ph*ha*ph) | |||||
signs = (id, px, py, pz) | |||||
unitaries = [p*s for p in permutations for s in signs] | |||||
# Build / reload lookup tables | |||||
if not os.path.exists("tables.pkl"): | |||||
construct_tables() | |||||
with open("tables.pkl") as f: | |||||
conjugation_table, times_table = cPickle.load(f) | |||||
@@ -1 +0,0 @@ | |||||
[0, 1, 2, 3, 4, 7, 6, 5, 11, 9, 10, 8, 20, 22, 23, 21, 17, 16, 18, 19, 12, 15, 13, 14] |
@@ -0,0 +1,24 @@ | |||||
#!/usr/bin/python | |||||
# -*- coding: utf-8 -*- | |||||
""" | |||||
Exposes a few basic QI operators | |||||
""" | |||||
import numpy as np | |||||
from scipy.linalg import sqrtm | |||||
id = np.matrix(np.eye(2, dtype=complex)) | |||||
px = np.matrix([[0, 1], [1, 0]], dtype=complex) | |||||
py = np.matrix([[0, -1j], [1j, 0]], dtype=complex) | |||||
pz = np.matrix([[1, 0], [0, -1]], dtype=complex) | |||||
ha = np.matrix([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2) | |||||
ph = np.matrix([[1, 0], [0, 1j]], dtype=complex) | |||||
sqy = sqrtm(1j * py) | |||||
msqy = sqrtm(-1j * py) | |||||
sqz = sqrtm(1j * pz) | |||||
msqz = sqrtm(-1j * pz) | |||||
sqx = sqrtm(1j * px) | |||||
msqx = sqrtm(-1j * px) | |||||
paulis = (px, py, pz) |
@@ -1,14 +1,8 @@ | |||||
import clifford as lc | import clifford as lc | ||||
from numpy import * | from numpy import * | ||||
from scipy.linalg import sqrtm | from scipy.linalg import sqrtm | ||||
from qi import * | |||||
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 identify_pauli(m): | def identify_pauli(m): | ||||
@@ -21,9 +15,9 @@ def identify_pauli(m): | |||||
def test_find_up_to_phase(): | def test_find_up_to_phase(): | ||||
""" Test that slightly suspicious function """ | """ Test that slightly suspicious function """ | ||||
assert lc.find_up_to_phase(lc.id) == (0, 0) | |||||
assert lc.find_up_to_phase(lc.px) == (1, 0) | |||||
assert lc.find_up_to_phase(exp(1j*pi/4.)*lc.ha) == (4, 7) | |||||
assert lc.find_up_to_phase(id) == (0, 0) | |||||
assert lc.find_up_to_phase(px) == (1, 0) | |||||
assert lc.find_up_to_phase(exp(1j*pi/4.)*ha) == (4, 7) | |||||
def get_action(u): | def get_action(u): | ||||
""" What does this unitary operator do to the Paulis? """ | """ What does this unitary operator do to the Paulis? """ | ||||
@@ -42,7 +36,7 @@ def test_we_have_24_matrices(): | |||||
def test_we_have_all_useful_gates(): | def test_we_have_all_useful_gates(): | ||||
""" Check that all the interesting gates are included up to a global phase """ | """ Check that all the interesting gates are included up to a global phase """ | ||||
common_us = lc.id, lc.px, lc.py, lc.pz, lc.ha, lc.ph, sqz, msqz, sqy, msqy, sqx, msqx | |||||
common_us = id, px, py, pz, ha, ph, sqz, msqz, sqy, msqy, sqx, msqx | |||||
for u in common_us: | for u in common_us: | ||||
lc.find_up_to_phase(u) | lc.find_up_to_phase(u) | ||||
@@ -1 +0,0 @@ | |||||
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], [1, 0, 3, 2, 7, 6, 5, 4, 10, 11, 8, 9, 15, 14, 13, 12, 17, 16, 19, 18, 22, 23, 20, 21], [2, 3, 0, 1, 6, 7, 4, 5, 9, 8, 11, 10, 13, 12, 15, 14, 19, 18, 17, 16, 23, 22, 21, 20], [3, 2, 1, 0, 5, 4, 7, 6, 11, 10, 9, 8, 14, 15, 12, 13, 18, 19, 16, 17, 21, 20, 23, 22], [4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11, 21, 20, 23, 22, 17, 16, 19, 18], [5, 4, 7, 6, 3, 2, 1, 0, 14, 15, 12, 13, 11, 10, 9, 8, 20, 21, 22, 23, 19, 18, 17, 16], [6, 7, 4, 5, 2, 3, 0, 1, 13, 12, 15, 14, 9, 8, 11, 10, 22, 23, 20, 21, 18, 19, 16, 17], [7, 6, 5, 4, 1, 0, 3, 2, 15, 14, 13, 12, 10, 11, 8, 9, 23, 22, 21, 20, 16, 17, 18, 19], [8, 9, 10, 11, 21, 20, 23, 22, 3, 2, 1, 0, 17, 16, 19, 18, 15, 14, 13, 12, 4, 5, 6, 7], [9, 8, 11, 10, 22, 23, 20, 21, 1, 0, 3, 2, 18, 19, 16, 17, 14, 15, 12, 13, 6, 7, 4, 5], [10, 11, 8, 9, 23, 22, 21, 20, 2, 3, 0, 1, 16, 17, 18, 19, 12, 13, 14, 15, 7, 6, 5, 4], [11, 10, 9, 8, 20, 21, 22, 23, 0, 1, 2, 3, 19, 18, 17, 16, 13, 12, 15, 14, 5, 4, 7, 6], [12, 13, 14, 15, 16, 17, 18, 19, 7, 6, 5, 4, 20, 21, 22, 23, 11, 10, 9, 8, 0, 1, 2, 3], [13, 12, 15, 14, 19, 18, 17, 16, 5, 4, 7, 6, 23, 22, 21, 20, 10, 11, 8, 9, 2, 3, 0, 1], [14, 15, 12, 13, 18, 19, 16, 17, 6, 7, 4, 5, 21, 20, 23, 22, 8, 9, 10, 11, 3, 2, 1, 0], [15, 14, 13, 12, 17, 16, 19, 18, 4, 5, 6, 7, 22, 23, 20, 21, 9, 8, 11, 10, 1, 0, 3, 2], [16, 17, 18, 19, 12, 13, 14, 15, 20, 21, 22, 23, 7, 6, 5, 4, 1, 0, 3, 2, 10, 11, 8, 9], [17, 16, 19, 18, 15, 14, 13, 12, 22, 23, 20, 21, 4, 5, 6, 7, 0, 1, 2, 3, 8, 9, 10, 11], [18, 19, 16, 17, 14, 15, 12, 13, 21, 20, 23, 22, 6, 7, 4, 5, 2, 3, 0, 1, 9, 8, 11, 10], [19, 18, 17, 16, 13, 12, 15, 14, 23, 22, 21, 20, 5, 4, 7, 6, 3, 2, 1, 0, 11, 10, 9, 8], [20, 21, 22, 23, 11, 10, 9, 8, 19, 18, 17, 16, 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15], [21, 20, 23, 22, 8, 9, 10, 11, 17, 16, 19, 18, 3, 2, 1, 0, 5, 4, 7, 6, 14, 15, 12, 13], [22, 23, 20, 21, 9, 8, 11, 10, 18, 19, 16, 17, 1, 0, 3, 2, 7, 6, 5, 4, 15, 14, 13, 12], [23, 22, 21, 20, 10, 11, 8, 9, 16, 17, 18, 19, 2, 3, 0, 1, 6, 7, 4, 5, 13, 12, 15, 14]] |