def test_teleportation(): circuit = Circuit() circuit.add(Qubits(3)) circuit.add(CNOT(1, 2)) circuit.add(CNOT(0, 1)) circuit.add(Hadamard(0)) circuit.add(Measure([0, 1])) result = circuit.run(1024).result # All 16 states should be relatively equal probability if result["11"] == 1024: circuit.add(PauliX(2)) circuit.add(PauliZ(2)) elif result["10"] == 1024: circuit.add(PauliZ(2)) elif result["01"] == 1024: circuit.add(PauliX(2)) circuit.add(Measure([2])) result2 = circuit.run(1024).result # TODO: Fix this test. assert result2
def find_period(a, N): """WIP: Quantum subroutine for shor's algorithm. Finds the period of a function of the form: f(x) = a^x % N This uses the quantum fourier transform. """ circuit = Circuit() # circuit.add(Qubits(5)) # circuit.add(QFT(0, 1, 2, 3)) # circuit.add(X(4)) # circuit.add(quantum_amod_15(a)) # circuit.add(QFT(0, 1, 2, 3)) circuit.add(Qubits(5)) circuit.add(H(0)).add(H(1)).add(H(2)).add(H(3)) circuit.add(X(4)) circuit.add(quantum_amod_15(a)) circuit.add(QFT(3, 2, 1, 0)) # Inverse Quantum Fourier transform job = circuit.run(1024) result = job.result # TODO: This is still broken, likely due to differences between Qiskit and our library # See: https://github.com/shor-team/shor/issues/39 # from shor.utils.visual import plot_results # plot_results(result) most_common = result.counts.most_common() if len(most_common) > 1: return gcd(most_common[0][0], most_common[1][0]) return 1
def test_u3_int(): circuit_1 = Circuit() circuit_1.add(Qubits(1)) circuit_1.add(U3(0, theta=np.pi / 2, phi=-np.pi / 2, lam=np.pi / 2)) circuit_1.add(Measure([0])) circuit_2 = Circuit() circuit_2.add(Qubits(1)) circuit_2.add(Rx(theta=np.pi)) circuit_2.add(Measure([0])) result_1 = circuit_1.run(1024).result result_2 = circuit_2.run(1024).result assert result_1["0"] > 450 assert result_1["1"] > 450 assert result_2["0"] > 450 assert result_2["1"] > 450
def test_u2_int(): circuit_1 = Circuit() circuit_1.add(Qubits(1)) circuit_1.add(U2(0, phi=-np.pi / 2, alpha=np.pi / 2)) circuit_1.add(Measure([0])) result_1 = circuit_1.run(1024).result assert result_1["0"] > 450 assert result_1["1"] > 450
def test_ry_int(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(Ry(0, angle=np.pi / 2)) circuit.add(Measure([0])) job = circuit.run(1000) result = job.result assert result["0"] > 450 assert result["1"] > 450
def test_t_integration(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(T(0)) # Can also use H() circuit.add(Measure([0])) job = circuit.run(1024) result = job.result assert result["0"] == 1024 assert result["1"] == 0
def test_u1_integration(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(PauliX(0)) circuit.add(U1(0)) circuit.add(Measure([0])) job = circuit.run(1024) result = job.result assert result["0"] == 0 assert result["1"] == 1024
def test_id_qubit(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(ID(0)) circuit.add(Measure([0])) job = circuit.run(1024) result = job.result # Accounting for random noise, results won't be exact assert result["1"] == 0 assert result["0"] == 1024
def test_pauliy_integration(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(PauliY(0)) # Can also use H() circuit.add(Measure([0])) job = circuit.run(1024) result = job.result # Accounting for random noise, results won't be exact assert result["0"] == 0 assert result["1"] == 1024
def test_modulus_circuit(): circuit = Circuit() circuit.add(Qbits(5)) circuit.add(quantum_amod_15(4)) circuit.add(Measure([0, 1])) job = circuit.run(1024) result = job.result print(result)
def test_inity_int(): circuit_1 = Circuit() circuit_1.add(Qubits(1)) circuit_1.add(Init_y(0)) circuit_1.add(Measure([0])) result_1 = circuit_1.run(1024).result assert result_1["0"] > 450 assert result_1["1"] > 450
def test_single_qubit(): circuit = Circuit() circuit.add(Qubits(1)) circuit.add(Hadamard(0)) circuit.add(Measure([0])) job = circuit.run(1024, provider=QiskitProvider()) result = job.result # Accounting for random noise, results won't be exact assert result[bin(0)] > 450 assert result[bin(1)] > 450
def test_crz_integration(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(CRZ(0, 1, angle=math.pi / 3)) circuit.add(Measure(0, 1)) job = circuit.run(1024) result = job.result assert result["11"] == 0 assert result["00"] == 1024 assert result["10"] == 0 assert result["01"] == 0
def test_crk_int(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(CRk(0, 1, k=2)) circuit.add(Measure(0, 1)) result = circuit.run(1000).result assert result["00"] == 1000 assert result["01"] == 0 assert result["10"] == 0 assert result["11"] == 0
def test_cr_int(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(Cr(0, 1, angle=np.pi / 2)) circuit.add(Measure(0, 1)) result = circuit.run(1000).result assert result["00"] == 1000 assert result["01"] == 0 assert result["10"] == 0 assert result["11"] == 0
def test_entanglement(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(Hadamard(0)) circuit.add(CNOT(0, 1)) circuit.add(Measure([0, 1])) job = circuit.run(1024) result = job.result assert result["01"] == 0 assert result["10"] == 0 assert result["00"] > 450 assert result["11"] > 450
def test_swap_integration(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(PauliX(0)) circuit.add(SWAP(0, 1)) circuit.add(Measure([0, 1])) job = circuit.run(1024) result = job.result assert result["11"] == 0 assert result["00"] == 0 assert result["01"] == 0 assert result["10"] == 1024
def test_mult_gate_inputs1(): circuit_1 = Circuit() circuit_1.add(Qubits(2)) circuit_1.add(H([0, 1])) circuit_1.add(Measure(0, 1)) result_1 = circuit_1.run(1024).result assert result_1["00"] > 215 assert result_1["11"] > 215 assert result_1["10"] > 215 assert result_1["01"] > 215
def test_multi_hadamard(): circuit = Circuit() circuit.add(Qubits(4)) circuit.add(Hadamard(0)) circuit.add(Hadamard(1)) circuit.add(Hadamard(2)) circuit.add(Hadamard(3)) circuit.add(Measure([0, 1, 2, 3])) job = circuit.run(1024) result = job.result # All 16 states should be relatively equal probability assert len(result.counts) == 16 assert max(result.counts.values()) - min(result.counts.values()) < 50
def test_unitary_symmetry_does_nothing(): symmetric_circuit_1 = Circuit() symmetric_circuit_1.add(Qubits(2)) symmetric_circuit_1.add(Hadamard(0)) symmetric_circuit_1.add(Hadamard(0)) symmetric_circuit_1.add(CNOT(0, 1)) symmetric_circuit_1.add(CNOT(0, 1)) symmetric_circuit_1.add(Measure([0, 1])) symmetric_circuit_2 = Circuit() symmetric_circuit_2.add(Qubits(2, state=1)) symmetric_circuit_2.add(Hadamard(0)) symmetric_circuit_2.add(CNOT(0, 1)) symmetric_circuit_2.add(CNOT(0, 1)) symmetric_circuit_2.add(Hadamard(0)) symmetric_circuit_2.add(Measure([0, 1])) result_1 = symmetric_circuit_1.run(1024).result result_2 = symmetric_circuit_2.run(1024).result assert result_1.counts.get(0) == 1024 assert result_2.counts.get(0) == 1024
def test_cz2_int(): circuit_1 = Circuit() circuit_1.add(Qubits(2)) circuit_1.add(PauliX(0)) circuit_1.add(Cz(0, 1)) circuit_1.add(Measure(0, 1)) result_1 = circuit_1.run(1024).result assert result_1["00"] == 0 assert result_1["11"] == 0 assert result_1["01"] == 1024 assert result_1["10"] == 0
def test_cz_int(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(Hadamard(0)) circuit.add(Hadamard(1)) circuit.add(Cz(0, 1)) circuit.add(Measure([0, 1])) job = circuit.run(1000) result = job.result assert result["00"] > 210 assert result["01"] > 210 assert result["10"] > 210 assert result["11"] > 210
def test_ch_integration(): circuit = Circuit() circuit.add(Qubits(2)) circuit.add(PauliX(0)) circuit.add(PauliX(1)) circuit.add(CH(0, 1)) circuit.add(Measure(0, 1)) job = circuit.run(1024) result = job.result assert result["11"] > 450 assert result["00"] == 0 assert result["10"] == 0 assert result["01"] > 450
def test_multi_gate_int(): circuit_1 = Circuit() circuit_1.add(Qubits(2)) circuit_1.add(PauliX(0)) circuit_1.add(CNOT(0, 1)) circuit_1.add(CH(0, 1)) circuit_1.add(Measure(0, 1)) result_1 = circuit_1.run(1024).result assert result_1["00"] == 0 assert result_1["11"] > 450 assert result_1["01"] > 450 assert result_1["10"] == 0
def test_multi_entangle(): circuit = Circuit() circuit.add(Qubits(4)) circuit.add(Hadamard(0)) circuit.add(CNOT(0, 1)) circuit.add(CNOT(0, 2)) circuit.add(CNOT(0, 3)) circuit.add(Measure([0, 1, 2, 3])) job = circuit.run(1024) result = job.result assert result["0001"] == 0 assert result["1000"] == 0 assert result["0000"] > 450 assert result["1111"] > 450
def test_cx_int(): circuit_1 = Circuit() circuit_1.add(Qubits(2)) circuit_1.add(Hadamard(0)) circuit_1.add(Cx(0, 1)) circuit_1.add(Measure([0, 1])) circuit_2 = Circuit() circuit_2.add(Qubits(2)) circuit_2.add(Hadamard(1)) circuit_2.add(Cx(0, 1)) circuit_2.add(Measure([0, 1])) result_1 = circuit_1.run(1024).result result_2 = circuit_2.run(1024).result assert result_1["01"] == 0 assert result_1["10"] == 0 assert result_1["00"] > 450 assert result_1["11"] > 450 assert result_2["01"] == 0 assert result_2["10"] > 450 assert result_2["00"] > 450 assert result_2["11"] == 0
def test_QFT(): qbits = Qbits(4) X = Circuit() X.add(qbits) X.add(H(0)).add(H(1)).add(H(2)).add(H(3)) X.add(QFT(0, 1, 2, 3)) X.add(Measure([0, 1, 2, 3])) # # qc2 = QuantumCircuit() + H(qbits[0]) + X(qbits[1]) # # qbits = Qbits(4) # qc = H(qbits) * QFT(qbits) # # qc += QFT(qbits[0:3]) # qc += qc2 # # qc.add(H()) # # qc = H(qc[0:3]) # qc = Z(qc[1]) # # qbits = Qbits(4) # cbits = Cbits(4) # # qc = QuantumCircuit(qbits=qbits, cbits=cbits) # -> err # qc += Hadamard(qbits[0]) + Z(qbits[1]) # # qc.add(Measure([qbits[0]])) # qc += Measure(qbits[0]) # # qc.add(Measure(qbits), name='Output') # X = Circuit(qbits) # X = H(X) # Y = Z(X) # A = H(X) # # qbits = Qbits(4) # X = Circuit() + qbits + H(qbits) + QFT(qbits) + Measure(qbits) # # Y = X.run(QuantumSimulator, times=100) job = X.run(1024) result = job.result assert result
def test_ccnot_integration(): circuit = Circuit() circuit.add(Qubits(3)) circuit.add(PauliX(0)) circuit.add(PauliX(1)) circuit.add(CCNOT(0, 1, 2)) circuit.add(Measure([0, 1, 2])) job = circuit.run(1024) result = job.result assert result["000"] == 0 assert result["001"] == 0 assert result["010"] == 0 assert result["100"] == 0 assert result["110"] == 0 assert result["101"] == 0 assert result["011"] == 0 assert result["111"] == 1024
def test_quantum_multi_hadamard_partial_measure(): circuit_1 = Circuit() circuit_1.add(Qubits(4)) circuit_1.add(H(range(4))) circuit_1.add(Measure(0, 1)) result_1 = circuit_1.run(1024).result print(result_1.counts) assert all(r > 215 for r in [ result_1["0000"], result_1["0001"], result_1["0010"], result_1["0011"] ]) # Ony measuring the 2 right-most qbits. Shouldn't see measurements for other qbits. assert result_1["1000"] == result_1["1001"] == result_1[ "1010"] == result_1["1011"] == 0 assert result_1["1100"] == result_1["1101"] == result_1[ "1110"] == result_1["1111"] == 0 assert result_1["0100"] == result_1["0101"] == result_1[ "0110"] == result_1["0111"] == 0