import numpy as np from tqdm import tqdm import os from qi import * import cPickle def find_up_to_phase(u): """ Find the index of a given u within a list of unitaries, up to a global phase """ global unitaries for i, t in enumerate(unitaries): for phase in range(8): if np.allclose(t, np.exp(1j*phase*np.pi/4.)*u): return i, phase raise IndexError def compose_u(decomposition): """ Get the unitary representation of a particular decomposition """ us = (elements[c] for c in decomposition) return np.matrix(reduce(np.dot, us), dtype=complex) def construct_tables(): """ Constructs multiplication and conjugation tables """ 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] for u in tqdm(unitaries, "Building times-table")] with open("tables.pkl", "w") as f: cPickle.dump((conjugation_table, times_table), f) #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] 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") elements = {"x": sqx, "z": msqz} unitaries = [compose_u(d) for d in decompositions] # 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) if __name__ == '__main__': pass