From ac2f465ae217570ad2e4feaa3d03050dbd76502f Mon Sep 17 00:00:00 2001 From: Arity-T Date: Mon, 29 Sep 2025 10:41:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=BC=20=D0=94=D0=BE=D0=B9=D1=87=D0=B0-=D0=94=D0=B6=D0=BE?= =?UTF-8?q?=D0=B7=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task3/main.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 task3/main.py diff --git a/task3/main.py b/task3/main.py new file mode 100644 index 0000000..3f75a8a --- /dev/null +++ b/task3/main.py @@ -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)}" + )