def iterated_entanglement_swap(n_iter): # Iterate the entanglement swapping protocol n_iter times it_es = Circuit() ava = it_es.add_q_register("a", 1) bella = it_es.add_q_register("b", 2) charlie = it_es.add_q_register("c", 1) data = it_es.add_c_register("d", 2) # Start with an initial Bell state it_es.H(ava[0]) it_es.CX(ava[0], bella[0]) for i in range(n_iter): if i % 2 == 0: # Teleport bella[0] to charlie[0] to give a Bell pair between ava[0] and charlier[0] tel_to_c = qtel.copy() tel_to_c.rename_units( {alice[0]: bella[0], alice[1]: bella[1], bob[0]: charlie[0]} ) it_es.append(tel_to_c) it_es.add_gate(OpType.Reset, [bella[0]]) it_es.add_gate(OpType.Reset, [bella[1]]) else: # Teleport charlie[0] to bella[0] to give a Bell pair between ava[0] and bella[0] tel_to_b = qtel.copy() tel_to_b.rename_units( {alice[0]: charlie[0], alice[1]: bella[1], bob[0]: bella[0]} ) it_es.append(tel_to_b) it_es.add_gate(OpType.Reset, [bella[1]]) it_es.add_gate(OpType.Reset, [charlie[0]]) # Return the circuit and the qubits expected to share a Bell pair if n_iter % 2 == 0: return it_es, [ava[0], bella[0]] else: return it_es, [ava[0], charlie[0]]
es = Circuit() ava = es.add_q_register("a", 1) bella = es.add_q_register("b", 2) charlie = es.add_q_register("c", 1) data = es.add_c_register("d", 2) # Bell state between Ava and Bella: es.H(ava[0]) es.CX(ava[0], bella[0]) # Teleport `bella[0]` to `charlie[0]`: tel_to_c = qtel.copy() tel_to_c.rename_units({alice[0]: bella[0], alice[1]: bella[1], bob[0]: charlie[0]}) es.append(tel_to_c) print(es.get_commands()) # Let's start by running a noiseless simulation of this to verify that what we get looks like a Bell pair. from pytket.extensions.qiskit import AerBackend # Connect to a simulator: backend = AerBackend() # Make a ZZ measurement of the Bell pair: bell_test = es.copy() bell_test.Measure(ava[0], data[0])