import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%20%20%23%20wird%20nur%20ben%C3%B6tigt%2C%20wenn%20Sie%20mit%20marimo%20Notebooks%20arbeiten%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Einf%C3%BChrung%20in%20PennyLane%0A%0A%20%20%20%20In%20diesem%20Notebook%20machen%20Sie%20Ihre%20ersten%20Schritte%20mit%20%5BPennyLane%5D(https%3A%2F%2Fpennylane.ai%2F)%2C%0A%20%20%20%20einem%20zweiten%20Python-Framework%20f%C3%BCr%20Quantenalgorithmen.%0A%20%20%20%20Im%20Vergleich%20zu%20Qiskit%20steht%20bei%20PennyLane%20das%20**Ableiten**%20von%20Quantenschaltkreisen%20im%20Vordergrund.%0A%20%20%20%20Das%20ist%20genau%20das%2C%20was%20wir%20f%C3%BCr%20variationale%20Algorithmen%20wie%20QAOA%20brauchen.%0A%0A%20%20%20%20Am%20Ende%20dieses%20Notebooks%20k%C3%B6nnen%20Sie%0A%0A%20%20%20%201.%20ein%20**Device**%20und%20einen%20**QNode**%20anlegen%2C%20also%20einen%20ausf%C3%BChrbaren%20Quantenschaltkreis%2C%0A%20%20%20%202.%20den%20Schaltkreis%20zeichnen%20und%20mit%20verschiedenen%20**R%C3%BCckgabewerten**%20auswerten%2C%0A%20%20%20%203.%20mit%20**Shots**%20simulieren%20und%20das%20Shot-Rauschen%20beobachten%2C%0A%20%20%20%204.%20einen%20**verschr%C3%A4nkten%20Zustand**%20(Bell-Zustand)%20erzeugen%2C%0A%20%20%20%205.%20einen%20Schaltkreis%20**ableiten**%20und%20einen%20Parameter%20per%20Gradientenabstieg%20optimieren.%0A%0A%20%20%20%20Die%20Zellen%20mit%20Code%20k%C3%B6nnen%20Sie%20beliebig%20ver%C3%A4ndern%20und%20neu%20ausf%C3%BChren.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20Vorbereitung%0A%0A%20%20%20%20Zun%C3%A4chst%20importieren%20wir%20die%20ben%C3%B6tigten%20Module.%0A%20%20%20%20PennyLane%20bringt%20sein%20eigenes%20%60numpy%60%20mit%20(%60pennylane.numpy%60)%2C%0A%20%20%20%20das%20Gradienten%20verfolgen%20kann.%20Wir%20verwenden%20es%20f%C3%BCr%20alle%20Parameter%2C%20die%20wir%20sp%C3%A4ter%20ableiten%20wollen.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20platform%0A%0A%20%20%20%20import%20matplotlib%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20pennylane%20as%20qml%0A%20%20%20%20from%20pennylane%20import%20numpy%20as%20pnp%0A%0A%20%20%20%20return%20matplotlib%2C%20platform%2C%20plt%2C%20pnp%2C%20qml%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(matplotlib%2C%20mo%2C%20platform%2C%20qml)%3A%0A%20%20%20%20mo.md(rf%22%22%22%0A%20%20%20%20Pr%C3%BCfen%20Sie%2C%20dass%20Ihre%20installierten%20Versionen%20nicht%20zu%20weit%20von%20diesen%20hier%20abweichen%3A%0A%0A%20%20%20%20%7C%20Paket%20%7C%20Version%20%7C%0A%20%20%20%20%7C---%7C---%7C%0A%20%20%20%20%7C%20Python%20%7C%20%7Bplatform.python_version()%7D%20%7C%0A%20%20%20%20%7C%20pennylane%20%7C%20%7Bqml.__version__%7D%20%7C%0A%20%20%20%20%7C%20matplotlib%20%7C%20%7Bmatplotlib.__version__%7D%20%7C%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Der%20erste%20Schaltkreis%0A%0A%20%20%20%20In%20PennyLane%20besteht%20ein%20Schaltkreis%20aus%20zwei%20Teilen%3A%0A%0A%20%20%20%20*%20einem%20**Device**%2C%20das%20beschreibt%2C%20womit%20simuliert%20(oder%20auf%20echter%20Hardware%20ausgef%C3%BChrt)%20wird%2C%0A%20%20%20%20%20%20und%20die%20Anzahl%20der%20Qubits%20(hier%20*Wires*%20genannt)%20festlegt%2C%0A%20%20%20%20*%20einer%20**Python-Funktion**%2C%20die%20Gatter%20nacheinander%20aufruft%20und%20einen%20Messwert%20zur%C3%BCckgibt.%0A%20%20%20%20%20%20Der%20Dekorator%20%60%40qml.qnode(dev)%60%20macht%20aus%20dieser%20Funktion%20einen%20ausf%C3%BChrbaren%20**QNode**.%0A%0A%20%20%20%20Wir%20beginnen%20mit%20einem%20Qubit%2C%20auf%20das%20nichts%20angewendet%20wird.%0A%20%20%20%20Jedes%20Qubit%20startet%20im%20Zustand%20%24%7C0%5Crangle%24.%0A%20%20%20%20%60qml.probs%60%20gibt%20die%20Wahrscheinlichkeiten%20der%20Messergebnisse%20zur%C3%BCck.%0A%20%20%20%20Wires%20werden%20bei%200%20gez%C3%A4hlt.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(qml)%3A%0A%20%20%20%20dev1%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D1)%0A%0A%20%20%20%20%40qml.qnode(dev1)%0A%20%20%20%20def%20circuit_leer()%3A%0A%20%20%20%20%20%20%20%20return%20qml.probs(wires%3D0)%0A%0A%20%20%20%20circuit_leer()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Das%20Ergebnis%20ist%20ein%20Array%20%60%5BP(0)%2C%20P(1)%5D%60.%20Wie%20erwartet%20ist%20%24P(0)%20%3D%201%24.%0A%20%20%20%20Hier%20wurde%20nicht%20gesampelt%3A%20Der%20Simulator%20kennt%20den%20exakten%20Zustand%20und%20berechnet%20die%20Wahrscheinlichkeiten%20direkt.%0A%20%20%20%20Das%20geht%20nur%20im%20Simulator%2C%20auf%20echter%20Hardware%20w%C3%A4ren%20nur%20Messungen%20mit%20endlich%20vielen%20Shots%20m%C3%B6glich%20(siehe%20Abschnitt%204).%0A%0A%20%20%20%20%23%23%203.%20Superposition%20mit%20dem%20Hadamard-Gatter%0A%0A%20%20%20%20Gatter%20sind%20in%20PennyLane%20Funktionen%20im%20Namensraum%20%60qml%60%2C%20die%20Sie%20im%20QNode%20aufrufen%2C%0A%20%20%20%20z.%20B.%20%60qml.Hadamard(wires%3D0)%60.%20Das%20**Hadamard-Gatter**%20erzeugt%20aus%20%24%7C0%5Crangle%24%20eine%20gleichm%C3%A4%C3%9Fige%20Superposition%3A%0A%0A%20%20%20%20%24%24H%7C0%5Crangle%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7B2%7D%7D%5Cleft(%7C0%5Crangle%20%2B%20%7C1%5Crangle%5Cright)%24%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(qml)%3A%0A%20%20%20%20dev_h%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D1)%0A%0A%20%20%20%20%40qml.qnode(dev_h)%0A%20%20%20%20def%20circuit_h()%3A%0A%20%20%20%20%20%20%20%20qml.Hadamard(wires%3D0)%0A%20%20%20%20%20%20%20%20return%20qml.probs(wires%3D0)%0A%0A%20%20%20%20circuit_h()%0A%20%20%20%20return%20(circuit_h%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Mit%20%60qml.draw%60%20bzw.%20%60qml.draw_mpl%60%20l%C3%A4sst%20sich%20der%20Schaltkreis%20zeichnen.%0A%20%20%20%20Beachten%20Sie%2C%20dass%20man%20dem%20Zeichner%20den%20QNode%20%C3%BCbergibt%20und%20das%20Ergebnis%20erneut%20mit%20den%20Argumenten%20des%20QNodes%20aufruft.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(circuit_h%2C%20qml)%3A%0A%20%20%20%20qml.draw_mpl(circuit_h)()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Verschiedene%20R%C3%BCckgabewerte%0A%0A%20%20%20%20Was%20ein%20QNode%20zur%C3%BCckgibt%2C%20bestimmt%2C%20**was%20gemessen%20wird**.%20Die%20wichtigsten%20Varianten%3A%0A%0A%20%20%20%20%7C%20R%C3%BCckgabewert%20%7C%20Bedeutung%20%7C%0A%20%20%20%20%7C---%7C---%7C%0A%20%20%20%20%7C%20%60qml.probs(wires%3D...)%60%20%7C%20Wahrscheinlichkeiten%20aller%20Messergebnisse%20%7C%0A%20%20%20%20%7C%20%60qml.state()%60%20%7C%20exakter%20Zustandsvektor%20(nur%20im%20Simulator)%20%7C%0A%20%20%20%20%7C%20%60qml.expval(qml.PauliZ(0))%60%20%7C%20Erwartungswert%20einer%20Observablen%20%7C%0A%20%20%20%20%7C%20%60qml.counts()%60%20%7C%20H%C3%A4ufigkeiten%20der%20Messergebnisse%20(ben%C3%B6tigt%20Shots)%20%7C%0A%20%20%20%20%7C%20%60qml.sample()%60%20%7C%20einzelne%20Messergebnisse%20pro%20Shot%20(ben%C3%B6tigt%20Shots)%20%7C%0A%0A%20%20%20%20Der%20Erwartungswert%20von%20%24Z%24%20liegt%20zwischen%20%24-1%24%20(%24%7C1%5Crangle%24)%20und%20%24%2B1%24%20(%24%7C0%5Crangle%24).%0A%20%20%20%20F%C3%BCr%20den%20Hadamard-Zustand%20ist%20er%20%240%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(qml)%3A%0A%20%20%20%20dev_ret%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D1)%0A%0A%20%20%20%20%40qml.qnode(dev_ret)%0A%20%20%20%20def%20state_h()%3A%0A%20%20%20%20%20%20%20%20qml.Hadamard(wires%3D0)%0A%20%20%20%20%20%20%20%20return%20qml.state()%0A%0A%20%20%20%20%40qml.qnode(dev_ret)%0A%20%20%20%20def%20expval_h()%3A%0A%20%20%20%20%20%20%20%20qml.Hadamard(wires%3D0)%0A%20%20%20%20%20%20%20%20return%20qml.expval(qml.PauliZ(0))%0A%0A%20%20%20%20print(%22Zustandsvektor%3A%22%2C%20state_h())%0A%20%20%20%20print(%22%3CZ%3E%3A%22%2C%20expval_h())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20Interaktiv%3A%20Wahrscheinlichkeiten%20und%20Shots%0A%0A%20%20%20%20Mit%20dem%20Gatter%20%24R_y(%5Ctheta)%24%20l%C3%A4sst%20sich%20das%20Qubit%20um%20einen%20beliebigen%20Winkel%20um%20die%20%24y%24-Achse%20drehen.%0A%20%20%20%20Es%20entsteht%20der%20Zustand%0A%0A%20%20%20%20%24%24R_y(%5Ctheta)%7C0%5Crangle%20%3D%20%5Ccos%5Cleft(%5Ctfrac%7B%5Ctheta%7D%7B2%7D%5Cright)%7C0%5Crangle%20%2B%20%5Csin%5Cleft(%5Ctfrac%7B%5Ctheta%7D%7B2%7D%5Cright)%7C1%5Crangle%2C%24%24%0A%0A%20%20%20%20die%20Wahrscheinlichkeit%2C%20eine%20%241%24%20zu%20messen%2C%20ist%20also%20%24P(1)%20%3D%20%5Csin%5E2(%5Ctheta%2F2)%24.%0A%0A%20%20%20%20Ver%C3%A4ndern%20Sie%20den%20Winkel%20und%20die%20Anzahl%20der%20Shots%20und%20beobachten%20Sie%20das%20Histogramm.%0A%20%20%20%20Mit%20wenigen%20Shots%20weicht%20die%20gemessene%20Verteilung%20deutlich%20von%20der%20theoretischen%20ab.%20Das%20ist%20das%20**Shot-Rauschen**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20theta_slider%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D0%2C%20stop%3D360%2C%20step%3D5%2C%20value%3D90%2C%20label%3D%22Winkel%20%CE%B8%20(in%20Grad)%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20shots_slider%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20steps%3D%5B1%2C%2010%2C%20100%2C%201000%2C%2010000%5D%2C%20value%3D100%2C%20label%3D%22Shots%22%2C%20show_value%3DTrue%0A%20%20%20%20)%0A%20%20%20%20mo.hstack(%5Btheta_slider%2C%20shots_slider%5D%2C%20justify%3D%22start%22%2C%20gap%3D2)%0A%20%20%20%20return%20shots_slider%2C%20theta_slider%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20plt%2C%20pnp%2C%20qml%2C%20shots_slider%2C%20theta_slider)%3A%0A%20%20%20%20_theta%20%3D%20float(pnp.deg2rad(theta_slider.value))%0A%20%20%20%20_shots%20%3D%20shots_slider.value%0A%0A%20%20%20%20_dev%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D1)%0A%0A%20%20%20%20%23%20Mit%20set_shots%20wird%20wirklich%20gesampelt%2C%20statt%20exakt%20zu%20rechnen.%0A%20%20%20%20%40qml.set_shots(shots%3D_shots)%0A%20%20%20%20%40qml.qnode(_dev)%0A%20%20%20%20def%20_circuit(theta)%3A%0A%20%20%20%20%20%20%20%20qml.RY(theta%2C%20wires%3D0)%0A%20%20%20%20%20%20%20%20return%20qml.counts(all_outcomes%3DTrue)%0A%0A%20%20%20%20_counts%20%3D%20_circuit(_theta)%0A%20%20%20%20_p1%20%3D%20float(pnp.sin(_theta%20%2F%202)%20**%202)%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(5%2C%203))%0A%20%20%20%20_ax.bar(%5B%220%22%2C%20%221%22%5D%2C%20%5B_counts%5B%220%22%5D%20%2F%20_shots%2C%20_counts%5B%221%22%5D%20%2F%20_shots%5D%2C%20label%3D%22gemessen%22)%0A%20%20%20%20_ax.plot(%5B%220%22%2C%20%221%22%5D%2C%20%5B1%20-%20_p1%2C%20_p1%5D%2C%20%22ro%22%2C%20label%3D%22theoretisch%22)%0A%20%20%20%20_ax.set_ylim(0%2C%201.05)%0A%20%20%20%20_ax.set_ylabel(%22Wahrscheinlichkeit%22)%0A%20%20%20%20_ax.legend()%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Theoretisch%3A%20%24P(1)%20%3D%20%5C%5Csin%5E2(%5C%5Ctheta%2F2)%20%3D%20%7B_p1%3A.3f%7D%24%2C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22gemessen%3A%20%24%7B_counts%5B'1'%5D%20%2F%20_shots%3A.3f%7D%24%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_fig%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%2F%2F%2F%20admonition%20%7C%20Shots%20festlegen%0A%20%20%20%20%20%20%20%20type%3A%20tip%0A%0A%20%20%20%20Shots%20werden%20mit%20dem%20Dekorator%20%60%40qml.set_shots(shots%3Dn)%60%20%C3%BCber%20dem%20QNode%20festgelegt.%0A%20%20%20%20Ohne%20Angabe%20rechnet%20der%20Simulator%20exakt%2C%20und%20%60qml.counts()%60%20bzw.%20%60qml.sample()%60%20stehen%20nicht%20zur%20Verf%C3%BCgung.%0A%20%20%20%20%2F%2F%2F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20Mehrere%20Qubits%20und%20Verschr%C3%A4nkung%0A%0A%20%20%20%20Das%20**CNOT-Gatter**%20%60qml.CNOT(wires%3D%5Bsteuer%2C%20ziel%5D)%60%20ist%20ein%20Zwei-Qubit-Gatter.%0A%20%20%20%20Es%20invertiert%20das%20Zielqubit%20genau%20dann%2C%20wenn%20das%20Steuerqubit%20%24%7C1%5Crangle%24%20ist.%0A%0A%20%20%20%20Kombiniert%20man%20ein%20Hadamard-Gatter%20mit%20einem%20CNOT%2C%20entsteht%20der%20**Bell-Zustand**%0A%0A%20%20%20%20%24%24%7C%5CPhi%5E%2B%5Crangle%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7B2%7D%7D%5Cleft(%7C00%5Crangle%20%2B%20%7C11%5Crangle%5Cright).%24%24%0A%0A%20%20%20%20Die%20beiden%20Qubits%20sind%20verschr%C3%A4nkt%3A%20Das%20Ergebnis%20jedes%20einzelnen%20Qubits%20ist%20zuf%C3%A4llig%2C%0A%20%20%20%20beide%20Ergebnisse%20sind%20aber%20immer%20gleich.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(qml)%3A%0A%20%20%20%20dev2%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D2)%0A%0A%20%20%20%20%40qml.qnode(dev2)%0A%20%20%20%20def%20bell()%3A%0A%20%20%20%20%20%20%20%20qml.Hadamard(wires%3D0)%0A%20%20%20%20%20%20%20%20qml.CNOT(wires%3D%5B0%2C%201%5D)%0A%20%20%20%20%20%20%20%20return%20qml.probs(wires%3D%5B0%2C%201%5D)%0A%0A%20%20%20%20print(qml.draw(bell)())%0A%20%20%20%20print(%22P(00)%2C%20P(01)%2C%20P(10)%2C%20P(11)%20%3D%22%2C%20bell())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Es%20treten%20nur%20%6000%60%20und%20%6011%60%20auf%2C%20jeweils%20mit%20Wahrscheinlichkeit%20%240%7B%2C%7D5%24.%0A%0A%20%20%20%20%2F%2F%2F%20admonition%20%7C%20Bit-Reihenfolge%0A%20%20%20%20%20%20%20%20type%3A%20info%0A%0A%20%20%20%20Anders%20als%20Qiskit%20verwendet%20PennyLane%20die%20*big-endian*-Konvention%3A%0A%20%20%20%20Wire%200%20steht%20in%20Bitstrings%20**ganz%20links**.%20Ein%20Ergebnis%20%60'01'%60%20bedeutet%20also%3A%20Wire%200%20wurde%20als%20%600%60%20und%20Wire%201%20als%20%601%60%20gemessen.%0A%20%20%20%20Beim%20Vergleichen%20mit%20Qiskit-Ergebnissen%20m%C3%BCssen%20Sie%20die%20Bitstrings%20also%20umdrehen.%0A%20%20%20%20%2F%2F%2F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20Wires%20benennen%0A%0A%20%20%20%20Wires%20m%C3%BCssen%20keine%20Zahlen%20sein.%20Sie%20k%C3%B6nnen%20auch%20beliebige%20Namen%20vergeben%2C%20so%20bleiben%20gr%C3%B6%C3%9Fere%20Schaltkreise%20%C3%BCbersichtlich%0A%20%20%20%20(das%20Gegenst%C3%BCck%20zu%20den%20Registern%20in%20Qiskit).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(qml)%3A%0A%20%20%20%20dev_named%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D%5B%22a0%22%2C%20%22a1%22%2C%20%22b0%22%5D)%0A%0A%20%20%20%20%40qml.qnode(dev_named)%0A%20%20%20%20def%20circuit_named()%3A%0A%20%20%20%20%20%20%20%20qml.Hadamard(wires%3D%22a0%22)%0A%20%20%20%20%20%20%20%20qml.CNOT(wires%3D%5B%22a0%22%2C%20%22b0%22%5D)%0A%20%20%20%20%20%20%20%20return%20qml.probs(wires%3D%5B%22a0%22%2C%20%22a1%22%2C%20%22b0%22%5D)%0A%0A%20%20%20%20qml.draw_mpl(circuit_named)()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%207.%20Ableiten%20und%20optimieren%0A%0A%20%20%20%20Die%20gr%C3%B6%C3%9Fte%20St%C3%A4rke%20von%20PennyLane%3A%20QNodes%20sind%20**differenzierbar**.%0A%20%20%20%20Wir%20betrachten%0A%0A%20%20%20%20%24%24f(%5Ctheta)%20%3D%20%5Clangle%200%20%7C%20R_y(%5Ctheta)%5E%5Cdagger%20%5C%2C%20Z%20%5C%2C%20R_y(%5Ctheta)%20%7C%200%20%5Crangle%20%3D%20%5Ccos%5Ctheta.%24%24%0A%0A%20%20%20%20Mit%20%60qml.grad%60%20erhalten%20wir%20die%20Ableitung%20%24f'(%5Ctheta)%20%3D%20-%5Csin%5Ctheta%24.%0A%20%20%20%20Parameter%2C%20nach%20denen%20abgeleitet%20wird%2C%20m%C3%BCssen%20%60requires_grad%3DTrue%60%20haben%20(das%20%60pennylane.numpy%60-Array%20macht%20das%20m%C3%B6glich).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(pnp%2C%20qml)%3A%0A%20%20%20%20dev_grad%20%3D%20qml.device(%22default.qubit%22%2C%20wires%3D1)%0A%0A%20%20%20%20%40qml.qnode(dev_grad)%0A%20%20%20%20def%20cost(theta)%3A%0A%20%20%20%20%20%20%20%20qml.RY(theta%2C%20wires%3D0)%0A%20%20%20%20%20%20%20%20return%20qml.expval(qml.PauliZ(0))%0A%0A%20%20%20%20_theta%20%3D%20pnp.array(0.5%2C%20requires_grad%3DTrue)%0A%20%20%20%20print(%22f(%CE%B8)%20%20%3D%22%2C%20cost(_theta)%2C%20%22%20(cos%20%CE%B8%20%20%3D%22%2C%20pnp.cos(_theta)%2C%20%22)%22)%0A%20%20%20%20print(%22f'(%CE%B8)%20%3D%22%2C%20qml.grad(cost)(_theta)%2C%20%22%20(-sin%20%CE%B8%20%3D%22%2C%20-pnp.sin(_theta)%2C%20%22)%22)%0A%20%20%20%20return%20(cost%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Mit%20dem%20Gradienten%20k%C3%B6nnen%20wir%20die%20Kostenfunktion%20**minimieren**%3A%20Ein%20klassischer%20Optimierer%20ver%C3%A4ndert%20den%20Parameter%20%24%5Ctheta%24%20Schritt%20f%C3%BCr%20Schritt%2C%0A%20%20%20%20der%20Quantenschaltkreis%20liefert%20den%20Funktionswert%20und%20Gradienten.%20Genau%20dieses%20Zusammenspiel%20nutzt%20sp%C3%A4ter%20auch%20QAOA.%0A%20%20%20%20Das%20Minimum%20liegt%20bei%20%24%5Ctheta%20%3D%20%5Cpi%24%20(Qubit%20in%20%24%7C1%5Crangle%24%2C%20%24%5Clangle%20Z%5Crangle%20%3D%20-1%24).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cost%2C%20plt%2C%20pnp%2C%20qml)%3A%0A%20%20%20%20_opt%20%3D%20qml.GradientDescentOptimizer(stepsize%3D0.4)%0A%20%20%20%20_theta%20%3D%20pnp.array(0.1%2C%20requires_grad%3DTrue)%0A%0A%20%20%20%20_verlauf%20%3D%20%5Bfloat(cost(_theta))%5D%0A%20%20%20%20for%20_%20in%20range(25)%3A%0A%20%20%20%20%20%20%20%20_theta%20%3D%20_opt.step(cost%2C%20_theta)%0A%20%20%20%20%20%20%20%20_verlauf.append(float(cost(_theta)))%0A%0A%20%20%20%20print(f%22%CE%B8%20%3D%20%7Bfloat(_theta)%3A.4f%7D%20(%CF%80%20%3D%20%7Bfloat(pnp.pi)%3A.4f%7D)%2C%20f(%CE%B8)%20%3D%20%7B_verlauf%5B-1%5D%3A.4f%7D%22)%0A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(5%2C%203))%0A%20%20%20%20_ax.plot(_verlauf%2C%20%22o-%22)%0A%20%20%20%20_ax.set_xlabel(%22Schritt%22)%0A%20%20%20%20_ax.set_ylabel(r%22%24%5Clangle%20Z%20%5Crangle%24%22)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%208.%20%C3%9Cbungen%0A%0A%20%20%20%20Legen%20Sie%20unterhalb%20dieser%20Zelle%20neue%20Zellen%20an%20und%20l%C3%B6sen%20Sie%20die%20folgenden%20Aufgaben.%0A%0A%20%20%20%201.%20Erzeugen%20Sie%20einen%20QNode%20mit%20einem%20Qubit%2C%20der%20**immer**%20%601%60%20liefert.%0A%20%20%20%202.%20Erzeugen%20Sie%20den%20**GHZ-Zustand**%20%24%5Cfrac%7B1%7D%7B%5Csqrt%7B2%7D%7D(%7C000%5Crangle%20%2B%20%7C111%5Crangle)%24%20mit%20drei%20Qubits%20und%20pr%C3%BCfen%20Sie%20%60qml.probs%60.%0A%20%20%20%203.%20%C3%84ndern%20Sie%20%60stepsize%60%20und%20die%20Startwerte%20im%20Optimierer.%20Was%20passiert%20bei%20%24%5Ctheta_0%20%3D%200%24%3F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.accordion(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22L%C3%B6sungshinweise%22%3A%20mo.md(r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%201.%20%60qml.PauliX(wires%3D0)%60%20und%20%60return%20qml.probs(wires%3D0)%60%2C%20Ergebnis%20%60%5B0%2C%201%5D%60.%0A%20%20%20%20%20%20%20%20%20%20%20%202.%20%60Hadamard(0)%60%2C%20%60CNOT(%5B0%2C%201%5D)%60%2C%20%60CNOT(%5B1%2C%202%5D)%60%3A%20Erwartet%20werden%20nur%20%60000%60%20und%20%60111%60.%0A%20%20%20%20%20%20%20%20%20%20%20%203.%20Bei%20%24%5Ctheta_0%20%3D%200%24%20ist%20der%20Gradient%20%24-%5Csin%200%20%3D%200%24%3A%20Der%20Optimierer%20bleibt%20auf%20dem%20Maximum%20stehen%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20und%20bewegt%20sich%20nicht%20(ein%20station%C3%A4rer%20Punkt).%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Zusammenfassung%0A%0A%20%20%20%20%7C%20Konzept%20%7C%20PennyLane%20%7C%0A%20%20%20%20%7C---%7C---%7C%0A%20%20%20%20%7C%20Simulator%20anlegen%20%7C%20%60qml.device(%22default.qubit%22%2C%20wires%3Dn)%60%20%7C%0A%20%20%20%20%7C%20Shots%20festlegen%20%7C%20%60%40qml.set_shots(shots%3Dn)%60%20%C3%BCber%20dem%20QNode%20%7C%0A%20%20%20%20%7C%20Schaltkreis%20definieren%20%7C%20Funktion%20mit%20%60%40qml.qnode(dev)%60%20%7C%0A%20%20%20%20%7C%20Gatter%20hinzuf%C3%BCgen%20%7C%20%60qml.Hadamard(0)%60%2C%20%60qml.CNOT(%5B0%2C%201%5D)%60%2C%20%60qml.RY(theta%2C%200)%60%20%7C%0A%20%20%20%20%7C%20Messen%20%7C%20%60qml.probs%60%2C%20%60qml.expval%60%2C%20%60qml.counts%60%2C%20%60qml.state%60%20%7C%0A%20%20%20%20%7C%20Zeichnen%20%7C%20%60qml.draw(qnode)(...)%60%2C%20%60qml.draw_mpl(qnode)(...)%60%20%7C%0A%20%20%20%20%7C%20Ableiten%20%7C%20%60qml.grad(qnode)(theta)%60%20mit%20%60pennylane.numpy%60%20%7C%0A%20%20%20%20%7C%20Optimieren%20%7C%20%60qml.GradientDescentOptimizer(...).step(cost%2C%20theta)%60%20%7C%0A%0A%20%20%20%20Mit%20diesen%20Bausteinen%20sind%20Sie%20bereit%20f%C3%BCr%20QAOA.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
25705cb9f36e3319ee70a16a3aec11c2