Comment puis-je implémenter une porte Toffoli à n bits?

17

Je veux créer une porte Toffoli contrôlée par n qubits et l'implémenter dans QISKit. Cela peut-il être fait? Si c'est le cas, comment?

Ali Javadi
la source
Merci pour le Q&A. Ravi de vous voir ici Ali!
James Wootton

Réponses:

19

Un moyen simple de le faire est illustré à la figure 4.10 de Nielsen & Chuang. n-

Où U peut être une rotation à un seul qubit (dans ce cas, une porte X).

Ce circuit fonctionne comme ceci: Nous voulons appliquer U au qubit cible uniquement si le ET de tous les qubits de contrôle est 1. Un Toffoli normal nous donne le ET de 2 qubits. Ainsi, en enchaînant quelques Toffolis, nous pouvons obtenir c1.c2.c3.c4.c5, avec le hic que certains qubits "de travail" (ou ancilla) ont été introduits pour stocker les résultats intermédiaires. Après avoir appliqué l'UC finale, nous obtenons le résultat final dans la cible. Nous pouvons maintenant nettoyer les qubits de travail intermédiaires en annulant leurs calculs et en les remettant à l'état | 0>. Ce modèle de calcul réversible est connu sous le nom de méthode "calcul-copie-non-calcul", et a été proposé pour la première fois par Charlie Bennett en 1973 .

Voici le code QISKit pour construire le circuit et le visualiser:

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)

Rendements:

circuit généré par qiskit

Ali Javadi
la source
8

Je veux ajouter une méthode qui n'utilise pas de qubits ancilla, mais nécessite des portes plus compliquées que simplement contrôlées. Je crois que cette méthode a été présentée pour la première fois par Barenco et. Al. dans cet article , Lemme 7.5: entrez la description de l'image ici

V2=UV2=X

V=12(1+je1-je1-je1+je) .

Il s'agit d'une définition récursive, donc la porte de qubit de contrôle n est définie en termes de porte de qubit de contrôle n-1. Cela continuerait jusqu'à ce que vous atteigniez la porte CNOT à deux qubits.

Cette implémentation est un peu difficile, cependant, il en existe une plus simple si cela ne nous dérange pas de collecter une phase relative (voir le lemme 7.9 du même article).

V

maor
la source
Quelqu'un a-t-il travaillé sur la mise en œuvre de cette porte sur Cirq?
Enrique Segura
5

QuantumCircuit de Qiskit a une méthode mct pour construire une porte Toffoli à plusieurs contrôles avec plusieurs modes: basique, basique-ancilla sale, avancé, noancilla. Par exemple la porte Toffoli avec 3 qubits de contrôle:

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)

Production:

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 ├
           └───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘
iUrii
la source