Ben n kubit tarafından kontrol edilen bir Toffoli kapısı oluşturmak ve QISKit içinde uygulamak istiyorum. Bu yapılabilir mi? Öyleyse nasıl?
Ben n kubit tarafından kontrol edilen bir Toffoli kapısı oluşturmak ve QISKit içinde uygulamak istiyorum. Bu yapılabilir mi? Öyleyse nasıl?
Yanıtlar:
Bunu yapmanın basit bir yolu, Nielsen & Chuang'ın Şekil 4.10'da gösterilmektedir.
Burada U herhangi bir tek-kubit dönüş olabilir (bu durumda bir X geçidi).
Bu devre şu şekilde çalışır: U'yı sadece tüm kontrol kubitlerinin AND'si 1 ise hedef kubite uygulamak istiyoruz. Normal bir Toffoli bize 2 kubitin AND'ini verir. Bu yüzden birkaç Toffolis zincirleyerek, c1.c2.c3.c4.c5 elde edebiliriz, ara sonuçların saklanması için bazı "iş" (veya ancilla) kübitlerinin tanıtılmasıyla. Nihai CU'yu uyguladıktan sonra, nihai sonucu hedefe ulaşırız. Şimdi ara çalışma kubitlerini hesaplamalarını geri alarak ve | 0> durumuna döndürerek temizleyebiliriz. Bu tersinir hesaplama modeli "hesaplama-kopyalama-işlem yapma" yöntemi olarak bilinir ve ilk olarak 1973'te Charlie Bennett tarafından önerilmiştir .
Devreyi oluşturmak ve görselleştirmek için QISKit kodu şöyledir:
from qiskit import QuantumRegister, QuantumCircuit
n = 5 # must be >= 2
ctrl = QuantumRegister(n, 'ctrl')
anc = QuantumRegister(n-1, 'anc')
tgt = QuantumRegister(1, 'tgt')
circ = QuantumCircuit(ctrl, anc, tgt)
# compute
circ.ccx(ctrl[0], ctrl[1], anc[0])
for i in range(2, n):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
# copy
circ.cx(anc[n-2], tgt[0])
# uncompute
for i in range(n-1, 1, -1):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
circ.ccx(ctrl[0], ctrl[1], anc[0])
from qiskit.tools.visualization import circuit_drawer
circuit_drawer(circ)
Verim:
Ancilla qubits kullanmayan, ancak sadece kontrollü değil daha karmaşık kapılar gerektiren bir yöntem eklemek istiyorum. Bu yöntemin ilk olarak Barenco ve ark. ark. bu yazıda Lemma 7.5:
Nerede . Bu durumda,, ve dolayısıyla
Bu özyinelemeli bir tanımdır, bu nedenle kontrol n kübit geçidi kontrol n-1 kubit geçidi olarak tanımlanır. Bu, iki Qubit geçidi CNOT'a ulaşana kadar devam edecektir.
Bununla birlikte, bu uygulama biraz zordur, ancak göreceli bir fazı toplamaya aldırmazsa daha basit bir uygulama vardır (aynı makalenin Lemma 7.9'una bakın).
Gibi bir kapı uygulamak QISKIT'te gelişmiş tek kubit kapılarını kullanmanız gerekecektir .
Qiskit'in QuantumCircuit , çeşitli modlarla çoklu kontrol Toffoli kapısı oluşturmak için mct yöntemine sahiptir : temel, temel-kirli-ancilla, gelişmiş, noancilla. Örneğin 3 kontrol kubalı Toffoli kapısı:
from qiskit import QuantumCircuit, QuantumRegister
controls = QuantumRegister(3, "c_qb")
target = QuantumRegister(1, "t_qb")
circuit = QuantumCircuit(controls, target)
circuit.mct(controls, target[0], None, mode='advanced')
print(circuit)
Çıktı:
c_qb_0: |0>──────■────────■────────────────■──────────────────────────────────■──────────────────────────────────■────────────────────
│ ┌─┴─┐ ┌─┴─┐ │ │
c_qb_1: |0>──────┼──────┤ X ├──────■─────┤ X ├──────■────────■────────────────┼─────────────────■────────────────┼────────────────────
│ └───┘ │ └───┘ │ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
c_qb_2: |0>──────┼─────────────────┼────────────────┼──────┤ X ├──────■─────┤ X ├──────■──────┤ X ├──────■─────┤ X ├──────■───────────
┌───┐ │-pi/4 ┌───┐┌───┐ │pi/4 ┌───┐┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ┌───┐
t_qb_0: |0>┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘