Como posso implementar uma porta Toffoli de n bits?

17

Eu quero criar um portão Toffoli controlado por n qubits e implementá-lo no QISKit. Isso pode ser feito? Se sim, como?

Ali Javadi
fonte
Obrigado pelas perguntas e respostas. Bom te ver aqui Ali!
James Wootton

Respostas:

18

Uma maneira simples de fazer isso é ilustrada na Figura 4.10 da Nielsen & Chuang. n-

Onde U pode ser qualquer rotação de um qubit único (neste caso, um gate X).

Este circuito funciona da seguinte maneira: queremos aplicar U ao qubit alvo apenas se o AND de todos os qubits de controle for 1. Um Toffoli normal nos fornece o AND de 2 qubits. Assim, ao encadear alguns Toffolis, podemos obter c1.c2.c3.c4.c5, com a captura de que alguns qubits "funcionais" (ou ancilla) foram introduzidos para armazenar resultados intermediários. Depois de aplicar a UC final, obtemos o resultado final na meta. Agora podemos limpar os qubits de trabalho intermediários desfazendo seus cálculos, retornando-os ao estado | 0>. Esse modelo de computação reversível é conhecido como o método "computar-copiar-não-computar" e foi proposto pela primeira vez por Charlie Bennett em 1973 .

Aqui está o código QISKit para construir o circuito e visualizá-lo:

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)

Rendimentos:

circuito gerado por qiskit

Ali Javadi
fonte
7

Eu quero adicionar um método que não usa qubits ancilla, mas exige portas mais complicadas do que apenas controladas. Eu acredito que esse método foi apresentado pela primeira vez por Barenco et. al. neste artigo , Lema 7.5: insira a descrição da imagem aqui

Quando . Nesse caso, quer-se que e, portanto, V2=vocêV2=X

V=12(1+Eu1-Eu1-Eu1+Eu) .

Esta é uma definição recursiva, portanto, o controle n qubit gate é definido em termos do controle n-1 qubit gate. Isso continuaria até você alcançar o CNOT de dois qubit.

Essa implementação é um pouco difícil, no entanto, existe uma mais simples se você não se importa em coletar uma fase relativa (consulte o Lema 7.9 do mesmo artigo).

Para implementar um portão como no QISKIT, você precisará usar os portões avançados de um qubit único.V

maor
fonte
Alguém já trabalhou na implementação deste portão no Cirq?
Enrique Segura
5

De Qiskit QuantumCircuit tem MCT método para construir-control múltipla Toffoli portão com vários modos:,-sujo-ancilla básico básico, avançado, noancilla. Por exemplo, portão Toffoli com 3 qubits de controle:

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)

Resultado:

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
fonte