Help us understand the problem. What is going on with this article?

blueqatでVQE、(なるべく)難しいことなしで

はじめに

VQEというアルゴリズムを簡単に理解して使ってもらうことを念頭に記事を書いてみます。

VQE?

VQEはVariational Quantum Eigensolverというアルゴリズムで、アルゴリズムはソフトウェアのベースとなるような、問題を解くための方法が記述されたアプリのようなものです。このVQEを使うことで様々な問題に応用ができますが、まずはVQEをとりあえず使ってみることにします。

現在の量子コンピュータはハイブリッド式と言われていて量子コンピュータと既存コンピュータのハイブリッドで使うアルゴリズムが主体です。VQEとQAOAというアルゴリズムを覚えて貰えばいいですが、自分で作るのは大変なので作ってあるものを用意します。

VQEはゲートを使って問題設定をする

VQEはゲートを使って行列の固有値の最小値というものを計算します。応用はそのうち追って説明するとして、まずは解き方を覚えれば使えるので、使ってみます。

材料計算や最適化計算は定型のフローがあるので、それに沿ってやればいいですが、今回は、

「1量子ビットVQEを世界一簡単に書く 2020年2月Ver.」
https://qiita.com/gyu-don/items/65f830ae3777534f9a04

を参考にしてblueqatの使い方だけをみてみます。

セットアップは数種類

blueqatを使ってVQEを行うメリットは記述が簡単であるということと、定式化にかかる苦労を全て引き取ってくれるライブラリを内包しているということです。

セットアップのおすすめは、
1,pip install
pythonというプログラミング言語を使いますが、pip3 install blueqatだけでインストールがすみます。

pip3 install blueqat

こちらはインストールは手元のPCにされますが、環境構築などで苦労することもあります。

2,google colab
googleのアカウントを持っている方は、google colaboratoryというサービスを使うと、簡単に始めることができます。とりあえず

https://colab.research.google.com/?hl=ja

にアクセスして、

pip install blueqat

で導入できます。こちらはとても簡単です。

3,quantumcomputing.comを使う
こちらはいちばん簡単ですが、登録が必要です。

https://app.quantumcomputing.com/

にアクセスすればいいですが、アカウントの作成は、

https://app.quantumcomputing.com/signup

から。現在はβ運用中で今年製品版が出ます。無料です。こちらは最初からblueqatが入っているのでインストール不要です。

今回はいろいろインターフェイスがリッチなので、3を使ってみます。

全体のコード

今回使うコードはこちらです。

from strangeworks.blueqat import StrangeworksBackend
import numpy as np
from blueqat import Circuit
from blueqat.pauli import X, Y, Z, I
from blueqat.vqe import AnsatzBase, Vqe

class OneQubitAnsatz(AnsatzBase):
    def __init__(self, hamiltonian):
        super().__init__(hamiltonian.to_expr(), 2)
        self.step = 1

    def get_circuit(self, params):
        a, b = params
        return Circuit().ry(a)[0].rz(b)[0]


# Calculate by VQE
h = 1.23 * I - 4.56 * X(0) + 2.45 * Y(0) + 2.34 * Z(0)
runner = Vqe(OneQubitAnsatz(h))
result = runner.run()

print('Result by VQE')
print(runner.ansatz.get_energy(result.circuit, runner.sampler))

# Hamiltonian to matrix
mat = h.to_matrix()

# Calculate by numpy
print('Result by numpy')
print(np.linalg.eigh(mat)[0][0])

ツール読み込み、ansatzの準備、ハミルトニアンの準備、実行となっています。今回はnumpyの計算結果との確認が入ってます。

VQEの定式化

VQEのアルゴリズムは通常簡単に使うことができます。

1、定式化
2、計算

これだけです。定式化は量子ゲートと呼ばれるものを使って計算をします。blueqatの場合、QAOAと呼ばれるアルゴリズムもとても簡単に利用できます。QAOAの方がVQEよりも簡単に使えるように実装されています。今回はVQEを使います。

from blueqat.pauli import X, Y, Z, I

h = 1.23 * I - 4.56 * X(0) + 2.45 * Y(0) + 2.34 * Z(0)

定式化は、パウリ行列と呼ばれる基本の量子ゲートと単位行列を使って実現できます。上記は、

「1量子ビットVQEを世界一簡単に書く 2020年2月Ver.」
https://qiita.com/gyu-don/items/65f830ae3777534f9a04

の例題からですが、IとXとYとZというゲートを使って2*2の行列を作っています。XやYのあとの0という数字は何番目の量子ビットを使うかという通し番号になっています。

量子ビットの通し番号は通常0からスタートします。

ちなみに上記の行列は、

[[ 3.57,   -4.56-2.45j]
 [-4.56+2.45j, -1.11  ]]

となっています。

次は式を登録する

ちょっと難しそうに感じますが、こちらは式の計算の準備です。こちらはコピペしてください。

from strangeworks.blueqat import StrangeworksBackend #quantumcomputing.comを使うときは必要

import numpy as np
from blueqat import Circuit
from blueqat.pauli import X, Y, Z, I
from blueqat.vqe import AnsatzBase, Vqe

class OneQubitAnsatz(AnsatzBase):
    def __init__(self, hamiltonian):
        super().__init__(hamiltonian, 2)
        self.step = 1 #こちらもquantumcomputing.comを使うときに必要

    def get_circuit(self, params):
        a, b = params
        return Circuit().ry(a)[0].rz(b)[0]

最後の1行

Circuit().ry(a)[0].rz(b)[0]

が今回のVQEの式の探索をするためのパラメータの準備です。あまりいい答えが出ないときはこちらを触ったりするとうまくいったりします。

最後に実行と表示

最後にVQEを実行します。

runner = Vqe(OneQubitAnsatz(h))
result = runner.run()

print('Result by VQE')
print(runner.ansatz.get_energy(result.circuit, runner.sampler))

# Hamiltonian to matrix
mat = h.to_matrix()

# Calculate by numpy
print('Result by numpy')
print(np.linalg.eigh(mat)[0][0])

numpyという数値計算ライブラリとの計算の比較をしています。実行してみると、

Result by VQE
-4.450591481563331
Result by numpy
-4.450818602983201

このようにVQEで計算した結果とnumpyで計算した結果がほぼ同じになりました。精度は高い方がもちろんいいですが、問題に合わせて調整をします。精度が高いと時間もかかるので。

quantumcomputing.com

こちらでも実行してみました。今回のサンプルを共有しておきます。

https://app.quantumcomputing.com/public/projects/udFDCw

こちらを実行してもらうと、

スクリーンショット 2020-02-13 8.52.08.png

式の途中にパラメータが使われていて、上記で設定したansatzのパラメータが最適化されて答えが出ています。

Circuit().ry(a)[0].rz(b)[0]

中身を理解するのはちょっと時間がかかるので、とりあえず

1、行列を作る
2、実行して計算をする

を中心に進めました。もっと簡単に説明してくれる記事もそのうち出てくると思うので、楽しみです。

量子ビットを大きくしてみる

今後は量子ビット数を大きくしてみたり、実問題に取り掛かったりという展開が考えられます。量子コンピュータの進歩は日進月歩&ちょっとずつ進むので進捗を確認しながら進めてみたいと思います。

mdrft
量子コンピュータのアプリケーション、ミドルウェア、ハードウェアをフルスタックで開発
https://mdrft.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした