def make_XY_model(num_qubits): import qubit_network.analytical_conditions as ac def X(i, num_qubits=3): zeros = [0] * num_qubits zeros[i] = 1 return ac.pauli_product(*zeros) def Y(i, num_qubits=3): zeros = [0] * num_qubits zeros[i] = 2 return ac.pauli_product(*zeros) def Z(i, num_qubits=3): zeros = [0] * num_qubits zeros[i] = 3 return ac.pauli_product(*zeros) def XX(i, j, num_qubits=3): return X(i, num_qubits) * X(j, num_qubits) def YY(i, j, num_qubits=3): return Y(i, num_qubits) * Y(j, num_qubits) expr = sympy.zeros(2**num_qubits, 2**num_qubits) # all single-qubit interactions for idx in range(num_qubits): for pauli_idx in range(3): mol = [0] * num_qubits mol[idx] = pauli_idx + 1 expr += ac.pauli_product(*mol) * ac.J(*mol) # only XX and YY two-qubit interactions for pair in itertools.combinations(range(num_qubits), 2): molXX = [0] * num_qubits molXX[pair[0]] = 1 molXX[pair[1]] = 1 expr += ac.J(*molXX) * XX(pair[0], pair[1], num_qubits) molYY = [0] * num_qubits molYY[pair[0]] = 2 molYY[pair[1]] = 2 expr += ac.J(*molYY) * YY(pair[0], pair[1], num_qubits) # return final expression return expr
def make_fredkin_model(): import qubit_network.analytical_conditions as ac def X(i, num_qubits=3): zeros = [0] * num_qubits zeros[i - 1] = 1 return ac.pauli_product(*zeros) def Y(i, num_qubits=3): zeros = [0] * num_qubits zeros[i - 1] = 2 return ac.pauli_product(*zeros) def Z(i, num_qubits=3): zeros = [0] * num_qubits zeros[i - 1] = 3 return ac.pauli_product(*zeros) def XY(i, j, num_qubits=3): first_term = X(i, num_qubits) * X(j, num_qubits) second_term = Y(i, num_qubits) * Y(j, num_qubits) return first_term + second_term num_qubits = 3 expr = sympy.zeros(2**num_qubits, 2**num_qubits) # all single-qubit interactions for idx in range(num_qubits): for pauli_idx in range(3): mol = [0] * num_qubits mol[pauli_idx] = 1 expr += ac.pauli_product(*mol) * ac.J(*mol) # only XY two-qubit interactions for pair in itertools.combinations(range(num_qubits), 2): expr += ac.J(pair[0], pair[1]) * XY( pair[0], pair[1], num_qubits=num_qubits) # return final expression return expr
def Z(i, num_qubits=3): zeros = [0] * num_qubits zeros[i] = 3 return ac.pauli_product(*zeros)
def Y(i, num_qubits=3): zeros = [0] * num_qubits zeros[i - 1] = 2 return ac.pauli_product(*zeros)