Microsoft Quantum Development Kitって?
- Microsoftの量子プログラミング用のフレームワーク
- 今週(12/12)リリース
- 後半のスライドは長いのでスライドモードで見ない方がいいかも
内容物
量子プログラミングを行うための環境一揃い
- 量子プログラミング言語 Q#
- シミュレータ
- デバッグ(Visual Studio拡張)
(量子コンピュータの実物はまだ)
量子プログラミング言語 Q#
量子プログラミング言語 Q#
量子ビットを操作する量子デバイスに(古典コンピュータの)コントローラを接続して制御する

量子プログラミング言語 Q#
コントローラは量子デバイスに対し,命令を送ったり測定結果を受け取ったりする

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

簡単な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文を使う
-
-
returnでzero,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メソッドにシミュレータと引数を渡すことで実行できる
実行結果
-
M(x)によってベル状態|00> + |11>から|00>と|11>のどちらか片方が選びだされ,測定結果は0と1がそれぞれ50%ずつ出てくる- 出力の
zeroとoneの比率も大体50:50
- 出力の
- 一方,
|00>と|11>のどちらにせよ1ビット目(x)と2ビット目(y)の値は等しい-
matchは必ず100になる
-
デバッグ(Visual Studio拡張)
- Q#はVisual Studioにシンタックスハイライトがある
- アサーション用の関数がある
- ユニットテストが書けるらしい
- Visual Studioのデバッガに対応
- ブレークポイントをQ#内に挟める
- ステップ実行できる
- 量子ビットの中身を見たりとかは現状無理そう
- 古典アルゴリズム部分のデバッグはできる

