The new Qiskit Textbook beta is now available. Try it out now
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ゲートの実装を示します。

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

XOR ゲート

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

AND ゲート

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

NAND ゲート

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

OR ゲート

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))
Results for the NOT gate
    Input 0 gives output 1
    Input 1 gives output 0

Results for the XOR gate
    Inputs 0 0 give output 0
    Inputs 0 1 give output 1
    Inputs 1 0 give output 1
    Inputs 1 1 give output 0

Results for the AND gate
    Inputs 0 0 give output 0
    Inputs 0 1 give output 0
    Inputs 1 0 give output 0
    Inputs 1 1 give output 1

Results for the NAND gate
    Inputs 0 0 give output 1
    Inputs 0 1 give output 1
    Inputs 1 0 give output 1
    Inputs 1 1 give output 0

Results for the OR gate
    Inputs 0 0 give output 0
    Inputs 0 1 give output 1
    Inputs 1 0 give output 1
    Inputs 1 1 give output 1
import qiskit
qiskit.__qiskit_version__
{'qiskit-terra': '0.16.1',
 'qiskit-aer': '0.7.1',
 'qiskit-ignis': '0.5.1',
 'qiskit-ibmq-provider': '0.11.1',
 'qiskit-aqua': '0.8.1',
 'qiskit': '0.23.1'}

翻訳担当: 野ヶ山尊秀 (nogayama @jp.ibm.com)