Compare commits

..

2 Commits

Author SHA1 Message Date
ac2f465ae2 Алгоритм Дойча-Джозе 2025-09-29 10:41:18 +03:00
f614abe349 Алгоритм Дойча 2025-09-20 13:25:04 +03:00
2 changed files with 86 additions and 0 deletions

25
task2/main.py Normal file
View File

@@ -0,0 +1,25 @@
import cirq
q0, q1 = cirq.LineQubit.range(2)
oracles = {
"0": [],
"1": [cirq.X(q1)],
"x": [cirq.CNOT(q0, q1)],
"notx": [cirq.CNOT(q0, q1), cirq.X(q1)],
}
def deutsch_algorithm(oracle):
yield cirq.X(q1)
yield cirq.H(q0), cirq.H(q1)
yield oracle
yield cirq.H(q0)
yield cirq.measure(q0)
simulator = cirq.Simulator()
for key, oracle in oracles.items():
result = simulator.run(cirq.Circuit(deutsch_algorithm(oracle)), repetitions=10)
print("oracle: {:<4} results: {}".format(key, result))

61
task3/main.py Normal file
View 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)}"
)