Gemäß der verknüpften Frage besteht die einfachste Lösung nur darin , den klassischen Prozessor zu veranlassen, solche Operationen durchzuführen, wenn dies möglich ist . Natürlich ist das möglicherweise nicht möglich, daher möchten wir einen Addierer erstellen .
Es gibt zwei Arten von Einzelbitaddierern - den Halbaddierer und den Volladdierer . Der Halbaddierer nimmt die Eingänge und B und gibt die "Summe" (XOR-Verknüpfung) S = A ⊕ B und den "Übertrag" (UND-Verknüpfung) C = A ⋅ B aus . Ein Volladdierer hat auch den ‚carry in‘ C i n Eingang und der Ausgang ‚durchführen‘ C o u t und ersetzt C . Dies ergibt S = A ⊕ B ⊕ C i nEINBS= A ⊕ BC= A ⋅ BCi nCo u tCS= A ≤ B ≤ Ci nund .Co u t= Ci n⋅ ( A + B ) + A ⋅ B
Quantenversion des Halbaddierers
Betrachten des CNOT-Gatters im Qubit-Register das das Register B steuert : CNOT A → B | 0 ⟩ A | 0 ⟩ BEINB die den Ausgang des unmittelbar gibtBRegister alsA⊕B=S. Der Übertrag muss jedoch noch berechnet werden, und der Zustand desB-Registers hat sich geändert, sodass auch die UND-Operation ausgeführt werden muss. Dies kann mit dem 3-Qubit-Toffoli-Gate (Controlled-CNOT / CCNOT) erfolgen. Dies kann unter Verwendung der RegisterAundBals Steuerregister und durch Initialisieren des dritten Registers(C)im Zustand| erfolgen 0⟩
CNOTA → B| 0 ⟩EIN| 0 ⟩BCNOTA → B| 0 ⟩EIN| 1 ⟩BCNOTA → B| 1 ⟩EIN| 0 ⟩BCNOTA → B| 1 ⟩EIN| 1 ⟩B= | 0 ⟩EIN| 0 ⟩B= | 0 ⟩EIN| 1 ⟩B= | 1 ⟩EIN| 1 ⟩B= | 1 ⟩EIN| 0 ⟩B,
BA ⊕ B = SBEINB( C)| 0 ⟩und gibt den Ausgang des dritten Registers als
. Das Implementieren von Toffoli in den Registern
A und
B, die das Register
C steuern, gefolgt von CNOT mit
A, das
B steuert, ergibt die Ausgabe des Registers
B als die Summe und die Ausgabe des Registers
C als den Übertrag. Ein Quantenschaltungsdiagramm des Halbaddierers ist in Fig. 1 gezeigt.
A ⋅ B = CEINBCEINBBC
Abbildung 1: Schaltplan eines Halbaddierers, bestehend aus Toffoli, gefolgt von CNOT. Die Eingangsbits sind und B und ergeben die Summe S mit C ausführen .EINBSC
Quantenversion des Volladdierers
4EINBCi n11|0⟩|A⟩|B⟩|Cin⟩|0⟩
- AB1|A⟩|B⟩|Cin⟩|A⋅B⟩
- AB|A⟩|A⊕B⟩|Cin⟩|A⋅B⟩
- BCin1|A⟩|A⊕B⟩|Cin⟩|A⋅B⊕(A⊕B)⋅Cin=Cout⟩
- BCin|A⟩|A⊕B⟩|A⊕B⊕Cin=S⟩|Cout⟩
ABAB
|ψout⟩=|A⟩|B⟩|S⟩|Cout⟩
Cin2
ABCinSCout
Quantenversion des Ripple-Carry-Addierers
Eine einfache Erweiterung des Volladdierers ist ein Ripple-Carry-Addierer, der als Ripple-Carry-In des nächsten Addierers in einer Reihe von Addierern bezeichnet wird und beliebig große (wenn auch langsame) Summen zulässt. Eine Quantenversion eines solchen Addierers finden Sie zB hier
Tatsächliche Implementierung eines Halbaddierers
Für viele Systeme ist die Implementierung eines Toffoli-Gatters alles andere als einfach, ein einzelnes Qubit-Gatter (oder sogar zwei Qubit-Gatter) zu implementieren. Diese Antwort gibt eine Möglichkeit, Toffoli in mehrere kleinere Tore zu zerlegen. In realen Systemen wie IBMQX kann es jedoch auch Probleme geben, bei denen Qubits als Ziele verwendet werden können. So sieht eine echte Implementierung unter IBMQX2 aus:
Abbildung 3: Implementierung eines Halbaddierers unter IBMQX2. Zusätzlich zum Zerlegen des Toffoli-Gatters in mehrere kleinere Gatter sind zusätzliche Gatter erforderlich, da nicht alle Qubit-Register als Ziele verwendet werden können. Die Register q [0] und q [1] werden addiert, um die Summe in q [1] und den Übertrag in q [2] zu erhalten. In diesem Fall sollte das Ergebnis q [2] q [1] 10 sein. Wenn Sie dies auf dem Prozessor ausführen, erhalten Sie das richtige Ergebnis mit einer Wahrscheinlichkeit von 42,8% (obwohl dies immer noch das wahrscheinlichste Ergebnis ist).