def test_ffft_inverse(size): qubits = LineQubit.range(size) ffft_circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) ffft_circuit.append(cirq.inverse(ffft(qubits))) ffft_matrix = ffft_circuit.unitary(qubits_that_should_be_present=qubits) cirq.testing.assert_allclose_up_to_global_phase(ffft_matrix, np.identity(1 << size), atol=1e-8)
def test_ffft_text_diagram(): qubits = LineQubit.range(8) circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) assert circuit.to_text_diagram(transpose=True) == """ 0 1 2 3 4 5 6 7 │ │ │ │ │ │ │ │ 0↦0─1↦4───2↦1─3↦5───4↦2─5↦6───6↦3─7↦7 │ │ │ │ │ │ │ │ 0↦0─1↦2───2↦1─3↦3 0↦0─1↦2───2↦1─3↦3 │ │ │ │ │ │ │ │ F₀──F₀ F₀──F₀ F₀──F₀ F₀──F₀ │ │ │ │ │ │ │ │ 0↦0─1↦2───2↦1─3↦3 0↦0─1↦2───2↦1─3↦3 │ │ │ │ │ │ │ │ │ ω^0_4 │ ω^1_4 │ ω^0_4 │ ω^1_4 │ │ │ │ │ │ │ │ F₀──F₀ F₀──F₀ F₀──F₀ F₀──F₀ │ │ │ │ │ │ │ │ 0↦0─1↦2───2↦1─3↦3 0↦0─1↦2───2↦1─3↦3 │ │ │ │ │ │ │ │ 0↦0─1↦2───2↦4─3↦6───4↦1─5↦3───6↦5─7↦7 │ │ │ │ │ │ │ │ │ ω^0_8 │ ω^1_8 │ ω^2_8 │ ω^3_8 │ │ │ │ │ │ │ │ F₀──F₀ F₀──F₀ F₀──F₀ F₀──F₀ │ │ │ │ │ │ │ │ 0↦0─1↦4───2↦1─3↦5───4↦2─5↦6───6↦3─7↦7 │ │ │ │ │ │ │ │ """.strip()
def test_ffft_multi_fermionic_mode(n, initial): initial_state = _multi_fermionic_mode_base_state(n, *initial) expected_state = _fourier_transform_multi_fermionic_mode(n, *initial) qubits = LineQubit.range(n) circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) state = circuit.final_wavefunction(initial_state, qubits_that_should_be_present=qubits) assert np.allclose(state, expected_state, rtol=0.0)
def test_ffft_single_fermionic_modes(amplitudes): initial_state = _single_fermionic_modes_state(amplitudes) expected_state = _single_fermionic_modes_state( _fourier_transform_single_fermionic_modes(amplitudes)) qubits = LineQubit.range(len(amplitudes)) circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) state = circuit.final_wavefunction(initial_state, qubits_that_should_be_present=qubits) assert np.allclose(state, expected_state, rtol=0.0)
def test_ffft_multi_fermionic_mode_non_power_of_2(n, initial): initial_state = _multi_fermionic_mode_base_state(n, *initial) expected_state = _fourier_transform_multi_fermionic_mode(n, *initial) qubits = LineQubit.range(n) circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) state = circuit.final_wavefunction(initial_state, qubits_that_should_be_present=qubits) cirq.testing.assert_allclose_up_to_global_phase(state, expected_state, atol=1e-8)
def test_ffft_single_fermionic_modes_non_power_of_2(amplitudes): initial_state = _single_fermionic_modes_state(amplitudes) expected_state = _single_fermionic_modes_state( _fourier_transform_single_fermionic_modes(amplitudes)) qubits = LineQubit.range(len(amplitudes)) circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) state = circuit.final_wavefunction(initial_state, qubits_that_should_be_present=qubits) cirq.testing.assert_allclose_up_to_global_phase(state, expected_state, atol=1e-8)
def test_ffft_equal_to_bogoliubov(size): def fourier_transform_matrix(): root_of_unity = np.exp(-2j * np.pi / size) return np.array([[root_of_unity**(j * k) for k in range(size)] for j in range(size)]) / np.sqrt(size) qubits = LineQubit.range(size) ffft_circuit = cirq.Circuit(ffft(qubits), strategy=cirq.InsertStrategy.EARLIEST) ffft_matrix = ffft_circuit.unitary(qubits_that_should_be_present=qubits) bogoliubov_circuit = cirq.Circuit(bogoliubov_transform( qubits, fourier_transform_matrix()), strategy=cirq.InsertStrategy.EARLIEST) bogoliubov_matrix = bogoliubov_circuit.unitary( qubits_that_should_be_present=qubits) cirq.testing.assert_allclose_up_to_global_phase(ffft_matrix, bogoliubov_matrix, atol=1e-8)
def test_ffft_fails_without_qubits(): with pytest.raises(ValueError): ffft([])