Bağlantılı soruya göre, en basit çözüm yalnızca klasik işlemcinin mümkünse bu işlemleri yapmasını sağlamaktır . Elbette bu mümkün olmayabilir, bu yüzden bir toplayıcı oluşturmak istiyoruz .
İki tür tek bitlik toplayıcı vardır - yarı toplayıcı ve tam toplayıcı . Yarı toplayıcı, ve B girişlerini alır ve 'toplam' (XOR işlemi) S = A ⊕ B ve 'carry' (AND işlemi) C = A ⋅ B çıkışlarını verir . Tam bir toplayıcı da 'taşıdıkları' sahip C ı n giriş ve 'gerçekleştirmek' çıkış Cı O u t , değiştirilmesi Cı . Bu S = A ⊕ B ⊕ C i n döndürürABS=A⊕BC=A⋅BCinCoutCS=A⊕B⊕Cinve .Cout=Cin⋅(A+B)+A⋅B
Yarı toplayıcının kuantum versiyonu
Qubit yazmaçta CNOT girişine bakma kontrol yazmaç B : CNOT A → B | 0 ⟩ A | 0 ⟩ BAB hemen çıkışını verirBolarak kayıtbir⊕B=S. Bununla birlikte, henüz taşınmayı hesaplamadık veBsicilinindurumudeğişti, bu yüzden de AND işlemini yapmamız gerekiyor. Bu, 3-bit Toffoli (kontrollü-CNOT / CCNOT) kapısı kullanılarak yapılabilir. Bu,kontrol kayıtları olarakAveBkayıtlarını kullanarakve üçüncü kayıt(C)durumunu ilk durumda| 0⟩
CNOTA→B|0⟩A|0⟩BCNOTA→B|0⟩A|1⟩BCNOTA→B|1⟩A|0⟩BCNOTA→B|1⟩A|1⟩B=|0⟩A|0⟩B=|0⟩A|1⟩B=|1⟩A|1⟩B=|1⟩A|0⟩B,
BA⊕B=SBAB(C)|0⟩, üçüncü yazmacın çıktısını
olarak vererek . Kayıt geçirilmesi Toffoli
A ve
B kontrol yazmacı
C ile CNOT ardından
A kontrol
B yazmacı çıkış verir
B toplamı ve yazmacı çıkış olarak
C taşıma olarak. Yarı toplayıcının kuantum devre şeması şekil 1'de gösterilmektedir.
A⋅B=CABCABBC
Şekil 1: Toffoli ve ardından CNOT'dan oluşan yarım toplayıcıya ait Devre Şeması. Girdi bitlerdir ve B toplamı veren S dışarı taşınması ile C .ABSC
Toplayıcının kuantum versiyonu
Şekil 2'de gösterilen, tek bitler için yapmanın basit bir şekilde kullanmaktır qubit kayıtlar, burada işaretlenmiş bir , B , C i , n ve 1 , burada 1 durumunda başlar | 0 ⟩ , ilk durumu, böylece | A ⟩ | B ⟩ | C i , n ⟩ | 0 ⟩ :4ABCin11|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⟩
- CNOT with B controlling Cin: |A⟩|A⊕B⟩|A⊕B⊕Cin=S⟩|Cout⟩
A final step to get back the inputs A and B is to apply a CNOT with register A controlling register B, giving the final output state as
|ψout⟩=|A⟩|B⟩|S⟩|Cout⟩
This gives the output of register Cin as the sum and the output of register 2 as carry out.
Figure 2: Circuit diagram of a full adder. Input bits are A and B along with a carry in Cin, giving the sum S with carry out Cout.
Quantum version of the ripple carry adder
A simple extension of the full adder is a ripple carry adder, named as it 'ripples' the carry out to become the carry in of the next adder in a series of adders, allowing for arbitrarily-sized (if slow) sums. A quantum version of such an adder can be found e.g. here
Actual implementation of a half-adder
For many systems, implementing a Toffoli gate is far from as simple as implementing a single qubit (or even two qubit) gate. This answer gives a way of decomposing Toffoli into multiple smaller gates. However, in real systems, such as IBMQX, there can also be issues on which qubits can be used as targets. As such, a real life implementation on IBMQX2 looks like this:
Figure 3: Implementation of a half-adder on IBMQX2. In addition to decomposing the Toffoli gate into multiple smaller gates, additional gates are required as not all qubit registers can be used as targets. Registers q[0] and q[1] are added to get the sum in q[1] and the carry in q[2]. In this case, the result q[2]q[1] should be 10. Running this on the processor gave the correct result with a probability of 42.8% (although it was still the most likely outcome).