LoginSignup
23
18

More than 5 years have passed since last update.

QISKit 手引き

Last updated at Posted at 2017-11-26

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

2017年11月時点の記事であり、最新の内容ではありません。

導入

  • IBM Qについて

  • QISKit

    • IBM Researchと研究者によって与えられている、IBM Qにジョブ投げするためのKit
    • Githubにチュートリアル用のJupyter, Python SDK, Swift SDK, JavaScript SDK, Python API, またユーザガイドやopenqasmのガイド等が存在
    • なぜか公式が英語と日本語に対応しており、Python SDKではマニュアルを読めば簡単に実装可能
      • また公式の開発速度が結構な速度なので、公式の解説が最も頼りになります
      • 日本語対応は終了している模様です(2019年追記)
    • 量子コンピュータで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に結果が溜まってしまうのが注意点です。

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18