test_grover.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from sympy.functions.elementary.miscellaneous import sqrt
  2. from sympy.matrices.dense import Matrix
  3. from sympy.physics.quantum.represent import represent
  4. from sympy.physics.quantum.qapply import qapply
  5. from sympy.physics.quantum.qubit import IntQubit
  6. from sympy.physics.quantum.grover import (apply_grover, superposition_basis,
  7. OracleGate, grover_iteration, WGate)
  8. def return_one_on_two(qubits):
  9. return qubits == IntQubit(2, qubits.nqubits)
  10. def return_one_on_one(qubits):
  11. return qubits == IntQubit(1, nqubits=qubits.nqubits)
  12. def test_superposition_basis():
  13. nbits = 2
  14. first_half_state = IntQubit(0, nqubits=nbits)/2 + IntQubit(1, nqubits=nbits)/2
  15. second_half_state = IntQubit(2, nbits)/2 + IntQubit(3, nbits)/2
  16. assert first_half_state + second_half_state == superposition_basis(nbits)
  17. nbits = 3
  18. firstq = (1/sqrt(8))*IntQubit(0, nqubits=nbits) + (1/sqrt(8))*IntQubit(1, nqubits=nbits)
  19. secondq = (1/sqrt(8))*IntQubit(2, nbits) + (1/sqrt(8))*IntQubit(3, nbits)
  20. thirdq = (1/sqrt(8))*IntQubit(4, nbits) + (1/sqrt(8))*IntQubit(5, nbits)
  21. fourthq = (1/sqrt(8))*IntQubit(6, nbits) + (1/sqrt(8))*IntQubit(7, nbits)
  22. assert firstq + secondq + thirdq + fourthq == superposition_basis(nbits)
  23. def test_OracleGate():
  24. v = OracleGate(1, lambda qubits: qubits == IntQubit(0))
  25. assert qapply(v*IntQubit(0)) == -IntQubit(0)
  26. assert qapply(v*IntQubit(1)) == IntQubit(1)
  27. nbits = 2
  28. v = OracleGate(2, return_one_on_two)
  29. assert qapply(v*IntQubit(0, nbits)) == IntQubit(0, nqubits=nbits)
  30. assert qapply(v*IntQubit(1, nbits)) == IntQubit(1, nqubits=nbits)
  31. assert qapply(v*IntQubit(2, nbits)) == -IntQubit(2, nbits)
  32. assert qapply(v*IntQubit(3, nbits)) == IntQubit(3, nbits)
  33. assert represent(OracleGate(1, lambda qubits: qubits == IntQubit(0)), nqubits=1) == \
  34. Matrix([[-1, 0], [0, 1]])
  35. assert represent(v, nqubits=2) == Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
  36. def test_WGate():
  37. nqubits = 2
  38. basis_states = superposition_basis(nqubits)
  39. assert qapply(WGate(nqubits)*basis_states) == basis_states
  40. expected = ((2/sqrt(pow(2, nqubits)))*basis_states) - IntQubit(1, nqubits=nqubits)
  41. assert qapply(WGate(nqubits)*IntQubit(1, nqubits=nqubits)) == expected
  42. def test_grover_iteration_1():
  43. numqubits = 2
  44. basis_states = superposition_basis(numqubits)
  45. v = OracleGate(numqubits, return_one_on_one)
  46. expected = IntQubit(1, nqubits=numqubits)
  47. assert qapply(grover_iteration(basis_states, v)) == expected
  48. def test_grover_iteration_2():
  49. numqubits = 4
  50. basis_states = superposition_basis(numqubits)
  51. v = OracleGate(numqubits, return_one_on_two)
  52. # After (pi/4)sqrt(pow(2, n)), IntQubit(2) should have highest prob
  53. # In this case, after around pi times (3 or 4)
  54. iterated = grover_iteration(basis_states, v)
  55. iterated = qapply(iterated)
  56. iterated = grover_iteration(iterated, v)
  57. iterated = qapply(iterated)
  58. iterated = grover_iteration(iterated, v)
  59. iterated = qapply(iterated)
  60. # In this case, probability was highest after 3 iterations
  61. # Probability of Qubit('0010') was 251/256 (3) vs 781/1024 (4)
  62. # Ask about measurement
  63. expected = (-13*basis_states)/64 + 264*IntQubit(2, numqubits)/256
  64. assert qapply(expected) == iterated
  65. def test_grover():
  66. nqubits = 2
  67. assert apply_grover(return_one_on_one, nqubits) == IntQubit(1, nqubits=nqubits)
  68. nqubits = 4
  69. basis_states = superposition_basis(nqubits)
  70. expected = (-13*basis_states)/64 + 264*IntQubit(2, nqubits)/256
  71. assert apply_grover(return_one_on_two, 4) == qapply(expected)