Q# 書き方メモ(多分初心者向け)

Q#初心者の自分が躓いたところを忘れないようまとめたものです。まだまだQ#の記事は少ないから少しでも役に立てればなって。ただ、エラーの表示など今後変わる可能性も多いので参考程度に。

インストール

visual studioは最新にしておく。
最新の状態でQ#standard kitインストール完了できれば大体大丈夫。
新規作成してC#の欄のところにQ#の項目がある。

量子操作における定型文

1、元から書いてあるのはoperationとbodyで、bodyの中に構造を書く。
2、using(regi = Qubit[N])で使いたい量子を配列(regi)に持ち込む。
3、letして配列の量子(regi[0])などを量子変数(A)に送り込む。
4、使った量子が一つならばletしたものをReset(A)、二つ以上ならusingした配列をResetAll(regi)する。
5、戻り値を持つならreturnしてあげればよい。

参考
量子は引数として持ち込める。

注意点
量子を用いた場合、必ずResetなどを行わないとエラーが発生する。(コメントアウトをはさむとなぜか回避できるが操作できない)

実数における定型文

1、mutableで通常の変数を扱う。
2、先ほどの変数をsetし、A = A + 1 などの操作を行う。インクリメントは実装されていない。
3、mutable変数はreturnで返すことが出来る。

注意点
毎回setをしないとmutable変数の変更が出来ない。

C#との入出力関係

1、using (var sim = new QuantumSimulator())を用いる。変数simにより起動出来る。
2、C#側から、Q#のどの関数をRunさせたいのかはっきりさせる。
3、var recived = (HelloWorld.Run(sim).Result;)とすることにより、狙った関数から戻り値を受け取れる。tupleもいける。
4、あとはC#の出力を使ってあげればいい。Console.WriteLine($"zero = { couzero} one = {couone}"); など。

注意点
変数simは引数扱いにならない
なので何かC#側から送りたいときは、C#で(sim ,10)とした場合、呼び起こした関数の部分に引数を(cou)と一つ書いてあげればよい

量子操作(最低限)

スピンの確率ベクトル変更(X-gate,Y-gate,Z-gate)
X(qub);
Y(qub);
Z(qub);

重ね合わせ状態などに使える(Hadamard-gate)
H(qub);

観測(measure)
M(qub);

量子もつれの生成(CNOT-gate)
CNOT(qub);

よく使う文法(最低限)

for in
if
else if
else
Reset
ResetAll
などの機能がある
if(M(q)==Zero)やif(M(q)==One)などとかくと0や1の状態の量子の測定が出来る

未確認操作

Qubitを返すとどうなるのかよくわからない
配列などもまだやっていない

よくやるエラー

letするときに0-indexedを忘れる
関数を作る時にbodyを忘れる(関数作ったときに起こるよくわからないエラーは大体これ)

おかしなエラー集

適当なコメントアウトを挟むと、letしたものをResetしなくてもなぜか成り立ってしまう
operation関数からoperation関数を呼び出す場合、空の場合は引数、戻り値を設定してもエラーにならないが、関数内にコメントアウトをはさむと突然エラーする

おしまい。