新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

IBM Quantum Experienceで体験するはじめての量子計算

注目の量子コンピューターに誰もがクラウド経由でアクセスして量子計算を試せることをご存知でしたか?

2016年5月にIBMは世界に先駆けて実機の量子コンピューターをクラウド上に公開しました。以来、世界中から20万人以上がクラウド経由で量子コンピューターにアクセスして量子計算を実行しています。(2020年2月現在)

初心者にはとっつきにくいイメージの量子計算を簡単に試せるようにと開発されたIBM Quantum Experience (通称IQX)と呼ばれるツールも進化をつづけており、直接アクセス可能な量子システムも増えてパワーアップしました。

現在IQXを通じてアクセスできる量子システム(バックエンド)は9つです。

公開されている量子システム Code Name 量子ビット数
ibmq_16_melbourne メルボルン 15 qubits
ibmq_essex エセックス 5 qubits
ibmq_burlington バーリントン 5 qubits
ibmq_london ロンドン 5 qubits
ibmq_vigo ヴィーゴ 5 qubits
ibmq_ourense オウレンセ 5 qubits
ibmq_5_yorktown – ibmqx2 ヨークタウン 5 qubits
ibmq_armonk アーモンク 1 qubit
ibmq_qasm_simulator キャズムシミュレーター 32 qubits

IQXはこれら9つのバックエンドへのアクセスとともに、大きく3つのメリットをユーザーに提供します。

  • 量子回路の設計、実行、結果の表示が簡単にできるGUIの提供
  • オープンソースの量子コンピューティング用開発フレームワークQiskitをインストールなしで実行できるJupyter Notebookの同梱
  • 量子コンピューティングの基礎から学べる豊富なチュートリアル

この記事では量子コンピューター入門者の方向けに、IQXをつかって、量子コンピューター上で量子計算を試すためのはじめての量子回路を組むことを学びます。

最初にIQXヘのログイン方法を紹介してから、実際に量子回路を組んで計算をして、結果を表示させるところまでをステップ毎に解説します。

1.1. 登録とサインイン

まずはIBM Quantum Experienceのサイトへ行き、メールアドレスかSNS の個人アカウントを使ってサインインをします。メールの場合はアドレス認証が必要になりますが、SNSアカウントを使う場合は、登録画面に必要事項を入力するとすぐにログインが可能になります。

図 1-1. IBM Quantum Experience のサインインページ
alt

ログインが完了すると、以下のウェルカム画面があらわれます。画面右側には公開中の量子システム(バックエンド)の稼働状況やジョブ・ステータスが表示されています。

図 1-2. IBM Q Experience のウェルカム画面
alt

1.2. 量子ゲートでビットを操作する

私たちが使う従来のコンピューターが0と1の2進数のビットですべてのデータを表現し、論理ゲートを組み合わせてビットを操作することでどのような計算も行うことができるように、量子コンピューターもまた量子ビット(qubit)をデータの最小単位として、量子ゲートを組みあわせて量子ビットを操作することでどのような計算もすることができます。

図 1-3. 古典のNOTゲート(左)と量子コンピューターにおける古典NOTゲートに相当するXゲート(右)
alt

では早速、新規の量子回路を組んでみましょう。

ウェルカム画面中央の「Create a circuit」ボタンを押します。すると五線譜のような画面があらわれます。五線譜に音符を置くように量子回路を組めることから、このGUIはComposer(コンポーザー)と呼ばれています。

Composerの上には現在IQXで使うことのできる量子ゲートが並んでいますので、まずは試しに古典論理ゲートのNOTに相当するXゲートと呼ばれる量子ゲートをq[0] |0〉と記された一番目の線上にドラッグ&ドロップしてみましょう。

図 1-4. Composer(コンポーザー)の画面
alt

NOTゲートとは入力が0のときは1を出力,入力が1のときは0を出力する反転操作を行うゲートです。量子ゲートのXゲートもまた量子ビットの状態を「反転」することから量子版NOTゲートとも言えます。

ここで量子ビットの「状態」について考えてみます。古典のビットが0か1のいずれかであるように、量子ビットも「観測」という行為によって最終的に0または1のいずれかの状態をとります。ただし量子ビットにおける0と1は古典のそれと区別するために|0〉,|1〉といった少し特別な表記方法になります。

上記Composerにおける五線譜の各線は上から順番にq[0] q[1] q[3] q[4]…という記号で区別された量子ビットをそれぞれ表しており、さらにどの量子ビットも初期状態が|0⟩にセットされています。|0〉のことを系のエネルギーが最も低い状態を意味する「基底状態」と呼ぶこともあります。

各量子ビットは自分の線上に置かれた量子ゲートが適用されることで、左から右へと時間発展的に状態が変化します。

ではさきほどご紹介したXゲートを置くと初期状態|0〉はどのように変化するのでしょうか。

量子ビットにゲートを適用したあとの状態は「測定」という行為を実行することで初めて読み取ることが可能になります。これにはComposer上に並ぶゲートの下にある以下の測定ゲート(Measurement)icon を使います。

図 1-5. 測定によってc5という線で表現される古典レジスターに結果が格納されます。
alt

それではこのシンプルな回路を実行してみましょう。Composer画面の左上で実験名を適当に入れてから、「Unsaved Change」をクリックし「Saved」にステータス変更になったことを確認してから「Run」で実行します。

図 1-6. 実験名を編集後、保存してRunすることで作成した回路を実機で実行することができます
alt

通称Backendと呼ばれる稼働中の量子システムのリストからデフォルトの(リスト上では一番上に表示されている)ibmq_qasm_simulatorを選択し、ショット数もデフォルトの1024のまま「Run(実行)」します。すると作成した回路は選択したBackend(特定の量子システム)の実行待ちの列(Queue)に入ります。

図 1-7. Run your circuitでバックエンドとショット数を選択します
alt

実行結果を確認するには、Composer画面に戻って左側のメニューから「Results」に入ります。

図 1-8. 左のメニューからResultsを選択して実行結果を確認します
alt

すると下の画面のようにシミュレーターで実行した回路の結果が「Pending Job(保留中)」、または「Completed(完了済み)」の一覧に表示されていることを確認することができるはずです。

図 1-9. Resultsから保留中および実行完了したジョブ一覧を確認できます
alt

ジョブが実行完了したら、クリックして結果をみてみましょう。

さきほど初期状態が|00000〉の量子ビットがXゲートを適用されたことによって|00001〉の状態に測定される確率が 100%になっています。理想的な結果を返してくれる(ノイズのない)シミュレーターなので確率がぴったり 100%になります。5 量子ビットすべてに 0 が入った、 |00000〉の状態の一つ目 (右端) のビットを 0 から 1 へ反転する操作を行ったので、 |00000〉→ |00001〉になっています。

図 1-10. 5つの量子ビットのうち0番目が右端のビットに相当します
alt

1.3. はじめての量子回路:2量子ビットのもつれ(ベル状態)をつくる

次に、2つの量子ビットをつかってもう少し面白い量子状態をつくってみましょう。古典コンピューターの論理ゲートの組合せではつくれない「量子重ね合わせ(Superposition)」と「量子もつれ(Entanglement)」という量子状態です。

さきほどの結果画面から左側のメニューのComposerに戻り「New Circuit」を選択します。(保存済みの量子回路から作業しなおしたい場合は一覧から選択することもできます。)

Figure 11. Composerメニュー
alt
Figure 12. 図 1-11. Resultsから保留中および実行完了したジョブ一覧を確認できます
alt

今回は五線譜に量子ゲートをドラッグ&ドロップする前にComposer左側のCircuit Editorの下記アイコンをクリックします。

alt

すると、量子回路を記述するためのアセンブリ言語OpenQASMが表示されます。ここでは下記のとおり、量子ビット用レジスターの名前と数(i.e. qreg q[5])と古典レジスターの名前と数 (i.e. creg c[5])が宣言され、その記述通りにComposer側のGUIでq[0], q[1], q[2], q[3], q[4] の5本の線とc5と書かれた線が描画されていることがわかります。

alt

ここで、試しに量子ビットの数をq[5]からq[2]に書き換えてみましょう。すると、以下の画面のようにComposer側で表示される線の数が5本から2本に減りました。

Figure 13. 図 1-12. Circuit EditorでQASMコードを直接編集して回路を組むことも可能です
alt

左側にCircuit Editorを表示させたまま、この2本の線に対してそれぞれ量子ゲートを順番に置いていってみましょう。重ね合わせをつくるために用いられるのがアダマールゲートと呼ばれるもので、Hの記号が目印です。

早速一番上の線(量子ビットq[0])にHゲートを置いてみます。するとCircuit Editor上にHゲートに相当するQASMコード(i.e. h q[0])が自動表示されます。

alt

ここでCircuit Editor側のQASMコードをh q[0] → h q[1]に編集してみましょう。するとComposer側のHゲートはどうなったでしょうか?下の線(i.e. q[1])に移動したはずです。このように、IQXで量子回路を組むときは、GUIでゲートをドラッグ&ドロップして作成することもできれば、Circuit Editor内のOpenQASMというアセンブリ言語を記述して作成することもできます。

それではHゲートを1番上の線(q[0])に戻し、更にQASMコードのcreg c[5]をcreg c[2]に編集してから再び「測定」をしてみましょう。

alt

ここでも実験名を適当に入れて保存をし、「Run(実行)」してからResults(結果)を確認します。すると、今度はヒストグラムで2本の棒グラフが立っています。

alt

初期状態が|00〉だった2つの量子ビットのうち最初の量子ビットq[0]にアダマール(H)ゲートを適用して測定すると、結果がほぼ半々の割合で|00〉と|01〉の量子状態が現れました。これは表が0で裏が1のコインを100回投げたらほぼ50回は表、そして同じくほぼ50回は裏が出るのと同じ状況を表しています。このように1つの量子ビットが2つの状態をそれぞれ半分の確率で保持している状態を重ね合わせと呼びます。

また特筆すべきは、重ね合わせの状態にある量子が「測定」という行為によって必ず|0>または|1>のいずれかの状態に必ず収束することです。中間はありません。

つづいて量子もつれの話に移ります。

もつれた状態にある2つの粒子は、空間的に離れていても、1つの粒子に対する測定が、瞬時に残りの粒子に影響します。2枚のコインを同時にトスした場合を考えてみましょう。古典統計では同時にトスした1枚目のコインと2枚目のコインは区別した系として観測され、1枚目と2枚目のコインの結果には相関はありません。しかし、もつれ状態にある2枚のコインは1枚目の結果と2枚目のトスの結果に100%の相関がみられます。

この不思議に思える現象も自然界には普通に存在しています。例えば、私たちの世界を形づくっている原子を取り囲む電子対のほとんどはもつれ状態という強い相関関係をもって存在しています。

量子コンピューターは、このもつれを利用して特定の入力を対の量子ビットに情報伝達または情報制御をかけたりできる点が重要です。

ではもつれをどうやって量子コンピューター上で実装するのでしょうか。これも量子ゲートをつかって実装が可能です。早速みていきましょう。

さきほど置いたHゲートのあとに今度はCNOTと呼ばれるゲートを置いてみましょう。CNOTとは制御NOTゲートとも呼ばれ、作用させるには必ず2つの量子ビットを必要とします。2つの量子ビットにまたがって適用されるCNOTゲートはコントロール(小さな丸)の入力が1の時だけターゲット(+サインの入った大きな丸)を反転させます。古典のXORゲートに相当します。

alt

Hゲートによって50%の確率で入力が0または1となることから、入力値が1の時だけターゲットの量子ビットを反転させるCNOTを適用すると面白いことが起こります。以下の棒グラフが示すように結果は|00〉または|11〉となります。

alt

つまり、ひとつの量子ビットを測定した瞬間100%の確率でもう片方がひとつめと同じ量子状態をとることを意味します。これがBell State(ベル状態)とも呼ばれる2量子ビットの量子もつれです。

有名なベル状態をつくることができました。

次の章では量子ビットと量子ビットの状態を変換する各種ゲートを視覚化する球体モデル:ブロッホ球について解説します。

2. 量子状態の球体モデル:ブロッホ球

alt

量子状態を厳密的に視覚的に理解することは難しいですが、少しでも視覚的に捉えられるようにと考案された球体モデルに物理学者のフェリックス・ブロッホにちなんで名付けられたブロッホ球というものがあります。

ブロッホ球をつかえば量子ビットの状態を球体の中心からのびるベクトルおよび球面上の点として表現することが可能になります。

まずは量子計算の基本となる量子ビットをブロッホ球の中心から球面までのびるベクトルとして表現してみましょう。

alt

観測前の量子状態(Ψ:サイと発音)は|0〉または|1〉の重ね合わせの状態で存在することができます。量子状態|Ψ〉の一般的な数学表現は以下の通りです。

|Ψ〉= α|0〉+β|1〉

このとき|0〉と|1〉の前にあるαとβはそれぞれ|0〉と|1〉が観測される確率をあらわす係数で「確率振幅」と呼ばれます。これは状態|0〉と状態|1〉がそれぞれ確率|α|2と確率|β|2で重ねあわさった状態であることを意味します。確率振幅αとβは虚数(i.e. a + bi)で以下の法則に従います。

|α|2+|β|2 = 1

つまり|0〉または|1〉が観測の結果得られる確率をそれぞれ足すと必ず1(100%)になることを意味します。

前章の冒頭でみたように、量子ゲートのなかで最もシンプルなものの1つに|0〉→ |1〉, |1〉→ |0〉に反転するXゲートがありました。さきほど|0〉と|1〉はそれぞれベクトルとして表現できるというお話をしましたが、ベクトルの変換には行列を使います。

alt

量子状態を変換する各種ゲートはすべて行列式で書き表すことができるのです。Xゲートを行列式で書き表すと以下のようになります。

alt

紙と鉛筆をつかって、X|0〉=|1〉, X|1〉=0〉になることを証明してみましょう。

alt alt

つづいてアダマール(H)ゲートの行列式と適用されたときのブロッホ球上での量子状態について考えてみましょう。50%(1/2)の確率で|0〉または|1〉を得られる (i.e. alt) ということはα, βはいずれも alt となり、重ね合わせ状態の量子状態を以下のように記述できます。

alt alt

ブロッホ球が役に立つのはあくまで1つの量子ビットの純粋状態を表すときであり、量子ビットの数がn=2以上の系を表現することはできない点は注意が必要です。

量子計算とはブロッホ球面上の状態ベクトルに量子ゲートを作用させてアルゴリズムを組み立てることにほかなりません。こちらにいくつか代表的な一量子ビットの基本ゲートをご紹介します。

ゲート名 Composer Reference 行列式 解説
恒等演算 alt
id q[0];
alt 1ゲート時間の間、何も変換が行われないidleゲート。
X反転ゲート alt
x q[0];
alt |0⟩ → |1⟩, |1⟩ → |0⟩ にそれぞれ反転させる。Rxのπ回転と等価。
パウリYゲート alt
y q[0];
alt 位相反転とビット反転の両方を引き起こすゲート。
|0⟩ → i|1⟩
|1⟩ → -i |0⟩
パウリZゲート alt
z q[0];
alt |0> には何もせず、|1> には位相反転を起こすゲート。
|0⟩ → |0⟩
|1⟩ → – |1⟩
アダマールゲート alt
h q[0];
alt 重ね合わせをつくるのに用いられ、
|0⟩ → |+⟩
|1⟩ → |−⟩ にそれぞれ変換します。クリフォード演算として知られ、XとZ基底間の情報のやり取りに有益
π/2位相シフトゲート alt
s q[0];
alt alt Rz ゲートのπ/2回転と等価
– π/2位相シフトゲート alt
sdg q[0];
alt alt Rz ゲートの-π/2回転と等価
π/4位相シフトゲート alt
t q[0];
alt alt Rz ゲートの-π/4回転と等価
-π/4位相シフトゲート alt
tdg q[0];
alt alt Rz ゲートの-π/4回転と等価

ここでご紹介したゲート以外にも、IQXには量子ビットに対して特定の操作を行うゲートがいくつも用意されています。提供されている量子ゲートの特徴とブロッホ球上での動きについてはIQXのGates glossary(ゲート索引)に紹介されていますのでぜひご参照ください。

3. IQXのVisualizationを使ってみよう

IQXには、作成した回路を毎回シミュレーターや実機の量子システムにジョブとして投げて結果を待たなくても、回路を組んでいるそばからリアルタイムで量子状態を視覚化してくれるVisualizationツールが用意されています。まずはComposerの左側にある以下のアイコンをクリックします。

alt

すると、デフォルトで状態ベクトル(Statevector)の表示がされます。以下は、さきほどのベル状態を状態ベクトル(Statevector)で示した図です。

alt

棒グラフはジョブを実行したあとに結果表示されるResultsのヒストグラムと大差ありませんが、グラフの下に表示されている [0.707+0j, 0+0j, 0+0j, 0.707+0j]というarrayは|00〉|01〉|10〉|11〉にそれぞれ対応し、各量子状態の確率振幅と位相といったより細かな情報を提供してくれます。

いかがでしたでしょうか?IBM Quantum Experienceの基本的な使い方はお分かりになったでしょうか。

次回の記事では代表的な量子アルゴリズムの学習をしながらIQXの機能をさらにご紹介していきたいと思います。