mirror of
https://github.com/blackboxprogramming/lucidia.git
synced 2026-03-17 06:57:10 -05:00
81 lines
2.0 KiB
Python
81 lines
2.0 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass
|
|
from typing import Tuple
|
|
import math
|
|
import cmath
|
|
|
|
@dataclass
|
|
class Qubit:
|
|
"""
|
|
A simple representation of a qubit for algorithm demonstrations.
|
|
|
|
Attributes
|
|
----------
|
|
alpha : complex
|
|
Amplitude of the |0> basis state.
|
|
beta : complex
|
|
Amplitude of the |1> basis state.
|
|
"""
|
|
alpha: complex
|
|
beta: complex
|
|
|
|
def normalize(self) -> None:
|
|
"""
|
|
Normalize the qubit so that |alpha|^2 + |beta|^2 = 1.
|
|
"""
|
|
norm = math.sqrt(abs(self.alpha)**2 + abs(self.beta)**2)
|
|
if norm == 0:
|
|
raise ValueError("Cannot normalize a zero vector.")
|
|
self.alpha /= norm
|
|
self.beta /= norm
|
|
|
|
|
|
def hadamard(qubit: Qubit) -> Qubit:
|
|
"""
|
|
Apply the Hadamard gate to a single qubit.
|
|
|
|
The Hadamard transform creates superposition: H|0> = (|0> + |1>)/sqrt(2), H|1> = (|0> - |1>)/sqrt(2).
|
|
|
|
Parameters
|
|
----------
|
|
qubit : Qubit
|
|
The input qubit to transform.
|
|
|
|
Returns
|
|
-------
|
|
Qubit
|
|
A new qubit after applying the Hadamard gate.
|
|
"""
|
|
inv_sqrt2 = 1.0 / math.sqrt(2)
|
|
new_alpha = inv_sqrt2 * (qubit.alpha + qubit.beta)
|
|
new_beta = inv_sqrt2 * (qubit.alpha - qubit.beta)
|
|
return Qubit(alpha=new_alpha, beta=new_beta)
|
|
|
|
|
|
def phase_shift(qubit: Qubit, theta: float) -> Qubit:
|
|
"""
|
|
Apply a phase shift gate to the |1> component of a qubit.
|
|
|
|
Parameters
|
|
----------
|
|
qubit : Qubit
|
|
The input qubit.
|
|
theta : float
|
|
Phase angle in radians.
|
|
|
|
Returns
|
|
-------
|
|
Qubit
|
|
A new qubit with the |1> component phase-shifted.
|
|
"""
|
|
return Qubit(alpha=qubit.alpha, beta=qubit.beta * cmath.exp(1j * theta))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Example: apply Hadamard to |0> and then a phase shift of π/2
|
|
q0 = Qubit(alpha=1+0j, beta=0+0j)
|
|
hq = hadamard(q0)
|
|
print("After Hadamard:", hq)
|
|
pq = phase_shift(hq, math.pi / 2)
|
|
print("After phase shift (\u03c0/2):", pq)
|