|
@@ -11,9 +11,9 @@ from tqdm import tqdm |
|
|
from functools import reduce |
|
|
from functools import reduce |
|
|
import itertools as it |
|
|
import itertools as it |
|
|
|
|
|
|
|
|
DECOMPOSITIONS = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz", |
|
|
|
|
|
"xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x", |
|
|
|
|
|
"zzzx", "xxzx", "zx", "zxxx", "xxxz", "xzzz", "xz", "xzxx") |
|
|
|
|
|
|
|
|
decompositions = ("xxxx", "xx", "zzxx", "zz", "zxx", "z", "zzz", "xxz", |
|
|
|
|
|
"xzx", "xzxxx", "xzzzx", "xxxzx", "xzz", "zzx", "xxx", "x", |
|
|
|
|
|
"zzzx", "xxzx", "zx", "zxxx", "xxxz", "xzzz", "xz", "xzxx") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def find_clifford(needle, haystack): |
|
|
def find_clifford(needle, haystack): |
|
@@ -70,7 +70,7 @@ def get_conjugation_table(unitaries): |
|
|
def get_times_table(unitaries): |
|
|
def get_times_table(unitaries): |
|
|
""" Construct the times-table """ |
|
|
""" Construct the times-table """ |
|
|
return np.array([[find_clifford(u.dot(v), unitaries) for v in unitaries] |
|
|
return np.array([[find_clifford(u.dot(v), unitaries) for v in unitaries] |
|
|
for u in tqdm(unitaries)]) |
|
|
|
|
|
|
|
|
for u in tqdm(unitaries)]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_state_table(): |
|
|
def get_state_table(): |
|
@@ -79,11 +79,10 @@ def get_state_table(): |
|
|
for bond, i, j in it.product([0, 1], range(24), range(24)): |
|
|
for bond, i, j in it.product([0, 1], range(24), range(24)): |
|
|
state = qi.bond if bond else qi.nobond |
|
|
state = qi.bond if bond else qi.nobond |
|
|
kp = np.kron(unitaries[i], unitaries[j]) |
|
|
kp = np.kron(unitaries[i], unitaries[j]) |
|
|
state_table[bond, i, j,:] = np.dot(kp, state).T |
|
|
|
|
|
|
|
|
state_table[bond, i, j, :] = np.dot(kp, state).T |
|
|
return state_table |
|
|
return state_table |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_cz_table(unitaries): |
|
|
def get_cz_table(unitaries): |
|
|
""" Compute the lookup table for the CZ (A&B eq. 9) """ |
|
|
""" Compute the lookup table for the CZ (A&B eq. 9) """ |
|
|
commuters = (qi.id, qi.px, qi.pz, qi.ph, hermitian_conjugate(qi.ph)) |
|
|
commuters = (qi.id, qi.px, qi.pz, qi.ph, hermitian_conjugate(qi.ph)) |
|
@@ -95,8 +94,19 @@ def get_cz_table(unitaries): |
|
|
cz_table[bond, c1, c2] = find_cz(bond, c1, c2, commuters, state_table) |
|
|
cz_table[bond, c1, c2] = find_cz(bond, c1, c2, commuters, state_table) |
|
|
return cz_table |
|
|
return cz_table |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
unitaries = get_unitaries(DECOMPOSITIONS) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not __name__ == "__main__": |
|
|
|
|
|
try: |
|
|
|
|
|
unitaries = np.load("tables/unitaries.npy") |
|
|
|
|
|
conjugation_table = np.load("tables/conjugation_table.npy") |
|
|
|
|
|
times_table = np.load("tables/times_table.npy") |
|
|
|
|
|
cz_table = np.load("tables/cz_table.npy") |
|
|
|
|
|
except IOError: |
|
|
|
|
|
print "Precomputed tables not found, try running `python make_tables.py`" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
unitaries = get_unitaries(decompositions) |
|
|
conjugation_table = get_conjugation_table(unitaries) |
|
|
conjugation_table = get_conjugation_table(unitaries) |
|
|
times_table = get_times_table(unitaries) |
|
|
times_table = get_times_table(unitaries) |
|
|
cz_table = get_cz_table(unitaries) |
|
|
cz_table = get_cz_table(unitaries) |
|
@@ -104,4 +114,4 @@ if __name__ == '__main__': |
|
|
np.save("tables/unitaries.npy", unitaries) |
|
|
np.save("tables/unitaries.npy", unitaries) |
|
|
np.save("tables/conjugation_table.npy", conjugation_table) |
|
|
np.save("tables/conjugation_table.npy", conjugation_table) |
|
|
np.save("tables/times_table.npy", times_table) |
|
|
np.save("tables/times_table.npy", times_table) |
|
|
np.save("cz_table.npy", cz_table) |
|
|
|
|
|
|
|
|
np.save("tables/cz_table.npy", cz_table) |