Я хочу створити ворота Toffoli, керовані російськими кубітами, і реалізувати його в QISKit. Це можна зробити? Якщо так, то як?
Я хочу створити ворота Toffoli, керовані російськими кубітами, і реалізувати його в QISKit. Це можна зробити? Якщо так, то як?
Відповіді:
Простий спосіб зробити це проілюстровано на малюнку 4.10 Nielsen & Chuang.
Де U може бути будь-яким однокубітним обертанням (у цьому випадку Х-ворота).
Ця схема працює так: Ми хочемо застосувати U до цільового кубіту лише у тому випадку, якщо AND всіх кубітів управління дорівнює 1. Нормальний Toffoli дає нам І кубітів. Таким чином, ланцюжком декількох тоффоліс, ми можемо отримати c1.c2.c3.c4.c5, з уловкою, яку були введені деякі "робочі" (або допоміжні) кубіти для зберігання проміжних результатів. Після застосування остаточного МС ми отримуємо кінцевий результат у цілі. Тепер ми можемо очистити проміжні робочі кубіти, скасувавши їх обчислення, повернувши їх у стан | 0>. Ця модель оборотного обчислення відома як метод "обчислити-копіювати-обчислити", і вперше була запропонована Чарлі Беннеттом в 1973 році .
Ось код QISKit для побудови схеми та візуалізації її:
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)
Врожайність:
Я хочу додати метод, який не використовує кубики ансілли, але вимагає, щоб ворота були складнішими, ніж просто керовані. Я вважаю, що цей метод вперше був представлений Barenco et. ін. у цій статті лема 7.5:
Де . У цьому випадку цього хочеться, і отже
Це рекурсивне визначення, тому шлюз n кубіт управління визначається з точки зору кубітного шлюзу n-1 управління. Це триватиме до тих пір, поки ви не досягнете двох кубітних воріт CNOT.
Ця реалізація є дещо складною, однак простіша існує, якщо не проти збирати відносну фазу (див. Лему 7.9 тієї ж статті).
Для реалізації таких воріт, як в QISKIT вам потрібно буде використовувати вдосконалені ворота одного кубіта.
Qiskit's QuantumCircuit має метод mct для створення воріт Toffoli з декількома контролями з декількома режимами: базовий, базовий-брудний-анцилла, розширений, неанцилли. Наприклад, ворота Toffoli з 3 кубітами управління:
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)
Вихід:
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 ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘