mirror of
https://github.com/kristoferssolo/grovers-visualizer.git
synced 2025-10-21 20:10:35 +00:00
feat(qubit): add custom qubit state type
This commit is contained in:
parent
ce20929469
commit
4a17ccf608
@ -14,8 +14,10 @@ from matplotlib.axes import Axes
|
|||||||
from qiskit import QuantumCircuit
|
from qiskit import QuantumCircuit
|
||||||
from qiskit_aer import AerSimulator
|
from qiskit_aer import AerSimulator
|
||||||
|
|
||||||
|
from grovers_visualizer.state import QubitState
|
||||||
|
|
||||||
def x(qc: QuantumCircuit, target_state: str) -> None:
|
|
||||||
|
def x(qc: QuantumCircuit, target_state: QubitState) -> None:
|
||||||
for i, bit in enumerate(reversed(target_state)):
|
for i, bit in enumerate(reversed(target_state)):
|
||||||
if bit == "0":
|
if bit == "0":
|
||||||
qc.x(i)
|
qc.x(i)
|
||||||
@ -33,7 +35,7 @@ def ccz(qc: QuantumCircuit, n: int) -> None:
|
|||||||
qc.h(n - 1)
|
qc.h(n - 1)
|
||||||
|
|
||||||
|
|
||||||
def oracule(qc: QuantumCircuit, target_state: str) -> None:
|
def oracule(qc: QuantumCircuit, target_state: QubitState) -> None:
|
||||||
n = len(target_state)
|
n = len(target_state)
|
||||||
|
|
||||||
x(qc, target_state)
|
x(qc, target_state)
|
||||||
@ -56,7 +58,7 @@ def diffusion(qc: QuantumCircuit, n: int) -> None:
|
|||||||
qc.h(range(n))
|
qc.h(range(n))
|
||||||
|
|
||||||
|
|
||||||
def grover_search(n: int, target_state: str) -> QuantumCircuit:
|
def grover_search(n: int, target_state: QubitState) -> QuantumCircuit:
|
||||||
qc = QuantumCircuit(n, n)
|
qc = QuantumCircuit(n, n)
|
||||||
|
|
||||||
qc.h(range(n))
|
qc.h(range(n))
|
||||||
@ -97,7 +99,7 @@ def main() -> None:
|
|||||||
plt.ion()
|
plt.ion()
|
||||||
|
|
||||||
for state in states:
|
for state in states:
|
||||||
qc = grover_search(n_qubits, state)
|
qc = grover_search(n_qubits, QubitState(state))
|
||||||
|
|
||||||
print(qc.draw("text"))
|
print(qc.draw("text"))
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,45 @@
|
|||||||
|
from collections.abc import Iterator
|
||||||
|
from typing import Final, Self, override
|
||||||
|
|
||||||
|
|
||||||
|
class QubitState:
|
||||||
|
def __init__(self, bits: str) -> None:
|
||||||
|
if not all(b in "01" for b in bits):
|
||||||
|
raise ValueError(f"{self.__class__.__name__} must be a string of '0' and '1'")
|
||||||
|
self._bits: Final[str] = bits
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bits(self) -> str:
|
||||||
|
return self._bits
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_int(cls, value: int, num_qubits: int) -> Self:
|
||||||
|
bits = format(value, f"0{num_qubits}b")
|
||||||
|
return cls(bits)
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self._bits
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"{self.__class__.__name__}('{self.bits}')"
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __eq__(self, value: object, /) -> bool:
|
||||||
|
if isinstance(value, QubitState):
|
||||||
|
return self.bits == value.bits
|
||||||
|
return False
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __hash__(self) -> int:
|
||||||
|
return hash(self.bits)
|
||||||
|
|
||||||
|
def __len__(self) -> int:
|
||||||
|
return len(self.bits)
|
||||||
|
|
||||||
|
def __getitem__(self, idx: int | slice) -> str:
|
||||||
|
return self.bits[idx]
|
||||||
|
|
||||||
|
def __iter__(self) -> Iterator[str]:
|
||||||
|
return iter(self.bits)
|
||||||
Loading…
Reference in New Issue
Block a user