はじめに
こんにちは。
エス・エー・エス株式会社 人材戦略部の須川(すがわ)です。
本記事は、今からおよそ6年前の2017年12月にMicrosoft社から発表された量子コンピュータの言語である「Q#(キューシャープ)」を試したレポートです。
当時2018年6月頃に新しい物好きでミーハーな私は「これが未来や!」、と意気込んで試したのですが、その後使う機会もなく、見事に忘れてしまいました。
業務で使う分野もほぼなく、量子コンピューターの普及も当時の盛り上がり程に進んでいないこともあり、仕方ない部分もあるのですが、せっかくなので復習がてら、基礎から再び始めていこうと思います。
因みに、本言語は「Q言語」と呼称することもあるようですが、Q言語だと某日立製とかぶっていることもあり、私は一貫して「Q#」と記載させていただきます。
Q#と、その動かし方
前述の通りですが、「Q#」とは量子アルゴリズムを表現するためにMicrosoft社によって開発されたドメイン固有言語になります。
Q#を使い量子コンピューター特有の様々な挙動を確認する方法はいくつか用意されています。
- Q#スタンドアロンによる実行
- Q#と .NET言語の組み合わせにより、Q#を実行
- IQ#カーネルを使い、Jupyter Notebookから、Q#を実行
また、実行環境もローカルマシンで実行する方法と、Azure Quantumを用いたリモートマシンでの実行する方法の2種があります。
ローカルマシン上で動かす場合、量子コンピューター上の挙動は全てシミュレーションになりますので、実際には量子コンピューターでの挙動ではありません。
一方で、Azure Quantumを用いる場合には、ジョブを現存する量子コンピューターに対し、演算を要求することができ、実際に量子コンピューターが演算した結果を得ることができます。
しかし、これには当然量子コンピューターリソースを利用したことによる使用料金がかかります。
普及のためか、Microsoft社は初めて使用するユーザーには$500のAzure Quantumクレジットを配布しており、これを使うことで$500分まで実質的に無料で使用可能です。
なお、Azureアカウントの種別により、無料で使用するための条件には若干の違いがありますし、時間の経過とともにプランが変わる可能性があります。もし、これからやってみようと考えている方は、その都度Microsoft社のドキュメントを読むことを忘れないようにしてください。(Azure Quantum ワークスペースを作成する - Azure Quantum | Microsoft Learn)
Azureへのアクセス
今回はAzure Quantumへアクセスし、Microsoft社から頂いた無料分の$500を使って、実際に量子コンピューターを動かしてみたいと思います。
以前はQDKをダウンロードしてローカルマシンで動かしていたので、Azureへアクセスする為に、新しくアカウントを作ります。(既にAzureアカウントを持っている場合は、そのままログインしてください)
メールアドレスを登録し、必要な諸情報を入力、アカウントの新規登録を行います。
プロフィールとカード情報も入力を求められます。
それらを全て入力したら、サインアップボタンから、アカウントを作成します。
Azure Quantumワークスペースの作成
サインアップ完了後、Azure Portalへアクセスします。
Azure Portalから、リソースの作成を選択します。
検索ボックスに「Azure Quantum」と入力し、リソースを検索。
Azure Quantumというリソースが見つかるので、これを作成します。
Azure Quantumの概要説明が表示されますので、再度作成を選びます。
プランは現時点では1つしかありません。
ワークスペース作成時、「簡易作成」と「高度な作成」を選ぶことができますが、今回は「簡易作成」を選び、推奨設定で進めていきます。記載されている通り、ワークスペースに関する設定は後から変更する事が可能です。
ワークスペース名に「QuantumTestProject」と入力し、リージョンは「Japan East」を選択しました。
(ワークスペース名は重複が許されないようです)
作成を押下すると、ワークスペースのデプロイが始まります。
デプロイはちょっと時間がかかり、私が実施した時は、だいたい10分程かかりました。
NotebooksからQ#を実行
デプロイが完了後、コードを実行する為、Notebooksにサンプルコードをコピーします。
操作→Notebooks→Sample galleryを選択し、その中にある「Hello, world: Q#」を探します。
Copy to my notebooksというボタンがあるので、これを押下するとMy notebooks(自分の作業スペース)へコードをコピーしてくれます。
これでサンプルコードを実行する準備は整いました。
あとはコピーされたHello, world:Q#のノートブックを開き、サンプルコードを実行してみます。
全てのコードを記載してしまうと長くなりますので、割愛しますが、最後の結果だけを見てみます。
結果は「0」と「1」が同じ数だけ生成されているようです。
サンプルコードは何をしている?
今回実行したコードは「量子乱数生成ジェネレーター」になります。
量子コンピューターにおける量子ビットとは”重ね合わせ(英:Coherence)”に入る事のできる情報単位、と定義されています。
量子ビットは通常のビットと大きく違う点があり、それがまさにこの”重ね合わせ”になります。
通常、ビットという情報単位は「0」または「1」ですが、量子ビットは「0」、「1」、「0と1」という3つの状態をとることが可能です。
この最後の「0と1」という状態を”重ね合わせ”と呼びます。(厳密には”0と1の重ね合わせ”と呼称するのが正しい様です)
今回のサンプルコードは、量子ビットを「0と1」という重ね合わせの状態にし、「0」と「1」の両方を等しい確率で測定する可能性を持たせています。
これにより、測定前の段階では「0」と「1」のどちらとして測定されるかは分かりませんが、等しい確率でどちらを測定する可能性もあり、「0」と「1」は常に半々(1:1)の確率で読み取られます。
つまり、0が測定される可能性が50%、1が測定される可能性も50%です。
この特性を利用して「0」と「1」のどちらかの値をランダムに生成する、という乱数ジェネレーターになっているわけです。
そして、結果は見事に、50%ずつ「0」と「1」に分かれています。
結果だけを見てしまうと、何が行われて、何が量子コンピューターを使って得た結果なのかが、分かりにくいのが難点ではあります。
なお、量子コンピューターや量子ビットに関する原理・定義に関し、詳細な解説を求められる方は、専門の書籍を購入し、学ばれることを強く推奨いたします。
次のステップ
Microsoft社ではAzure Quantumを使用した様々な学習メニューを用意してくれています。
今回はサンプルコードを動かせる状態へ進める事、そしてサンプルコードの実行とその解説を確認する事が主な目標でした。
次はもう一歩進んで、バイナリ最適化の問題について取り組み、用意されたサンプルや課題を確認しながら進めてみたいと思います。