Квантовая телепортация
This commit is contained in:
81
task7/main.py
Normal file
81
task7/main.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import random
|
||||
|
||||
import cirq
|
||||
import numpy as np
|
||||
|
||||
|
||||
def make_quantum_teleportation_circuit(ranX, ranY):
|
||||
circuit = cirq.Circuit()
|
||||
msg, alice, bob = cirq.LineQubit.range(3)
|
||||
|
||||
# Создаём запутанную пару кубитов между Алисой и Бобом
|
||||
circuit.append([cirq.H(alice), cirq.CNOT(alice, bob)])
|
||||
|
||||
# Создаём случайное состояние для сообщения
|
||||
circuit.append([cirq.X(msg) ** ranX, cirq.Y(msg) ** ranY])
|
||||
|
||||
# Запутываем сообщение и кубит Алисы
|
||||
circuit.append([cirq.CNOT(msg, alice), cirq.H(msg)])
|
||||
|
||||
# Измеряем сообщение и кубит Алисы
|
||||
circuit.append(cirq.measure(msg, key="msg"))
|
||||
circuit.append(cirq.measure(alice, key="alice"))
|
||||
|
||||
# Используем два классических бита
|
||||
# для восстановления исходного квантового сообщения на кубите Боба
|
||||
circuit.append(cirq.X(bob).with_classical_controls("alice"))
|
||||
circuit.append(cirq.Z(bob).with_classical_controls("msg"))
|
||||
|
||||
return circuit
|
||||
|
||||
|
||||
def main(seed=None):
|
||||
random.seed(seed)
|
||||
|
||||
ranX = random.random()
|
||||
ranY = random.random()
|
||||
circuit = make_quantum_teleportation_circuit(ranX, ranY)
|
||||
|
||||
print("Circuit:")
|
||||
print(circuit)
|
||||
|
||||
sim = cirq.Simulator(seed=seed)
|
||||
|
||||
# Запускаем простую симуляцию, которая применяет случайные X и Y-гейты,
|
||||
# создающие наше сообщение
|
||||
q0 = cirq.LineQubit(0)
|
||||
message = sim.simulate(cirq.Circuit([cirq.X(q0) ** ranX, cirq.Y(q0) ** ranY]))
|
||||
|
||||
print("\nBloch Sphere of Message After Random X and Y Gates:")
|
||||
expected = cirq.bloch_vector_from_state_vector(message.final_state_vector, 0)
|
||||
print(
|
||||
"x: ",
|
||||
np.around(expected[0], 4),
|
||||
"y: ",
|
||||
np.around(expected[1], 4),
|
||||
"z: ",
|
||||
np.around(expected[2], 4),
|
||||
)
|
||||
|
||||
final_results = sim.simulate(circuit)
|
||||
|
||||
print("\nBloch Sphere of Qubit 2 at Final State:")
|
||||
teleported = cirq.bloch_vector_from_state_vector(
|
||||
final_results.final_state_vector, 2
|
||||
)
|
||||
print(
|
||||
"x: ",
|
||||
np.around(teleported[0], 4),
|
||||
"y: ",
|
||||
np.around(teleported[1], 4),
|
||||
"z: ",
|
||||
np.around(teleported[2], 4),
|
||||
)
|
||||
|
||||
return expected, teleported
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user