dense-Evolution / tests /unit /test_qft.py
Tatopenn's picture
Sync mirror with GitHub main (v8.1.62): subpackage refactor, mitigation promotions, MCP server refactor
2a87ede verified
Raw History Blame Contribute Delete
2.24 kB
"""
Unit tests for dense_evolution/qft.py -- cross-checked against the
brute-force analytic DFT matrix, not just against its own derivation.
"""
import numpy as np
import pytest
from dense_evolution import DenseSVSimulator
from dense_evolution.qft import qft
def _dft_matrix(dim):
"""M[j, k] = exp(2*pi*i*j*k/dim) / sqrt(dim), so QFT|j> = sum_k M[j,k]|k>."""
j_idx, k_idx = np.meshgrid(np.arange(dim), np.arange(dim), indexing='ij')
return np.exp(2j * np.pi * j_idx * k_idx / dim) / np.sqrt(dim)
class TestQft:
@pytest.mark.parametrize('n_qubits', [1, 2, 3, 4])
def test_matches_brute_force_dft_matrix(self, n_qubits):
dim = 2 ** n_qubits
M = _dft_matrix(dim)
for j in range(dim):
sim = DenseSVSimulator(n_qubits, use_gpu=False, use_float32=False)
init = np.zeros(dim, dtype=complex)
init[j] = 1.0
sim.set_initial_state(init)
sim.run_circuit(qft(n_qubits))
got = sim.get_statevector()
assert np.max(np.abs(got - M[j])) < 1e-9
def test_qft_of_zero_state_is_uniform_superposition(self):
n_qubits = 3
sim = DenseSVSimulator(n_qubits, use_gpu=False, use_float32=False)
sim.run_circuit(qft(n_qubits))
probs = sim.get_probabilities()
assert np.allclose(probs, 1.0 / 2 ** n_qubits, atol=1e-9)
def test_round_trip_qft_and_inverse_recovers_original_state(self):
n_qubits = 3
dim = 2 ** n_qubits
rng = np.random.default_rng(0)
psi0 = rng.normal(size=dim) + 1j * rng.normal(size=dim)
psi0 /= np.linalg.norm(psi0)
sim = DenseSVSimulator(n_qubits, use_gpu=False, use_float32=False)
sim.set_initial_state(psi0.copy())
sim.run_circuit(qft(n_qubits) + qft(n_qubits, inverse=True))
assert np.max(np.abs(sim.get_statevector() - psi0)) < 1e-9
def test_without_swaps_differs_from_with_swaps(self):
assert qft(3, do_swaps=False) != qft(3, do_swaps=True)
assert qft(3, do_swaps=False) == qft(3, do_swaps=True)[:-1]
def test_rejects_fewer_than_one_qubit(self):
with pytest.raises(ValueError):
qft(0)