mirror of
https://github.com/kristoferssolo/grovers-visualizer.git
synced 2025-10-21 20:10:35 +00:00
feat(circuits): improve runtime speed
This commit is contained in:
parent
f4b99262ec
commit
78952d9364
@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "grovers-visualizer"
|
name = "grovers-visualizer"
|
||||||
version = "0.4.3"
|
version = "0.5.0"
|
||||||
description = "A tiny Python package that steps through Grover’s Search algorithm."
|
description = "A tiny Python package that steps through Grover’s Search algorithm."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
|
|||||||
@ -11,6 +11,13 @@ def oracle(qc: QuantumCircuit, target_state: QubitState) -> None:
|
|||||||
encode_target_state(qc, target_state) # Undo
|
encode_target_state(qc, target_state) # Undo
|
||||||
|
|
||||||
|
|
||||||
|
def oracle_circuit(target: QubitState) -> QuantumCircuit:
|
||||||
|
n = len(target)
|
||||||
|
qc = QuantumCircuit(n)
|
||||||
|
oracle(qc, target)
|
||||||
|
return qc
|
||||||
|
|
||||||
|
|
||||||
def diffusion(qc: QuantumCircuit, n: int) -> None:
|
def diffusion(qc: QuantumCircuit, n: int) -> None:
|
||||||
"""Apply the Grovers diffusion operator."""
|
"""Apply the Grovers diffusion operator."""
|
||||||
qc.h(range(n))
|
qc.h(range(n))
|
||||||
@ -20,6 +27,12 @@ def diffusion(qc: QuantumCircuit, n: int) -> None:
|
|||||||
qc.h(range(n))
|
qc.h(range(n))
|
||||||
|
|
||||||
|
|
||||||
|
def diffusion_circuit(n: int) -> QuantumCircuit:
|
||||||
|
qc = QuantumCircuit(n)
|
||||||
|
diffusion(qc, n)
|
||||||
|
return qc
|
||||||
|
|
||||||
|
|
||||||
def encode_target_state(qc: QuantumCircuit, target_state: QubitState) -> None:
|
def encode_target_state(qc: QuantumCircuit, target_state: QubitState) -> None:
|
||||||
"""Apply X gates to qubits where the target state bit is '0'."""
|
"""Apply X gates to qubits where the target state bit is '0'."""
|
||||||
for i, bit in enumerate(reversed(target_state)):
|
for i, bit in enumerate(reversed(target_state)):
|
||||||
|
|||||||
@ -2,30 +2,32 @@ from collections.abc import Iterator
|
|||||||
from itertools import count
|
from itertools import count
|
||||||
|
|
||||||
from qiskit import QuantumCircuit
|
from qiskit import QuantumCircuit
|
||||||
|
from qiskit.qasm2.parse import Operator
|
||||||
from qiskit.quantum_info import Statevector
|
from qiskit.quantum_info import Statevector
|
||||||
|
|
||||||
from grovers_visualizer.circuit import diffusion, oracle
|
from grovers_visualizer.circuit import diffusion_circuit, oracle_circuit
|
||||||
from grovers_visualizer.state import QubitState
|
from grovers_visualizer.state import QubitState
|
||||||
|
|
||||||
|
|
||||||
def grover_evolver(target: QubitState, max_iterations: int = 0) -> Iterator[tuple[int, Statevector]]:
|
def grover_evolver(target: QubitState, max_iterations: int = 0) -> Iterator[tuple[int, Statevector]]:
|
||||||
"""Yields (iteration, statevector) pairs.
|
"""Yields (iteration, statevector) pairs.
|
||||||
|
|
||||||
iteration=0 is the uniform-Hadamard initialization. If
|
- iteration=0 is the uniform-Hadamard initialization
|
||||||
max_iterations > 0, stop after that many iterations. If
|
- max_iterations > 0, stop after that many iterations
|
||||||
max_iterations == 0, run indefinitely (until the consumer breaks).
|
- max_iterations == 0, run indefinitely (until the consumer breaks)
|
||||||
"""
|
"""
|
||||||
n_qubits = len(target)
|
n_qubits = len(target)
|
||||||
qc = QuantumCircuit(n_qubits)
|
qc = QuantumCircuit(n_qubits)
|
||||||
qc.h(range(n_qubits))
|
qc.h(range(n_qubits))
|
||||||
|
|
||||||
# initial statevector
|
# initial statevector
|
||||||
yield 0, Statevector.from_instruction(qc)
|
sv = Statevector.from_instruction(qc)
|
||||||
|
yield 0, sv
|
||||||
|
|
||||||
# pick an iterator for subsequent steps
|
oracle_op = Operator(oracle_circuit(target))
|
||||||
iter = range(1, max_iterations + 1) if max_iterations > 0 else count(1)
|
diffusion_op = Operator(diffusion_circuit(n_qubits))
|
||||||
|
|
||||||
for i in iter:
|
iters = range(1, max_iterations + 1) if max_iterations > 0 else count(1)
|
||||||
oracle(qc, target)
|
for i in iters:
|
||||||
diffusion(qc, n_qubits)
|
sv = sv.evolve(oracle_op).evolve(diffusion_op)
|
||||||
yield i, Statevector.from_instruction(qc)
|
yield i, sv
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user