Set 1. 量子回路による古典論理ゲートの実現
from qiskit import *
from qiskit.tools.visualization import plot_histogram
import numpy as np
NOTゲート(Qiskitではx
と表現)、CNOTゲート(Qiskitではcx
と表現)、Toffoliゲート(Qiskitではccx
と表現)を使用して、XOR、AND、NAND、および ORゲートを実装してください。
例として、NOTゲートの実装を示します。
この関数は、バイナリ文字列入力( '0'
または' 1'
)を受け取り、反対のバイナリ出力 を返します。
def NOT(input):
q = QuantumRegister(1) # 入力を量子ビットに符号化するための量子レジスター
c = ClassicalRegister(1) # 出力を格納するための古典レジスター
qc = QuantumCircuit(q, c) # 量子回路
# '0' を |0⟩ に, '1' を |1⟩ に符号化する
# '0'が入力されたら、量子ビットはデフォルトで |0⟩なので何もしない
# '1'が入力されたら、Xゲートを用いて |0⟩ を |1⟩ に変換する
if input=='1':
qc.x( q[0] )
# Xゲートを用いて NOT を量子回路の上で実装する。
qc.x( q[0] )
# 最後に、量子状態 |0⟩ または |1⟩ を観測し、古典ビット c[0] に格納する
qc.measure( q[0], c[0] )
# シミュレーター上で実行する
backend = Aer.get_backend('qasm_simulator')
# 結果は確定的なので、一回の実行結果だけで十分
job = execute(qc,backend,shots=1)
output = next(iter(job.result().get_counts()))
return output
2つのバイナリ文字列を入力として受け取り、1つのバイナリ文字列を出力します。
入力が等しい場合、出力は '0'
であり、そうでない場合、出力は' 1'
です。
def XOR(input1,input2):
q = QuantumRegister(2) # 入力を格納する 2 量子ビット
c = ClassicalRegister(1) # 出力を格納する 1 古典ビット
qc = QuantumCircuit(q, c) # 量子回路
# 量子プログラムをここに記述する
qc.measure(q[1],c[0]) # 必要ならここは変更しても良い
# シミュレーター上で実行する
backend = Aer.get_backend('qasm_simulator')
# 結果は確定的なので、一回の実行結果だけで十分
job = execute(qc,backend,shots=1,memory=True)
output = job.result().get_memory()[0]
return output
2つのバイナリ文字列を入力として受け取り、1つのバイナリ文字列を出力します。
両方の入力が '1'
の場合のみ、出力は' 1'
になります。
def AND(input1,input2):
q = QuantumRegister(3) # 入力を格納する 2 量子ビットと出力を格納する 1 量子ビット
c = ClassicalRegister(1) # 出力を格納する 1 古典ビット
qc = QuantumCircuit(q, c) # 量子回路
# 量子プログラムをここに記述する
qc.measure(q[2],c[0]) # 必要ならここは変更しても良い
# シミュレーター上で実行する
backend = Aer.get_backend('qasm_simulator')
# 結果は確定的なので、一回の実行結果だけで十分
job = execute(qc,backend,shots=1,memory=True)
output = job.result().get_memory()[0]
return output
2つのバイナリ文字列を入力として受け取り、1つのバイナリ文字列を出力します。
両方の入力が '1'
の場合のみ、出力は'0'
になります。
def NAND(input1,input2):
q = QuantumRegister(3) # 入力を格納する 2 量子ビットと出力を格納する 1 量子ビット
c = ClassicalRegister(1) # 出力を格納する 1 古典ビット
qc = QuantumCircuit(q, c) # 量子回路
# 量子プログラムをここに記述する
qc.measure(q[2],c[0]) # 必要ならここは変更しても良い
# シミュレーター上で実行する
backend = Aer.get_backend('qasm_simulator')
# 結果は確定的なので、一回の実行結果だけで十分
job = execute(qc,backend,shots=1,memory=True)
output = job.result().get_memory()[0]
return output
2つのバイナリ文字列を入力として受け取り、1つのバイナリ文字列を出力します。
いずれかの入力が '1'
の場合、出力は'1'
になります。
def OR(input1,input2):
q = QuantumRegister(3) # 入力を格納する 2 量子ビットと出力を格納する 1 量子ビット
c = ClassicalRegister(1) # 出力を格納する 1 古典ビット
qc = QuantumCircuit(q, c) # 量子回路
# 量子プログラムをここに記述する
qc.measure(q[2],c[0]) # 必要ならここは変更しても良い
# シミュレーター上で実行する
backend = Aer.get_backend('qasm_simulator')
# 結果は確定的なので、一回の実行結果だけで十分
job = execute(qc,backend,shots=1,memory=True)
output = job.result().get_memory()[0]
return output
次のコードを実行し、すべての可能な入力に対して上記の関数が機能するかどうかを確認してください。
print('\nResults for the NOT gate')
for input in ['0','1']:
print(' Input',input,'gives output',NOT(input))
print('\nResults for the XOR gate')
for input1 in ['0','1']:
for input2 in ['0','1']:
print(' Inputs',input1,input2,'give output',XOR(input1,input2))
print('\nResults for the AND gate')
for input1 in ['0','1']:
for input2 in ['0','1']:
print(' Inputs',input1,input2,'give output',AND(input1,input2))
print('\nResults for the NAND gate')
for input1 in ['0','1']:
for input2 in ['0','1']:
print(' Inputs',input1,input2,'give output',NAND(input1,input2))
print('\nResults for the OR gate')
for input1 in ['0','1']:
for input2 in ['0','1']:
print(' Inputs',input1,input2,'give output',OR(input1,input2))
import qiskit
qiskit.__qiskit_version__
翻訳担当: 野ヶ山尊秀 (nogayama @jp.ibm.com)