python3
量子コンピュータ
QuantumExperience
OpenQASM

ちょっとIBM Qを触ってみたので、QISKitについてまとめておきます。

導入

  • IBM Qについて

  • QISKit

    • IBM Researchと研究者によって与えられている、IBM Qにジョブ投げするためのKit
    • Githubにチュートリアル用のJupyter, Python SDK, Swift SDK, JavaScript SDK, Python API, またユーザガイドやopenqasmのガイド等が存在
    • なぜか公式が英語と日本語に対応しており、Python SDKではマニュアルを読めば簡単に実装可能
      • また公式の開発速度が結構な速度なので、公式の解説が最も頼りになります
    • 量子コンピュータで1+1を計算する[実装編]: Python SDKの実装例の記事

QISKitにでてきたOpenQASMとは何か, APIとSDKの違いは何かについては以下では記述します。

OpenQASM

  • OpenQASM: 量子アセンブリ言語(quantum assembly language (QASM))
  • OpenQASMは量子回路を記述するための言語です
  • IBM QのComposer画面から、OpenQASMを用いて回路設計が可能です
    • 手順: "Switch to Qasm Editor"をクリックすると、 スクリーンショット 2017-11-26 18.54.27.png QASMで回路を設計できるようになります スクリーンショット 2017-11-26 18.54.50.png
  • QISKitのSDK, APIは内部でOpenQASMを記述しています
  • Cross et al. (2017) Open Quantum Assembly Languageで詳細が記述されています

SDK

例えば1+1のシミュレータ計算は下記のように計算できますが、

from qiskit import QuantumProgram
import json

def read_api():
    f_api = open("../api_token.json", "r")
    api_dic = json.load(f_api)
    QX_TOKEN = api_dic["api"]
    QX_URL = "https://quantumexperience.ng.bluemix.net/api"
    return(QX_TOKEN, QX_URL)

class Q_Circuit():
    _Name = "summation"
    _Num_qr = 4
    _Num_cr = 4

def summation():
    qp = QuantumProgram()
    token, url = read_api()
    qp.set_api(token, url)

    #Qbitの設定
    qr = qp.create_quantum_register("qr", Q_Circuit._Num_qr)
    cr = qp.create_classical_register("cr", Q_Circuit._Num_cr)
    qc = qp.create_circuit(Q_Circuit._Name, [qr], [cr])

    #回路部分       
    qc.h(qr[0])
    qc.h(qr[1])
    qc.ccx(qr[0], qr[1], qr[2])
    qc.cx(qr[0], qr[3])
    qc.cx(qr[1], qr[3])

    qc.measure(qr, cr)
    print(qp.get_qasm(Q_Circuit._Name))     #QASMコードの取得
    result = qp.execute([Q_Circuit._Name], shots=1024)      #計算の実行
    print(result.get_data(Q_Circuit._Name))

if __name__ == '__main__':
    summation()

print(qp.get_qasm(Q_Circuit._Name)) で取得できるように、またqiskitの中身( _quantumcircuit.py, _quantumregister.py )を見ればわかるように、内部ではOPENQASMが使われています。
(executeはデフォルトがbackend="local_qasm_simulator")

API

APIはより直接的に、OpenQASMそのものを記述してIBM Qに送ります(参考コード)。
1+1の場合、先程のOPENQASMを利用して、シミュレータで、

from IBMQuantumExperience import IBMQuantumExperience
import json

def read_api():
    f_api = open("../api_token.json", "r")
    api_dic = json.load(f_api)
    QX_TOKEN = api_dic["api"]
    QX_URL = "https://quantumexperience.ng.bluemix.net/api"
    return(QX_TOKEN, QX_URL)

def Qasm_Code():
    qasm = """//OPENQASM 2.0
OPENQASM 2.0;
include "qelib1.inc";
qreg q[4];
creg c[4];
h q[0];
h q[1];
ccx q[0],q[1],q[2];
cx q[0],q[3];
cx q[1],q[3];
measure q[3] -> c[0];
measure q[2] -> c[1];
measure q[1] -> c[2];
measure q[0] -> c[3];
"""
    return(qasm)

def main():
    token, url = read_api()
    IBMQ = IBMQuantumExperience(token)
    qasm = Qasm_Code()
    result = IBMQ.run_experiment(qasm, shots= 1024,name='api_test', timeout=60)
    print(result.values() )

if __name__ == '__main__':
    main()

とすることで計算を実行できます。(run_experimentのデフォルトがbackend='simulator',
IBMQuantumExperience.py)
ibmqx4に計算を投げる場合はrun_experimentをbackend="ibmqx4"と指定します。
(上記の回路設計ではibmqx4では計算が走らないので、適宜qasmを変える必要があります)

API経由で投げた計算は、IBM QのComposerページのQuantum Scoresに結果が溜まってしまうのが注意点です。