Q# 基礎
Ver1.1 2018/11
@tanaka_733 https://www.tanaka733.net
変更履歴
Version 公開日 主な変更点
1.0 2018/10/30 初版
1.1 2018/11/05 Quantum Development Kit 0.3に対応
この資料について
Q#で初めて開発する人向けに、
いくつかの勉強会での発表資料をひとつにまとめました
目次
◦ Q#入門
◦ Q#の主なOperation
◦ もっとQ#を勉強するために
Q#入門
この章は先週の別の勉強会の資料の抜粋です
https://www.slideshare.net/tanakata/q-117200034
量子コンピューターモデル
Q#とは
量子コンピューティングのためのスケーラブルでマルチパラダイムでドメイン特化した言語
◦ 関数型と命令型のマルチパラダイム
文法的にはC#やJavaに似たような構造
◦ F#およびほかの関数型言語のキーワードも導入している
量子機械の上での操作を記述できる
◦ 抽象化の度合いや、シミュレーターから実機まで幅広く対象とする
◦ 数百Qubit程度の小さいマシンから百万Qubitオーダーまで対象とする (実機がまだ存在しないが)
デバッグやプロファイル、利用リソースの推定や特定の目的のためのシミュレーション実行など
幅広く対象としている
https://docs.microsoft.com/en-us/quantum/quantum-techniques-1-
qsharp_filestructure?view=qsharp-preview
Q#開発の準備
Visual StudioかVisual Studio CodeがエディタとしてQ#をサポート
エディタ支援が不要であれば、.NET Core CLI+好きなエディタでもOK
必要なもの
◦ .NET Core が動くOS
◦ 初期のQ#では新し目のCPUが必須だったが、今はOK
◦ Q#開発キット
◦ 開発キット自体は.NET Coreのクラスライブラリ形式でプロジェクトに追加されるので、
実際には.NET Coreプロジェクトのテンプレートをインストールする
◦ Visual Studio or Visual Studio Code (option)
◦ それぞれエディタの拡張機能が提供されれている
https://docs.microsoft.com/en-us/quantum/quantum-
installconfig?view=qsharp-preview&tabs=tabid-vs2017
Quantum Development Kitの
バージョンアップ
プロジェクトテンプレートのアップデート
Visual Studio / Visual Studio Code 拡張機能の更新
◦ それぞれのツールの拡張機能のメニューから更新
既存プロジェクトの更新
◦ Migration の手順に従う
◦ https://docs.microsoft.com/en-us/quantum/relnotes/0.3-migration?view=qsharp-preview#Migration
◦ PowerShell スクリプトが提供されているのでそれを実行してもよい
◦ https://docs.microsoft.com/en-us/quantum/relnotes/0.3-migration?view=qsharp-preview#MigrationScript
dotnet new -i "Microsoft.Quantum.ProjectTemplates::0.3.1810.2508-preview"
はじめてのQ#プロジェクト
https://docs.microsoft.com/en-us/quantum/quantum-
writeaquantumprogram?view=qsharp-preview&tabs=tabid-vs2017
$ dotnet new console ¥
-lang Q# --output Bell
Visual Studioの場合は
Q#プロジェクトテンプレートを選択
Visual Studio Codeやそのほかのエディタでは
.NET Core CLIのコマンドで作成
Q#プロジェクトの構造
すべてのファイルを表示
Q#ソースファイル (qs)
エントリポイント(Mainメソッド)を持つ
C#ソースファイル
Q#コンパイルコマンド結果
Q#ソースをC#にコンパイルした
中間ファイル(g.cs)
Q#コンパイルコマンド詳細
Q#ソースのコンパイル
qsファイル
g.csファイル
dll
Q#開発キットでインストールされるバイナリを利用して
dotnet qsc.dll … でコンパイル
通常のC#プロジェクトとしてコンパイル
0.3よりコード変更のたびにQ#のビルドが
行われるので、リアルタイムで反映される
Q#プロジェクト Internal
作成されたプロジェクトは普通のC#プロジェクトにQ#SDKが参照されているもの
◦ .NET Core 2.0 (netcoreapp2.0)
Q#のソースはC#(g.cs)にいったんコンパイルされる
◦ WPFとかSilverlightのXAMLやASP.NETのcshtmlと同じイメージ
◦ ただし、プロジェクトのビルド時にしかビルドされない (コード編集中に自動ビルドされない)
◦ NuGetで配られる microsoft.quantum.development.kit の中にビルド定義があり、
プロジェクトのビルド時にトリガーされる == .NET Core標準の仕組みを利用
0.3よりQ#のコード支援機能が提供されるようになった
というのを頭に入れておくと、Q#コード書くときに(C#との感覚の違いがわかって)便利かも
Q#の文法 - ファイル構造
以下、記載のコードはQ# documentから引用
および一部改変
https://docs.microsoft.com/en-us/quantum
Q#の文法 - ファイル構造
名前空間の定義
他の名前空間の参照 (C#のimport)
Operationの定義
Operationの引数
Operationの返り値の型
OperationとFunction
Operation: 量子操作。副作用を伴う。 Function: 量子操作を行わない数値計算
voidに相当
組み込み済みの型については後で
Operation内部のbodyは書かなくて
よくなりました (0.3からの変更)
3種類の制御構文
◦ if…elif…else 文
◦ elseじゃなくてelif
◦ forループ
◦ C#のforeachに相当
◦ ループの変数を事前に定義する必要なし
◦ repeat-untilループ
◦ 今回は省略
◦ Do-while文で、条件判定に複数の文が
記述できるイメージ
◦ 「当たるまで引けば当たる」
repeat-until (RUS)
First-Class Valueとしての
OperationとFunction
OperationやFunctionそのものを引数や返り値にできる
◦ 関数ポインタあるいはAction<T>, Function<T>なイメージ
◦ 見た目はラムダ式っぽい
OperationやFunctionの部分適用
引数に _ を指定することで、部分適用された関数を定義でき、関数の返り値にもできる
ローカル変数(letとmutable)
letもしくはmutableで定義。letは変更不可、mutableは可能な変数に使う。
ローカル変数(letとmutable)
letもしくはmutableで定義。letは変更不可、mutableは可能な変数に使う。
C#のvarと同じく
右辺の型推論で
変数の型が決まる
配列をmutableで宣言すると要素もmutable
For文のindexは変数宣言不要
+=は使えない
ローカル変数(タプル)
任意のタプルに名前を付けて新しい型として定義できる
型モデル
Primitive
◦ Int 2, -107, 49 (64bit)
◦ Double 0.0, -43.2, 5e-7
◦ Bool true, false
◦ Pauli PauliI, PauliX, PauliY, PauliZ
◦ Result Zero, One (測定結果を表現)
◦ Range 1..10, 5..-2..1 (start..step..end なので 5,3,1)
◦ String “qsharp” (ログメッセージに利用)
◦ Qubit
Tuple (Int, (Qubit, Qubit))
配列 [1; 4], new Int[13]
Operation & Function型
ユーザー定義型 newtype Complex = (Double, Double);
C#でいう暗黙的な型変換はない。
Microsoft.Quantum.Extensions.Convert 以下
のFunctionを使って明示的に変換しないといけない
Qubitの割り当て
usingブロックを利用 (C#のusingと同じイメージ)
Qubitの割り当て
usingブロックを利用 (C#のusingと同じイメージ)
5個のQubitを |0> で初期化
➔ |00000>
この変数も事前の定義不要
usingを抜ける際にQubitは
リセットされないといけない。
測定もしくはリセットする
Qubitの操作
bool配列と初期化されたQubit配列を受け
取って、i番目の要素がtrueであればQubit
を|1>に変化させるOperation
Qubitの測定
Qubitの測定
ログとデバッグ
ログとデバッグ
メッセージを出力
デフォルトではコンソールに出力
生成された全量子ビットの状態を出力。
引数にファイル名指定。
空文字指定でコンソールに出力
処理の失敗
例外スローに似ている
string interpolationもOK
$”start {i}”
C#側のコード
現状シミュレーターのみが利用可能。
Q#のOperationがクラスとして参照できるので、Runで実行しTask<T>を取得する
Q#の主なOperation
主な量子ゲート操作のQ#での書き方
https://en.wikipedia.org/wiki/Quantum_logic_gate
Hadamardゲート
q
https://docs.microsoft.com/ja-jp/qsharp/api/prelude/microsoft.quantum.primitive.h?view=qsharp-preview
PauliX,Y,Zゲート
q
回路記号はPauliXゲート。 NOTに相当
https://docs.microsoft.com/ja-jp/qsharp/api/prelude/microsoft.quantum.primitive.x?view=qsharp-preview
Phase Shiftゲート
R1 Operationを使えばよい。
特に、π/4のときのTゲートと、
π/2のときのSゲートは用意されている。
Q#にはPauliX,Y,Z,I軸いずれかの指定した軸まわりに
指定した角度だけ回転できるR Operationがあり、
R1 OperationはR Operation2つで書き換えられる。
https://docs.microsoft.com/en-us/qsharp/api/prelude/microsoft.quantum.primitive.r1?view=qsharp-preview
https://docs.microsoft.com/en-us/qsharp/api/prelude/microsoft.quantum.primitive.r?view=qsharp-preview
https://docs.microsoft.com/en-us/qsharp/api/prelude/microsoft.quantum.primitive.t?view=qsharp-preview
https://docs.microsoft.com/en-us/qsharp/api/prelude/microsoft.quantum.primitive.s?view=qsharp-preview
SWAPゲート
https://docs.microsoft.com/ja-jp/qsharp/api/prelude/microsoft.quantum.primitive.swap?view=qsharp-preview
q1
q2
Controlledゲート
control
target
CNOTと隣のControlled Xは同じ
CNOTについては専用のOperationがあり、
Controlledをつけると任意のcontrolledなOperationが
第一引数のQubit[]を制御Qubitとして呼び出せる
https://docs.microsoft.com/ja-jp/quantum/quantum-qr-typemodel?view=qsharp-preview#functors
Toffoli (CCNOT)ゲート
control1
target
control2
https://docs.microsoft.com/ja-jp/qsharp/api/prelude/microsoft.quantum.primitive.ccnot?view=qsharp-preview
Controlledの制御ビットは複数指定できるので、
CCNOTはControlled Xを使っても記述できる
もっとQ#
Quantum Katas
ハンズオンに使われたチュートリアル集
◦ https://github.com/Microsoft/QuantumKatas
Step by Step ですぐに自分の答えがあっているか確認できる
答えもついている。
参考リンク
Microsoft Quantum
◦ 公式ページ: https://cloudblogs.microsoft.com/quantum/
◦ Quantum Development Kit: https://www.microsoft.com/en-us/quantum/development-
kit
◦ 開発用ドキュメント: https://docs.microsoft.com/en-us/quantum/?view=qsharp-preview
Q# Coding Contest
◦ 告知ブログ http://codeforces.com/blog/entry/60209
◦ Warmup round http://codeforces.com/contest/1001
◦ 解説 https://assets.codeforces.com/rounds/997-998/warmup-editorial.pdf
◦ 本戦 http://codeforces.com/contest/1002
◦ 解説 https://assets.codeforces.com/rounds/997-998/main-contest-editorial.pdf
◦ Introduction to Quantum Oracle http://codeforces.com/blog/entry/60319
参考リンク
Q#の設計を学術的に知りたい人向け
◦ Q#: Enabling scalable quantum computing and development with a high-level domain-
specific language
https://www.microsoft.com/en-us/research/publication/q-enabling-scalable-quantum-
computing-and-development-with-a-high-level-domain-specific-language/
◦ Programming Quantum Computers Using Design Automation
https://www.microsoft.com/en-us/research/publication/programming-quantum-
computers-using-design-automation/
MRFの学術的背景を知りたい人向け
◦ https://www.nature.com/articles/nature11971
◦ http://case.edu/mrf/
◦ Magnetic resonance fingerprintingとその最新動向 :
http://www.innervision.co.jp/sp/ad/suite/siemens/technical_notes/1511techinfo
◦ 最新の高速撮像技術─fingerprinting─:
http://www.innervision.co.jp/ad/suite/siemens/technical_notes/160976

Q#基礎 ver1.1