[触ってみた]Microsoft Quantum Development Kit

はじめに

 米Microsoftは11日(米国時間)、量子コンピュータ向けプログラミングを行なうための「量子開発キット(Quantum Development Kit)」プレビュー版を公開した。
Microsoft、量子コンピュータ向けアプリの開発キットを公開 ~新言語「Q#」や量子コンピューティングシミュレータなど - PC Watch
昨日、Microsoftが量子コンピュータ向けの開発・シミュレータ環境(Quantum Development Kit)を提供したというPC Watchのニュース記事を見ました。 何年か前に量子コンピュータの本を読んだこともあって、興味があるので試しに触ってみることにしました。

環境

  • Windows10 Enterprise
  • Visual Studio 2017 Community Edition
  • Quantum Development Kit 0.1.1712.901

インストール

Visual Studio Community Edition

Quantum Development KitはVisual Studioの拡張機能という位置づけなので、Visual Studioが必要です。 ずいぶん久しぶりにVisual Studioを触りますが、今のVisual Studioは現在無償版が存在していて、無償版で拡張機能のインストールもできるようです。なので、これを使います。 無償版のVisual Studioはこちらからインストーラーをダウンロードできます。
Visual Studio Community エディションは無償でご利用いただけます。同じく無償で提供している Express エディションとの違いを確認して、お客様に合ったエディションをご利用ください。
【無償版】Visual Studio の活用法 - Visual Studio - 
ちなみに、Quantum Development Kitは.vsixという形式のファイルしか提供されていないので、Windowsで動かす必要があります。 最小構成でも18GBくらいはあるので、インストールには結構時間がかかります。

Quantum Development Kit

Use the Quantum Development Kit to develop, simulate, and debug your quantum computing solutions.
Quantum Development Kit | Microsoft - Microsoft Quantum - US (English)
このサイトでデモ動画が見れ、ダウンロードページに行くことができます。 量子コンピュータ用の言語はQ#という新しい言語で、それをC#から呼び出す形で実装するようです。 ローカルでは30Qubit(量子コンピュータ上でのビット)、Azure上で40Qubitシミュレートできるようですね。 Qubitというのは、従来のビットが0か1の2状態だったのに対して、Qubitは0、1、そして0と1の重ね合わせという状態を持つことができます。 Qubitの中身を見る(観測)とどの状態であろうが値が0か1かに決まります。重ね合わせ状態のときに観測するとx%で0になり、y%で1になるというように確率で結果が変わります。 一見非常に扱いずらそうですが、表現力は従来のビットの比ではありません。そして、この重ね合わせのおかげで、並列処理をすることができ、それによって少なくとも特定の分野の問題に対して非常に高速に計算することができます。 さて、ダウンロードのボタンを押すと名前などの登録画面が出るので、入力して送信するとMarketplaceのページにたどり着きます。ここでQuantum Development Kitをダウンロードすることができます。 ダウンロードしたファイル(.vsix形式)はダブルクリックすればインストールできます。 これで環境の準備は完了です。

サンプルコードを動かす

インストールが完了したので、早速チュートリアルをやってみます。
Learn how to write a quantum program in Q#. Develop a Bell State application in Visual Studio.
Write a quantum program - 

プロジェクトの作成

Visual Studioを立ち上げたら「File -> New -> Project」という感じでプロジェクトを作成します。
そして以下の画像のように”Q# Application”を選択し、プロジェクトの名前を”Bell”と入力して、OKボタンを押します。
Bell Stateというのを作成するので、Bellというプロジェクト名になっています。 これでプロジェクトの作成は完了です。

1Qubitを作成して観測するところまで

コードとコードの説明等はチュートリアルページにあるので、完成形と結果のみ載せます。
namespace Quantum.Bell
{
  open Microsoft.Quantum.Primitive;

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

  operation BellTest (count: Int, initial: Result) : (Int, Int) {
    body {
      mutable numOnes = 0;
      using (qubits = Qubit[2]) {
        for (test in 1..count) {
          Set (initial, qubits[0]);
          H(qubits[0]);
          let res = M(qubits[0]);

          if (res == One) {
            set numOnes = numOnes + 1;
          }
        }
        Set(Zero, qubits[0]);
      }
      return (count - numOnes, numOnes);
    }
  }
}
using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.Bell {
  class Driver {
    static void Main(string[] args) {
      using (var sim = new QuantumSimulator()) {
        Result[] initials = new Result[] { Result.Zero, Result.One };
        foreach (Result initial in initials) {
          var res = BellTest.Run(sim, 1000, initial).Result;
          var (numZeros, numOnes) = res;
          System.Console.WriteLine(:Init:{initial,-4} 0s={numZeros,-4} 1s={numOnes,-4}");
        }
      }
      System.Console.WriteLine("Press any key to continue...");
      System.Console.ReadKey();
    }
  }
}
コードを実行したときに、
Severity	Code	Description	Project	File	Line	Suppression State
Error		This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..packagesMicrosoft.Quantum.Development.Kit.0.1.1712.901-previewbuildMicrosoft.Quantum.Development.Kit.props.	QSharpApplication1	...QSharpApplication1.csproj	83
このようなエラーがでたら、以下のページにある設定をしてみてください。私はこれで解決しました。
A description of common NuGet restore errors in Visual Studio and how to troubleshoot them.
Troubleshooting NuGet Package Restore in Visual Studio - 
正しく実行できると以下のような結果が得られます。
この結果はチュートリアルでいうと3回目の実行のアダマールゲートを適用したバージョンです。
アダマールゲートを使うと、0と1の重ね合わせ、しかも両方がそれぞれ1/2の確率で観測できる状態を作ることができます。
なので、ZeroとOneがほぼ同数になっています。ほぼ、というところから、確率になっていることがわかると思います。 チュートリアルを続けるとさらに2Qubitを使ったコードを書くことができます。

おわりに

Q#が想像していたものよりも書きやすかった。 量子コンピュータ上でのアルゴリズムがすでにいくつか存在している(ショアの素因数分解など)ので試しに実装してみたいと思った。
zuqqhi2

某Web系の会社でエンジニアをやっています。 学術的なことに非常に興味があります。 趣味は楽器演奏、ジョギング、読書、料理などなど手広くやっています。

Share
Published by
zuqqhi2