量子プログラミング入門→量子コンピューティングサービス構築入門

量子コンピューター初心者の筆者が日々学びながら、量子コンピュータ上で量子プログラミングできるようなるまでの学習日記を記録していきます。 内容は量子コンピューター入門者向けで、専門家の方からするとおかしな内容があるかもしれません。その際はコメント等でお知らせください!

量子コンピュータ・量子プログラミングを学習していると普段聞きなれない英単語がよく出てきます。
こちらにそれらの英単語や表現を順次メモしていきます。


superposition 重ね合わせ
quantum entanglement 量子もつれ
bell states ベル状態
complex number 複素数
real number 実数
imaginary Number 虚数
Matrix Inversion 逆行列の生成
Complex Conjugate 複素共役
modulus 絶対値
Imaginary Exponents 虚数の指数
calculus 微積分
polar coordinates 極座標
Inner product 行列の内積
Normalized vectors 単位行列
Outer product 行列の外積
Eigenvalue 固有値
Eigenvector 固有ベクトル



Microsoft Q# (qsharp)とは


Q# (キューシャープ) は、量子コンピューターのためにマイクロソフトが開発した、プログラミング言語です。古典コンピュータ上のホストプログラムから量子コンピュータ上で実行されるサブルーチンを呼び出す形で使用される量子プログラミング言語です。 Q#は量子シミュレーターが実装されており実際の量子コンピュータを使わなくても量子プログラミングを始めることができます。

Microsoft Quantum Katasとは

Quantum Katasはマイクロソフトが作成した量子コンピューティングとQ#プログラミングを学習するためのチュートリアルです。Github上で問題や解答、Jupyter notebookが公開されており、量子プログラミングに必要な基礎知識からQ#を使ったコーディングまで習得できるように構成されています。
https://github.com/microsoft/QuantumKatas

The Quantum Katas are a series of self-paced tutorials to help you learn quantum computing and Q# programming.

QuantumKatasはTutorialやKatasなどから構成されており、歴史的にはKatasのほうが古いですが、Tutorial(チュートリアル)から始めることで、量子プログラミングに必要な数学的基礎知識から習得することができます。
チュートリアルのメニューは以下です。数学の基礎的な知識から入るのでこれから量子プログラミングを始めるとい自分のような超初心者にもちょうどいい感じです。逆に言うと数学的な基礎知識がないと現時点では量子プログラミングを学ぶのは難しいです。ただこれらの数学は普段は見慣れないのでとっつきにくいところもありますが、論理的にはそれほど難しいものではないので、順を追ってしっかり学習していけば問題ありません。


Quantum Katasを動かすための環境設定

Quantum Katasをonline動かす

一番手っ取り早いのが、こちらのリンクから動かすことです。
ちょっと使いづづけてないとすぐにセッションが切れてしまいますが、環境を自分で用意しなくてよいので非常に便利です。

Quantum Katasを自分のJupyterで動かす

jupyterインストール&起動

Katasのチュートリアルを動かすためにはjupyter notebookが必要です。
自分でJupyterを動かす場合は、こちらを参考にAnacondaをインストール

gitからクローン


自分で動かす場合、下記コマンドでQuantumKatasをJupyterから見えるフォルダにクローンしてきます。
git clone https://github.com/microsoft/QuantumKatas.git


チュートリアルは
QuantumKatas/tutorials
にあります。

スクリーンショット (31)
ではこれから学習を始めていきたいと思います。

11月のMicrosoftのAzure Quantumに続いてAmazonも量子コンピューティングサービスAmazon Braketを発表しましたね。

https://aws.amazon.com/jp/blogs/aws/amazon-braket-get-started-with-quantum-computing/

Amazon Braket – A fully managed service that allows scientists, researchers, and developers to begin experimenting with computers from multiple quantum hardware providers in a single place.

Amazon Braketはフルマネージドな科学者、研究者、開発者が複数の量子コンピューターを使って1か所で実験することができるサービスです。

量子分野では出遅れ感が否めなかったAmazonですが、今回発表ではD-WaveやRigettiといった古参量子コンピューターベンダーと組むことで挽回を狙ってるように見えます。IONQはAzure Quantumに続いてダブル参戦ですね。

IBM, Google, Microsoft, Amazonと現在の主要クラウドサービスベンダー(プラットフォーマー)がそろって次世代のプラットフォームの競争に参戦した感じです。いよいよ量子コンピューティング市場も本格的に熱くなってきました。

基本的な量子処理を動かしてみる

MS QDKのQuickstartsにある「 Quantum basics with Q#」で量子コンピュータの基本的な処理を動かしてみる。今回は、量子コンピューティングの学習というよりもQ#の文法の勉強の要素が強い。

Q# Operationの定義

Q#のOperationは量子サブルーチンで、外部から呼び出し可能な量子操作です。
引数は()内にタプル型で定義され、戻り値はコロンの後に定義します。
下記のソースの例で言うと、
Q#のoperationの引数はタプルで宣言され、"Set"の引数は、Result型のdesiredとQubit型のq1のタプル、戻り値は引数の後ろにコロン(:)を付けて宣言されUnit型です。
Unit型はvoid型みたいなものと考えていいようです。

namespace Quantum.Bell {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;

    operation Set(desired : Result, q1 : Qubit) : Unit {
        if (desired != M(q1)) {
            X(q1);
        }
    }
}

Setオペレーション についての解説

Setオペレーションは量子ビットを観測し、期待値と異なれば反転させる量子オペレーションです。(関数と言ってはいけない?量子オペレーション?)
量子ビットは実際には中間的な値を取っているのですが、観測時は0か1にしか見えないもので、反転とは0を1に、1を0にする操作を意味します。

Setの入力はResult型のdesiredです。Result型とは量子ビットを観測した時に読める値のことで、取りうる値はZeroかOneです。Q#で使えるデータの型についてはこちらを参照

M()は量子ビットの値を観測するQ#の量子オペレーションです。
X()は量子ビットを反転させるQ#の量子オペレーションです。
今回はこのM()とX()を動かすことがメインのテーマですが、サンプルコード通りにやらされてる感は満載です...

実際に動かしてみる


先ほどのSet Operationにテストコードを追加し実際に動かしてみる。
テストプログラムは期待値0と1それぞれで1000回 Set Operationを動かして
期待値をきちんと返すかを確認するプログラムです。
Bell.qsというファイル名で下記を作成
namespace Quantum.Bell {                                                                                                    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;

    operation Set(desired : Result, q1 : Qubit) : Unit {
            if (desired != M(q1)) {
                    X(q1);
            }
    }

    operation TestBellState(count : Int, initial : Result) : (Int, Int) {
        mutable numOnes = 0;
        using (qubit = Qubit()) {
            for (test in 1..count) {
                 Set(initial, qubit);
                 let res = M(qubit);
                 // Count the number of ones we saw:
                 if (res == One) {
                     set numOnes += 1;
                }
            }
            Set(Zero, qubit);

            // Return number of times we saw a |0> and number of times we saw a |1>
            return (count-numOnes, numOnes);
        }
    }
}
host.pyというファイル名で下記を作成

import qsharp

from qsharp import Result
from Quantum.Bell import TestBellState

initials = (Result.Zero, Result.One)

for i in initials:
    res = TestBellState.simulate(count=1000, initial=i)
    (num_zeros, num_ones) = res
    print(f'Init:{i: <4} 0s={num_zeros: <4} 1s={num_ones: <4}')

下記コマンドを実行し動作確認
$ python host.py
Preparing Q# environment... ..Init:0 0s=1000 1s=0 Init:1 0s=0 1s=1000
初期値が0なら0(期待値)を100%(1000回)観測
初期値が1なら1(期待値)を100%(1000回)観測

コピペなんでちゃんと動きますよね。


Microsoft Quantum Development Kit環境構築

ゲート型量子コンピュータのプログラミング環境としてMicrosoftがプログラミング言語Q#とその開発キットQDK(Quantum Development Kit)を提供しています。 ゲート型のプログラミングの学習環境としてまずはAzure QuantumのQ#/QDK環境を構築したいと思います。

ここではMSのQDKインストール手順に従って環境構築を実施していきます。 https://docs.microsoft.com/en-us/quantum/install-guide/index?view=qsharp-preview#develop-with-jupyter-notebooks

MS QDK環境構築のための必要パッケージ

Q#/QDKを動かすためにはPythonまたはC#などの.Net言語環境が必要です。 自分の場合はC#よりもPythonのほうがなじみがあるのでPython環境を構築していきます。

MS QDKをPythonで動かすためには下記の環境が必要

  • Python 3.6 or later
  • The PIP Python package manager
  • .NET Core SDK 3.0 or later

ベース環境の構築

自分は普段はWindowsで作業するのですがPython等のプログラミングとなると Windowsはちょっと不便なところもあるのでubuntuの環境を用意したい。 Azure上に構築しようかと考えましたが、Windows Subsystem for Linux(WSL)で Ubuntuが一番お手軽に構築できそうなのでWSL上に環境構築しました。

Window Subsystem for Linuxの有効化とUbuntuのインストール

設定から"アプリ"を開く。
スクリーンショット (5)

右側のメニューから"プログラムと機能"をクリック


スクリーンショット (6)

左のメニューから"Windows機能の有効化または無効化を"クリック

スクリーンショット (7)

Windows Subsystem for Linuxにチェックを入れる。
(再起動が必要)
スクリーンショット (8)
スタートメニューから"Microsoft Store"を起動し、"Ubuntu"を検索しインストール。
スクリーンショット (11)



Host Application環境の構築 (Python環境)

ubuntuの起動と更新

スタートメニューからubuntuを起動 端末から下記のコマンドを実行

sudo apt update
sudo apt -yV upgrade

ubuntuの再起動

WSL上のUbuntuではshutdownコマンドが使えません。Ubuntuのアップデートを有効にするためWindows側からWSLのUbuntuを再起動させます。

スタートメニューからWindowsシステムツール-> コマンドプロンプトを右クリック->その他から管理者として実行

管理者として開いたコマンドプロンプトで下記のコマンドを実行

net stop LxssManager
net start LxssManager

Pythonとpipのインストール

git, cmake, wget, p7zip-full のインストール

bash上で下記コマンドを実行

sudo apt -yV install git cmake cmake-curses-gui cmake-gui wget p7zip-full

Anaconnda3のダウンロードとインストール

Anacondaは入れる必要はないが、jupyter notebookが使えた方が便利な場合があると思いインストール

ホストのWindowsからAnaconda(Linux版)を下記からダウンロード https://www.anaconda.com/download

WindowsとWSL上のUbuntuは下記フォルダを共有しています。

  • Windows側: C:\Users\ユーザー名
  • WSL(Ubuntu)側: /mnt/c/ユーザー名/

ダウンロードしたファイルをこの共有フォルダに移動するとWSL側から利用することができます。
共有フォルダに移動し下記コマンドを実行。(ダウンロードする版数によりコマンド名は異なります)

Anaconda3-2019.10-Linux-x86_64.sh

途中いくつか入力が必要なので内容を確認し適切に入力

Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no]

PATH環境変数の更新が入ってるので、それを反映させるためいったん端末を閉じて、再度Ubuntuを起動 Pathが変わる。

user@hostname$ which python
/usr/bin/python
(base) user@hostname:~$ which python
/home/user/anaconda3/bin/python
(base) user@hostname:~$

.NET Core SDKのインストール

下記リンクから.NET Core SDK(Linux版)(Build/Run Appsと書いてあるやつ)を選択 https://dotnet.microsoft.com/download 自分の場合はUbuntu 18.04なので左のメニューから下記リンクにジャンプ https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-package-manager-ubuntu-1804


スクリーンショット (29)


ubuntu上で下記コマンドを実行

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-3.0

MS QDKのインストール

qsharpパッケージのインストール

pip install qsharp

iqsharpパッケージのインストール

dotnet tool install -g Microsoft.Quantum.IQSharp

.NET有効化のためいったん端末を閉じて再度新しい端末を開く

MSのページには--userオプション無しで書いてあるがWSL環境のせいか--userを付けないとうまく入らない

dotnet iqsharp install --user

環境構築完了!

TutorialにあるHello Worldサンプルコードを動かしてみる

MSページからのコピペなので中身はよくわからないがとにかく動かしてみる

まずQ#のコードを作成。Hello from quantum worldを表示するSayHello() Operationの定義
Operation.qsというファイル名で下記のコードを作成

namespace HelloWorld
{
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;

    operation SayHello() : Result {
        Message("Hello from quantum world!");
        return Zero;
    }
}

SayHello()を呼び出すためのPythonプログラムをhello_world.pyというファイル名で作成

import qsharp
from HelloWorld import SayHello
SayHello.simulate()

下記コマンドを実行(Pathが通るように、Operation.qsとhello_world.pyを同じフォルダに置きそのフォルダで実行する)

$ python hello_world.py
Preparing Q# environment...
....Hello from quantum world!

けっこう時間がかかるがきちんとメッセージが表示される。環境は構築できHello Worldは表示されるところまでは来たのでここからしっかりとQ#/QDKについて学習していきます。

↑このページのトップヘ