QISKit: Toffoli gate の実装

import sys, qiskit
print(sys.version)
print("qiskit version:", qiskit.__version__)

3.6.5 (default, May 11 2018, 04:00:52) 
[GCC 8.1.0]
qiskit version: 0.5.4
from qiskit import ClassicalRegister, QuantumRegister
from qiskit import QuantumCircuit,  available_backends, execute, register, get_backend

# import basic plot tools
from qiskit.tools.visualization import plot_histogram, circuit_drawer

実装1

def toffoli1(c0, c1, t, q, qc):
    qc.h(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.t(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.t(q[c1])
    qc.t(q[t])
    qc.cx(q[c0], q[c1])
    qc.h(q[t])
    qc.t(q[c0])
    qc.tdg(q[c1])
    qc.cx(q[c0], q[c1])
    
q = QuantumRegister(3)
qc = QuantumCircuit(q)
toffoli1(0, 1, 2, q, qc)
circuit_drawer(qc)

f:id:goropikarikun:20180613103014p:plain

実装2

def toffoli2(c0, c1, t, q, qc):
    qc.h(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.t(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.tdg(q[c1])
    qc.t(q[t])
    qc.cx(q[c0], q[c1])
    qc.h(q[t])
    qc.tdg(q[c1])
    qc.cx(q[c0], q[c1])
    qc.t(q[c0])
    qc.s(q[c1])
    
q = QuantumRegister(3)
qc = QuantumCircuit(q)
toffoli2(0, 1, 2, q, qc)
circuit_drawer(qc)

f:id:goropikarikun:20180613103026p:plain

実装3

def toffoli3(c0, c1, t, q, qc):
    qc.h(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.t(q[t])
    qc.cx(q[c1], q[t])
    qc.tdg(q[c1])
    qc.tdg(q[t])
    qc.cx(q[c0], q[t])
    qc.cx(q[c0], q[c1])
    qc.t(q[c0])
    qc.tdg(q[c1])
    qc.t(q[t])
    qc.cx(q[c0], q[c1])
    qc.s(q[c1])
    qc.h(q[t])
    
q = QuantumRegister(3)
qc = QuantumCircuit(q)
toffoli3(0, 1, 2, q, qc)
circuit_drawer(qc)

f:id:goropikarikun:20180613103044p:plain

実装4

def toffoli4(c0, c1, t, q, qc):
    qc.h(q[t])
    qc.tdg(q[c0])
    qc.t(q[c1])
    qc.t(q[t])
    qc.cx(q[c0], q[c1])
    qc.cx(q[t], q[c0])
    qc.tdg(q[c0])
    qc.cx(q[c1], q[t])
    qc.cx(q[c1], q[c0])
    qc.tdg(q[c0])
    qc.tdg(q[c1])
    qc.t(q[t])
    qc.cx(q[t], q[c0])
    qc.s(q[c0])
    qc.cx(q[c1], q[t])
    qc.cx(q[c0], q[c1])
    qc.h(q[t])

    
q = QuantumRegister(3)
qc = QuantumCircuit(q)
toffoli4(0, 1, 2, q, qc)
circuit_drawer(qc)

f:id:goropikarikun:20180613103054p:plain

参考

クラウド量子計算入門―IBMの量子シミュレーションと量子コンピュータ, 中山 茂, ISBN-13: 978-4877834081