Files
quantum-computing/task8/qft.py
2025-11-19 11:27:58 +03:00

70 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Реализация Квантового Преобразования Фурье (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()