ズッキーニのプログラミング実験場

プログラミング + アカデミック + 何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

   Dec 13

[触ってみた]Microsoft Quantum Development Kit

by zuqqhi2 at 2017年12月13日
Pocket

はじめに

昨日、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はこちらからインストーラーをダウンロードできます。

ちなみに、Quantum Development Kitは.vsixという形式のファイルしか提供されていないので、Windowsで動かす必要があります。

最小構成でも18GBくらいはあるので、インストールには結構時間がかかります。

Quantum Development Kit

このサイトでデモ動画が見れ、ダウンロードページに行くことができます。

量子コンピュータ用の言語は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形式)はダブルクリックすればインストールできます。

これで環境の準備は完了です。

サンプルコードを動かす

インストールが完了したので、早速チュートリアルをやってみます。

プロジェクトの作成

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 ..\packages\Microsoft.Quantum.Development.Kit.0.1.1712.901-preview\build\Microsoft.Quantum.Development.Kit.props.	QSharpApplication1	...\QSharpApplication1.csproj	83

このようなエラーがでたら、以下のページにある設定をしてみてください。私はこれで解決しました。

正しく実行できると以下のような結果が得られます。
この結果はチュートリアルでいうと3回目の実行のアダマールゲートを適用したバージョンです。

アダマールゲートを使うと、0と1の重ね合わせ、しかも両方がそれぞれ1/2の確率で観測できる状態を作ることができます。
なので、ZeroとOneがほぼ同数になっています。ほぼ、というところから、確率になっていることがわかると思います。

チュートリアルを続けるとさらに2Qubitを使ったコードを書くことができます。

おわりに

Q#が想像していたものよりも書きやすかった。

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

Related Posts

Pocket

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です