In [1]:
from qiskit import QuantumCircuit, QuantumRegister, transpile
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService.save_account(channel="ibm_quantum", token="HIER IHR TOKEN EINSETZEN", set_as_default=True, overwrite=True)

from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()

import random
import numpy as np
In [2]:
def Alice(circuit,alice_bits,alice_basen):

    # wählt zufällig ein Bit und eine Basis
    bit=random.choice(['0','1'])   
    basis=random.choice(['+', 'X'])

    # für spätere Ausgabe
    alice_bits.append(bit)
    alice_basen.append(basis)
    
    if bit == '1':
        circuit.x(0)
    if basis == 'X':
        circuit.h(0)
            
    return circuit
In [3]:
def Bob(circuit,bob_basen):
    
    # wählt zufällig eine Basis
    basis=random.choice(['+', 'X'])

    # für spätere Ausgabe
    bob_basen.append(basis)
    
    if basis == 'X':
        circuit.h(0)

    circuit.measure(0, 1)
            
    return circuit
In [4]:
def Eve(circuit):

    # Eve wählt einen Winkel t (z.B. pi/4, bei ry-Gatter: np.pi/2)
    t = -np.pi/4  
    circuit.ry(t, 0)
    circuit.measure(0, 0)
    circuit.ry(-t, 0)
    return circuit
In [5]:
# Übertragung
num_bits = 1024

alice_bits  = []
alice_basen = []
bob_basen   = []
eve_bits  = []
bob_bits  = []
anz_gemeinsameBits = 0
anz_gleicheBitsAE = 0
anz_gleicheBitsAB = 0

for i in range(num_bits):
    
    circuit = QuantumCircuit(2,2)
    Alice(circuit,alice_bits,alice_basen)
    Eve(circuit)
    Bob(circuit,bob_basen)
    circ = transpile(circuit, backend)
    
    erg=backend.run(circ, shots=1).result().get_counts().most_frequent()

    bob_bits.append(erg[0])
    eve_bits.append(erg[1])

    if alice_basen[i] == bob_basen[i]:
        anz_gemeinsameBits = anz_gemeinsameBits+1
        if alice_bits[i] == bob_bits[i]:
            anz_gleicheBitsAB = anz_gleicheBitsAB+1
        if alice_bits[i] == eve_bits[i]:
            anz_gleicheBitsAE = anz_gleicheBitsAE+1


print("Alice und Bob: ",anz_gleicheBitsAB/anz_gemeinsameBits*100,"Prozent gleiche Bits")
print("Alice und Eve: ",anz_gleicheBitsAE/anz_gemeinsameBits*100,"Prozent gleiche Bits")

if (num_bits<129):
    print(f"Alice Bits:\t {" ".join(map(str, alice_bits))}")
    print(f"Alice Basis:\t {" ".join(alice_basen)}")
    print(f"Bobs Basis:\t {" ".join(bob_basen)}")
    print(f"Bobs Bits:\t {" ".join(bob_bits)}")
    print(f"Eves Bits:\t {" ".join(eve_bits)}")
Alice und Bob:  75.59055118110236 Prozent gleiche Bits
Alice und Eve:  84.64566929133859 Prozent gleiche Bits
In [ ]: