def test_OracleGate(): v = OracleGate(1, lambda qubits: qubits == IntQubit(0)) assert qapply(v*IntQubit(0)) == -IntQubit(0) assert qapply(v*IntQubit(1)) == IntQubit(1) nbits = 2 v = OracleGate(2, return_one_on_two) assert qapply(v*IntQubit(0, nbits)) == IntQubit(0, nbits) assert qapply(v*IntQubit(1, nbits)) == IntQubit(1, nbits) assert qapply(v*IntQubit(2, nbits)) == -IntQubit(2, nbits) assert qapply(v*IntQubit(3, nbits)) == IntQubit(3, nbits)
def main(): print() print('Demonstration of Grover\'s Algorithm') print('The OracleGate or V Gate carries the unknown function f(x)') print( '> V|x> = ((-1)^f(x))|x> where f(x) = 1 when x = a (True in our case)') print('> and 0 (False in our case) otherwise') print() nqubits = 2 print('nqubits = ', nqubits) v = OracleGate(nqubits, black_box) print('Oracle or v = OracleGate(%r, black_box)' % nqubits) print() psi = superposition_basis(nqubits) print('psi:') pprint(psi) demo_vgate_app(v) print('qapply(v*psi)') pprint(qapply(v * psi)) print() w = WGate(nqubits) print('WGate or w = WGate(%r)' % nqubits) print('On a 2 Qubit system like psi, 1 iteration is enough to yield |1>') print('qapply(w*v*psi)') pprint(qapply(w * v * psi)) print() nqubits = 3 print('On a 3 Qubit system, it requires 2 iterations to achieve') print('|1> with high enough probability') psi = superposition_basis(nqubits) print('psi:') pprint(psi) v = OracleGate(nqubits, black_box) print('Oracle or v = OracleGate(%r, black_box)' % nqubits) print() print('iter1 = grover.grover_iteration(psi, v)') iter1 = qapply(grover_iteration(psi, v)) pprint(iter1) print() print('iter2 = grover.grover_iteration(iter1, v)') iter2 = qapply(grover_iteration(iter1, v)) pprint(iter2) print()
def main(): print() print("Demonstration of Grover's Algorithm") print("The OracleGate or V Gate carries the unknown function f(x)") print( "> V|x> = ((-1)^f(x))|x> where f(x) = 1 when x = a (True in our case)") print("> and 0 (False in our case) otherwise") print() nqubits = 2 print("nqubits = ", nqubits) v = OracleGate(nqubits, black_box) print("Oracle or v = OracleGate(%r, black_box)" % nqubits) print() psi = superposition_basis(nqubits) print("psi:") pprint(psi) demo_vgate_app(v) print("qapply(v*psi)") pprint(qapply(v * psi)) print() w = WGate(nqubits) print("WGate or w = WGate(%r)" % nqubits) print("On a 2 Qubit system like psi, 1 iteration is enough to yield |1>") print("qapply(w*v*psi)") pprint(qapply(w * v * psi)) print() nqubits = 3 print("On a 3 Qubit system, it requires 2 iterations to achieve") print("|1> with high enough probability") psi = superposition_basis(nqubits) print("psi:") pprint(psi) v = OracleGate(nqubits, black_box) print("Oracle or v = OracleGate(%r, black_box)" % nqubits) print() print("iter1 = grover.grover_iteration(psi, v)") iter1 = qapply(grover_iteration(psi, v)) pprint(iter1) print() print("iter2 = grover.grover_iteration(iter1, v)") iter2 = qapply(grover_iteration(iter1, v)) pprint(iter2) print()
def test_OracleGate(): v = OracleGate(1, lambda qubits: qubits == IntQubit(0)) assert qapply(v*IntQubit(0)) == -IntQubit(0) assert qapply(v*IntQubit(1)) == IntQubit(1) nbits = 2 v = OracleGate(2, return_one_on_two) assert qapply(v*IntQubit(0, nbits)) == IntQubit(0, nqubits=nbits) assert qapply(v*IntQubit(1, nbits)) == IntQubit(1, nqubits=nbits) assert qapply(v*IntQubit(2, nbits)) == -IntQubit(2, nbits) assert qapply(v*IntQubit(3, nbits)) == IntQubit(3, nbits) assert represent(OracleGate(1, lambda qubits: qubits == IntQubit(0)), nqubits=1) == \ Matrix([[-1, 0], [0, 1]]) assert represent(v, nqubits=2) == Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
def test_OracleGate(): v = OracleGate(1, lambda qubits: qubits == IntQubit(0)) assert qapply(v*IntQubit(0)) == -IntQubit(0) assert qapply(v*IntQubit(1)) == IntQubit(1) nbits = 2 v = OracleGate(2, return_one_on_two) assert qapply(v*IntQubit(0, nbits)) == IntQubit(0, nbits) assert qapply(v*IntQubit(1, nbits)) == IntQubit(1, nbits) assert qapply(v*IntQubit(2, nbits)) == -IntQubit(2, nbits) assert qapply(v*IntQubit(3, nbits)) == IntQubit(3, nbits) # Due to a bug of IntQubit, this first assertion is buggy # assert represent(OracleGate(1, lambda qubits: qubits == IntQubit(0)), nqubits=1) == \ # Matrix([[-1/sqrt(2), 0], [0, 1/sqrt(2)]]) assert represent(v, nqubits=2) == Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
def test_grover_iteration_2(): numqubits = 4 basis_states = superposition_basis(numqubits) v = OracleGate(numqubits, return_one_on_two) # After (pi/4)sqrt(pow(2, n)), IntQubit(2) should have highest prob # In this case, after around pi times (3 or 4) iterated = grover_iteration(basis_states, v) iterated = qapply(iterated) iterated = grover_iteration(iterated, v) iterated = qapply(iterated) iterated = grover_iteration(iterated, v) iterated = qapply(iterated) # In this case, probability was highest after 3 iterations # Probability of Qubit('0010') was 251/256 (3) vs 781/1024 (4) # Ask about measurement expected = (-13*basis_states)/64 + 264*IntQubit(2, numqubits)/256 assert qapply(expected) == iterated
def test_grover_iteration_1(): numqubits = 2 basis_states = superposition_basis(numqubits) v = OracleGate(numqubits, return_one_on_one) expected = IntQubit(1, nqubits=numqubits) assert qapply(grover_iteration(basis_states, v)) == expected
qcol.add(q4.qutuple) qcol.add(q5.qutuple) qcol.add(q6.qutuple) qcol.add(q7.qutuple) qcol.add(q8.qutuple) f1 = lambda qubits: qubits == IntQubit(1) f2 = lambda qubits: qubits == IntQubit(2) f3 = lambda qubits: qubits == IntQubit(3) f4 = lambda qubits: qubits == IntQubit(4) f5 = lambda qubits: qubits == IntQubit(5) f6 = lambda qubits: qubits == IntQubit(6) f7 = lambda qubits: qubits == IntQubit(7) f8 = lambda qubits: qubits == IntQubit(8) v1 = OracleGate(q1.nQubits(), f1) v2 = OracleGate(q2.nQubits(), f2) v3 = OracleGate(q3.nQubits(), f3) v4 = OracleGate(q4.nQubits(), f4) v5 = OracleGate(q5.nQubits(), f5) v6 = OracleGate(q6.nQubits(), f6) v7 = OracleGate(q7.nQubits(), f7) v8 = OracleGate(q8.nQubits(), f8) print("Applied Oracle Gates:") print(qapply(v1 * q1.qubit)) print(qapply(v2 * q2.qubit)) print(qapply(v3 * q3.qubit)) print(qapply(v4 * q4.qubit)) print(qapply(v5 * q5.qubit)) print(qapply(v6 * q6.qubit))
def test_sympy__physics__quantum__grover__OracleGate(): from sympy.physics.quantum.grover import OracleGate assert _test_args(OracleGate())