37
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

量子コンピュータAdvent Calendar 2017

Day 22

Microsoft Quantum Development Kit および量子プログラミング言語Q#の解説

Last updated at Posted at 2017-12-13
1 / 15

Microsoft Quantum Development Kitって?

  • Microsoftの量子プログラミング用のフレームワーク
  • 今週(12/12)リリース
  • 後半のスライドは長いのでスライドモードで見ない方がいいかも

内容物

量子プログラミングを行うための環境一揃い

  • 量子プログラミング言語 Q#
  • シミュレータ
  • デバッグ(Visual Studio拡張)

(量子コンピュータの実物はまだ)


量子プログラミング言語 Q#

量子コンピュータのコントローラ用言語と考えると分かりやすい
図.png


量子プログラミング言語 Q#

量子ビットを操作する量子デバイスに(古典コンピュータの)コントローラを接続して制御する
図.png


量子プログラミング言語 Q#

コントローラは量子デバイスに対し,命令を送ったり測定結果を受け取ったりする
図.png


量子プログラミング言語 Q#

コントローラの動作をプログラムすることで量子プログラミングする→Q#
(『量子プログラミングの基礎』における古典的制御を持つ量子プログラム)
図.png


簡単なQ#のプログラム

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

    operation MakeBellState(x: Qubit, y: Qubit) : ()
    {
        body
        {
            H(x);
            CNOT(x, y);
        }
    }
}
  • C#とF#の合いの子
  • operationで量子操作を定義する.functionを使えば古典的な関数も定義できる.
  • bodyの中に量子操作を書く.
  • 型は後置(Qubitが量子ビット型,戻り値型が空のタプル型()
  • H(x), CNOT(x, y)と量子ビットに量子ゲートを作用させる
  • この量子操作はベル状態(|00> + |11>)という2つの量子ビットが重ね合わさった状態を作る

少し複雑なQ#のプログラム

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

    operation MeasureBellState(count: Int) : (Int, Int, Int)
    {
        body
        {
            // カウンタ変数の初期化
            mutable zero = 0;  // 測定して0が出た回数
            mutable one = 0;   // 測定して1が出た回数
            mutable match = 0; // 両方の測定が同じ値を返した回数

            // count分試行を繰り返す
            for (step in 1..count)
            {
                // |0>で初期化された量子ビットを2つ確保
                using (qubits = Qubit[2])
                {
                    // 各量子ビットを変数に束縛
                    let x = qubits[0];
                    let y = qubits[1];

                    // 2つの量子ビットをベル状態(|00> + |11>)にする
                    MakeBellState(x, y);

                    // それぞれの量子ビットを{ |0>, |1> }の基底で測定
                    let xResult = M(x);
                    let yResult = M(y);

                    // |0> が出たとき
                    if (xResult == Zero)
                    {
                        set zero = zero + 1;
                    }
           // |1> が出たとき
                    else 
                    {
                        set one = one + 1;
                    }

                    // それぞれの量子ビットから同じ測定結果が得られたとき
                    if (xResult == yResult)
                    {
                        set match = match + 1;
                    }

                    // 量子ビットの解放前に|0>にリセットする
                    if (xResult == One)
                    {
                        X(x);
                    }
                    if (yResult == One)
                    {
                        X(y);
                    }
                }   
            }

            return (zero, one, match);
        }
    }
}
  • 変数宣言はlet(不変)とmutable(可変)
  • 変数の方は初期化子から推論
  • 繰り返しはfor文とrepeat..until
  • using文でクリーンな(|0>で初期化された)量子ビットの確保を行う
    • 量子デバイスに量子ビットを確保するように指示すると考えよう
    • 繰り返し使えるようにするため,使用した量子ビットは解放(using文の終了)前に|0>にリセットする必要がある
  • MakeBellState(x, y);で1スライド前の量子操作を呼び出し,ベル状態を作っている
  • M(x)M(y)が測定操作
    • デバイスに測定を指示し,結果を受け取る
    • 測定結果はResult型でIntではない
  • その後のif文で測定結果に応じてzero, one, matchを更新
    • mutable変数の変更にはset文を使う
  • returnzero, one, matchの3要素からなるタプルを返している

シミュレーション

  • Q#で書いた量子プログラムを.NET上でシミュレーションすることができる
    • 公式ではC#かF#を使っている
    • VB.NETも使える

シミュレーションコード

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())
            {
                var (zero, one, match) = MeasureBellState.Run(sim, 100).Result;
                System.Console.WriteLine($"zero : {zero}");
                System.Console.WriteLine($"one  : {one}");
                System.Console.WriteLine($"match: {match}");
            }
        }
    }
}
  • QuantumSimulatorがシミュレータの.NETクラス
  • Q#のoperationは同名の.NETクラスにコンパイルされ,Runメソッドにシミュレータと引数を渡すことで実行できる

実行結果

2017-12-13_22h10_16.png

  • M(x)によってベル状態|00> + |11>から|00>|11>のどちらか片方が選びだされ,測定結果は01がそれぞれ50%ずつ出てくる
    • 出力のzerooneの比率も大体50:50
  • 一方,|00>|11>のどちらにせよ1ビット目(x)と2ビット目(y)の値は等しい
    • matchは必ず100になる

デバッグ(Visual Studio拡張)

  • Q#はVisual Studioにシンタックスハイライトがある
  • アサーション用の関数がある
  • ユニットテストが書けるらしい
  • Visual Studioのデバッガに対応
    • ブレークポイントをQ#内に挟める
    • ステップ実行できる
    • 量子ビットの中身を見たりとかは現状無理そう
    • 古典アルゴリズム部分のデバッグはできる

デバッガのスクリーンショット

2017-12-13_22h19_46.png


量子プログラミングやっていきましょう!

37
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?