¿Cómo puedo implementar una puerta Toffoli de n bits?


17

Quiero crear una puerta Toffoli controlada por n qubits e implementarla en QISKit. Se puede hacer esto? ¿Si es así, cómo?


Gracias por las preguntas y respuestas. Me alegro de verte aquí Ali!
James Wootton

Respuestas:


19

Una forma simple de hacer esto se ilustra en la Figura 4.10 de Nielsen & Chuang. norte-

Donde U puede ser cualquier rotación de un solo qubit (en este caso, una puerta X).

Este circuito funciona así: queremos aplicar U al qubit objetivo solo si el AND de todos los qubits de control es 1. Un Toffoli normal nos da el AND de 2 qubits. Entonces, al encadenar algunos Toffolis, podemos obtener c1.c2.c3.c4.c5, con la trampa de que se han introducido algunos qubits de "trabajo" (o ancilla) para almacenar resultados intermedios. Después de aplicar la CU final, obtenemos el resultado final en el objetivo. Ahora podemos limpiar los qubits de trabajo intermedios deshaciendo sus cálculos, devolviéndolos al estado | 0>. Este modelo de computación reversible se conoce como el método "computar-copiar-no computar", y fue propuesto por primera vez por Charlie Bennett en 1973 .

Aquí está el código QISKit para construir el circuito y visualizarlo:

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)

Rendimientos:

circuito generado qiskit


8

Quiero agregar un método que no use qubits ancilla, pero sí requiere puertas más complicadas que simplemente no controladas. Creo que este método fue presentado por primera vez por Barenco et. Alabama. en este artículo , Lema 7.5: ingrese la descripción de la imagen aquí

V2=UV2=X

V=12(1+yo1-yo1-yo1+yo) .

Esta es una definición recursiva, por lo que la puerta de control n qubit se define en términos de la puerta de control n-1 qubit. Esto continuaría hasta llegar a la puerta CNOT de dos qubits.

Esta implementación es un poco difícil, sin embargo, existe una más simple si no le importa recolectar una fase relativa (vea el Lema 7.9 del mismo documento).

V


¿Alguien ha trabajado en la implementación de esta puerta en Cirq?
Enrique Segura

5

QuantumCircuit de Qiskit tiene un método mct para construir una puerta Toffoli de control múltiple con varios modos: básico, básico-sucio-ancilla, avanzado, noancilla. Por ejemplo, la puerta Toffoli con 3 qubits de control:

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)

Salida:

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 ├
           └───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.