{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9fb07d3a-5975-4222-95bc-44bdf9d16e9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import QuantumCircuit, QuantumRegister, transpile\n",
    "from qiskit_ibm_runtime import QiskitRuntimeService\n",
    "service = QiskitRuntimeService.save_account(channel=\"ibm_quantum\", token=\"HIER IHR TOKEN EINSETZEN\", set_as_default=True, overwrite=True)\n",
    "\n",
    "from qiskit.providers.basic_provider import BasicSimulator\n",
    "backend = BasicSimulator()\n",
    "\n",
    "import random\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2be6a348-657a-42ac-9bd9-64c65c36f306",
   "metadata": {},
   "outputs": [],
   "source": [
    "def Alice(circuit,alice_bits,alice_basen):\n",
    "\n",
    "    # wählt zufällig ein Bit und eine Basis\n",
    "    bit=random.choice(['0','1'])   \n",
    "    basis=random.choice(['+', 'X'])\n",
    "\n",
    "    # für spätere Ausgabe\n",
    "    alice_bits.append(bit)\n",
    "    alice_basen.append(basis)\n",
    "    \n",
    "    if bit == '1':\n",
    "        circuit.x(0)\n",
    "    if basis == 'X':\n",
    "        circuit.h(0)\n",
    "            \n",
    "    return circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4347d8bb-6434-4b21-ae47-15aa138bcb9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def Bob(circuit,bob_basen):\n",
    "    \n",
    "    # wählt zufällig eine Basis\n",
    "    basis=random.choice(['+', 'X'])\n",
    "\n",
    "    # für spätere Ausgabe\n",
    "    bob_basen.append(basis)\n",
    "    \n",
    "    if basis == 'X':\n",
    "        circuit.h(0)\n",
    "\n",
    "    circuit.measure(0, 1)\n",
    "            \n",
    "    return circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "10937801-bdd6-4910-8276-614662847d95",
   "metadata": {},
   "outputs": [],
   "source": [
    "def Eve(circuit):\n",
    "\n",
    "    # Eve wählt einen Winkel t (z.B. pi/4, bei ry-Gatter: np.pi/2)\n",
    "    t = -np.pi/4  \n",
    "    circuit.ry(t, 0)\n",
    "    circuit.measure(0, 0)\n",
    "    circuit.ry(-t, 0)\n",
    "    return circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "433af104-7958-45d2-8783-162b6c62549a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Alice und Bob:  75.59055118110236 Prozent gleiche Bits\n",
      "Alice und Eve:  84.64566929133859 Prozent gleiche Bits\n"
     ]
    }
   ],
   "source": [
    "# Übertragung\n",
    "num_bits = 1024\n",
    "\n",
    "alice_bits  = []\n",
    "alice_basen = []\n",
    "bob_basen   = []\n",
    "eve_bits  = []\n",
    "bob_bits  = []\n",
    "anz_gemeinsameBits = 0\n",
    "anz_gleicheBitsAE = 0\n",
    "anz_gleicheBitsAB = 0\n",
    "\n",
    "for i in range(num_bits):\n",
    "    \n",
    "    circuit = QuantumCircuit(2,2)\n",
    "    Alice(circuit,alice_bits,alice_basen)\n",
    "    Eve(circuit)\n",
    "    Bob(circuit,bob_basen)\n",
    "    circ = transpile(circuit, backend)\n",
    "    \n",
    "    erg=backend.run(circ, shots=1).result().get_counts().most_frequent()\n",
    "\n",
    "    bob_bits.append(erg[0])\n",
    "    eve_bits.append(erg[1])\n",
    "\n",
    "    if alice_basen[i] == bob_basen[i]:\n",
    "        anz_gemeinsameBits = anz_gemeinsameBits+1\n",
    "        if alice_bits[i] == bob_bits[i]:\n",
    "            anz_gleicheBitsAB = anz_gleicheBitsAB+1\n",
    "        if alice_bits[i] == eve_bits[i]:\n",
    "            anz_gleicheBitsAE = anz_gleicheBitsAE+1\n",
    "\n",
    "\n",
    "print(\"Alice und Bob: \",anz_gleicheBitsAB/anz_gemeinsameBits*100,\"Prozent gleiche Bits\")\n",
    "print(\"Alice und Eve: \",anz_gleicheBitsAE/anz_gemeinsameBits*100,\"Prozent gleiche Bits\")\n",
    "\n",
    "if (num_bits<129):\n",
    "    print(f\"Alice Bits:\\t {\" \".join(map(str, alice_bits))}\")\n",
    "    print(f\"Alice Basis:\\t {\" \".join(alice_basen)}\")\n",
    "    print(f\"Bobs Basis:\\t {\" \".join(bob_basen)}\")\n",
    "    print(f\"Bobs Bits:\\t {\" \".join(bob_bits)}\")\n",
    "    print(f\"Eves Bits:\\t {\" \".join(eve_bits)}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5e3b4358-eaff-487b-8e8a-ef8505a26ee0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
