예제 #1
0
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)
예제 #2
0
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()
예제 #3
0
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()
예제 #4
0
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]])
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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))
예제 #9
0
파일: test_args.py 프로젝트: Visheshk/sympy
def test_sympy__physics__quantum__grover__OracleGate():
    from sympy.physics.quantum.grover import OracleGate
    assert _test_args(OracleGate())