70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
"""
|
||
Реализация Квантового Преобразования Фурье (QFT) для произвольного числа кубитов n.
|
||
"""
|
||
|
||
import cirq
|
||
import numpy as np
|
||
|
||
|
||
# === Функция построения схемы QFT ===
|
||
def qft_circuit(n: int) -> cirq.Circuit:
|
||
"""Создаёт схему квантового преобразования Фурье (QFT) для n кубитов."""
|
||
qubits = [cirq.LineQubit(i) for i in range(n)]
|
||
circuit = cirq.Circuit()
|
||
|
||
# Для каждого кубита применяем Hadamard и контролируемые фазовые повороты
|
||
for i in range(n):
|
||
circuit.append(cirq.H(qubits[i]))
|
||
for j in range(i + 1, n):
|
||
angle = 1 / (2 ** (j - i))
|
||
circuit.append(cirq.CZ(qubits[j], qubits[i]) ** angle)
|
||
|
||
# После всех поворотов меняем порядок кубитов на обратный
|
||
for i in range(n // 2):
|
||
circuit.append(cirq.SWAP(qubits[i], qubits[n - i - 1]))
|
||
|
||
return circuit
|
||
|
||
|
||
# === Главная функция ===
|
||
def main():
|
||
n = 4 # число кубитов
|
||
input_state_str = "0111"
|
||
|
||
print(f"=== Квантовое преобразование Фурье (QFT) для {n} кубитов ===")
|
||
print(f"Исходное состояние: |{input_state_str}>")
|
||
|
||
# --- Создаём кубиты ---
|
||
qubits = [cirq.LineQubit(i) for i in range(n)]
|
||
circuit = cirq.Circuit()
|
||
|
||
# Переводим строку в установку нужных кубитов в |1>
|
||
for i, bit in enumerate(
|
||
reversed(input_state_str)
|
||
): # reversed, чтобы младший бит был справа
|
||
if bit == "1":
|
||
circuit.append(cirq.X(qubits[i])) # применяем оператор X (NOT)
|
||
|
||
# --- Добавляем саму QFT ---
|
||
circuit += qft_circuit(n)
|
||
|
||
print("\nСхема:")
|
||
print(circuit)
|
||
|
||
# --- Симуляция ---
|
||
simulator = cirq.Simulator()
|
||
result = simulator.simulate(circuit)
|
||
state = result.final_state_vector
|
||
|
||
# --- Вычисляем фазы ---
|
||
phases = np.angle(state)
|
||
|
||
print("\n=== Результирующее состояние (амплитуды и фазы) ===")
|
||
for i, (amp, phi) in enumerate(zip(state, phases)):
|
||
if abs(amp) > 1e-9: # пропускаем элементы с амплитудой близкой к 0
|
||
print(f"|{i:0{n}b}>: amp={abs(amp):.3f}, phase={phi:.3f} rad")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|