Алгоритм Дойча-Джозе
This commit is contained in:
61
task3/main.py
Normal file
61
task3/main.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import cirq
|
||||
|
||||
# Кубиты: два входных (q0, q1) и целевой вспомогательный (q2)
|
||||
q0, q1, q2 = cirq.LineQubit.range(3)
|
||||
|
||||
# Оракулы для константных функций: f(x)=0 и f(x)=1
|
||||
constant = (
|
||||
[], # ничего не делаем с целевым
|
||||
[cirq.X(q2)], # инвертируем целевой
|
||||
)
|
||||
|
||||
# Оракулы для сбалансированных функций
|
||||
balanced = (
|
||||
[cirq.CNOT(q0, q2)], # f=x0
|
||||
[cirq.CNOT(q1, q2)], # f=x1
|
||||
[cirq.CNOT(q0, q2), cirq.CNOT(q1, q2)],
|
||||
[cirq.CNOT(q0, q2), cirq.X(q2)],
|
||||
[cirq.CNOT(q1, q2), cirq.X(q2)],
|
||||
[cirq.CNOT(q0, q2), cirq.CNOT(q1, q2), cirq.X(q2)],
|
||||
)
|
||||
|
||||
|
||||
def deutsch_jozsa_circuit(oracle):
|
||||
"""Схема DJ через yield: измеряем только q0 и q1."""
|
||||
# 1) Входы в равномерную суперпозицию
|
||||
yield cirq.H(q0), cirq.H(q1)
|
||||
|
||||
# 2) Подготовка целевого в |-> для фазового трюка
|
||||
yield cirq.X(q2), cirq.H(q2)
|
||||
|
||||
# 3) Вызов оракула U_f
|
||||
yield oracle
|
||||
|
||||
# 4) Интерференция на входах
|
||||
yield cirq.H(q0), cirq.H(q1)
|
||||
|
||||
# 5) Измеряем только входные кубиты
|
||||
yield cirq.measure(q0, q1, key="in")
|
||||
|
||||
|
||||
def interpret(bits):
|
||||
# bits — это массив вида [q0, q1]
|
||||
return "constant" if (bits[0] == 0 and bits[1] == 0) else "balanced"
|
||||
|
||||
|
||||
# Симулятор
|
||||
sim = cirq.Simulator()
|
||||
|
||||
print("Результаты для константных функций:")
|
||||
for i, oracle in enumerate(constant):
|
||||
result = sim.run(cirq.Circuit(deutsch_jozsa_circuit(oracle)), repetitions=1)
|
||||
bits = result.measurements["in"][0]
|
||||
print(f" Константный оракул {i}: meas(q0,q1)={bits.tolist()} -> {interpret(bits)}")
|
||||
|
||||
print("\nРезультаты для сбалансированных функций:")
|
||||
for i, oracle in enumerate(balanced):
|
||||
result = sim.run(cirq.Circuit(deutsch_jozsa_circuit(oracle)), repetitions=1)
|
||||
bits = result.measurements["in"][0]
|
||||
print(
|
||||
f" Сбалансированный оракул {i}: meas(q0,q1)={bits.tolist()} -> {interpret(bits)}"
|
||||
)
|
||||
Reference in New Issue
Block a user