チュートリアル Single-Qubit Gates解答例

Githubリンク
https://github.com/microsoft/QuantumKatas/tree/master/tutorials/SingleQubitGates

(いきなりこのページに飛んできた人で最初から勉強されたい方はこちらをご参照ください)

このチュートリアルは実際にQ#を使ってQubitの値を操作していきます。古典コンピュータで言うAND, OR, ビットシフトみたいな位置づけだと思いますが、古典コンピュータよりもけっこう複雑ですね。

Exercise 1: The  𝑌  gate

α|0> + β|1>にYゲートを適用します。
これはそのままですね。戻り値はUnitなので何も戻す必要がありません。

%kata T1_ApplyY_Test

operation ApplyY (q : Qubit) : Unit is Adj+Ctl {
    Y(q);
}

Exercise 2: Applying a global phase  𝑖

これも実は本チュートリアルにあるDemoの動き通りですね。
XYZゲートの動きをきちんと理解しましょう。
%kata T2_GlobalPhaseI_Test

operation GlobalPhaseI (q : Qubit) : Unit is Adj+Ctl {
    X(q);
    Z(q);
    Y(q);
}

Exercise 3*: Applying a  −1  phase to  |0⟩  state

XYZゲートの動きを理解して、何を組み合わせれば目的のα=-1とβ=1を導けるかを考えます。
%kata T3_SignFlipOnZero_Test

operation SignFlipOnZero (q : Qubit) : Unit is Adj+Ctl {
    X(q);
    Z(q);
    X(q);
}

Exercise 4: Preparing a  |−⟩  state

前回のQubitで紹介しましたが\( i = \ e^{i\pi/2}  \)なので、Sゲートは\( \pi/2 \)ずつPhaseをずらしていきます。順に適用していくと |+> ⇒ |-> ⇒ |i> ⇒ |-i> ⇒ |+> という順に状態が変化します。こちらを理解していれば簡単です。
まずは|0>から|+>を作るためにHゲートを使用し、あとはシフトさせていきます。
%kata T4_PrepareMinus_Test

operation PrepareMinus (q : Qubit) : Unit is Adj+Ctl {
    H(q);
    S(q);
    S(q);
}

Exercise 5: Three-fourths phase

Phase Shiftゲートの動きを理解しましょう。
%kata T5_ThreeQuatersPiPhase_Test

operation ThreeQuatersPiPhase (q : Qubit) : Unit is Adj+Ctl {
    S(q);
    T(q);
}

理論上は下記でも同等です。
\[ e^{i\pi/4} = \frac{1}{\sqrt{2}} + \frac{i}{\sqrt{2}} \\ e^{i\pi/2} = i \\ e^{i\pi} = -1 \\ e^{2i\pi} = 1 \]
であることを考えると、Tゲート2回とSゲート1回が同等となります。
%kata T5_ThreeQuatersPiPhase_Test

operation ThreeQuatersPiPhase (q : Qubit) : Unit is Adj+Ctl {
    T(q);
    T(q);
    T(q);
}

Exercise 6: Preparing a rotated state


回転系のGateに入って少し雰囲気が変わりますが、R系のGateの定義をきちんと読めばそれほど難しくありません。|0>から目的の\( \alpha|0\rangle -i\beta|1\rangle \)を作り出すためには\( R_x() \)を使います。
今回初めてQ#での変数の代入処理が発生しますが、チュートリアルに書いてある通り、
let num = function();
という形で代入することができます。

%kata T6_PrepareRotatedState_Test

open Microsoft.Quantum.Math;

operation PrepareRotatedState (alpha : Double, beta : Double, q : Qubit) : Unit is Adj+Ctl {
    let theta = ArcTan2(beta, alpha) * 2.0;
    Rx(theta, q);
}

Exercise 7**: Preparing an arbitrary state


次は回転系のゲートの組み合わせです。R系ゲートの定義をきちんと読めば\(R_y\)と\(R_1\)の組み合わせで実現可能なことがわかります。
\( \beta = \sqrt{1 - \alpha^2} \)という書き方をしていますが、\( \alpha^2 + \beta^2 = 1 \)と同義ですよね。何かのヒントなのかもしれませんが意図が理解できてません。

%kata T7_PrepareArbitraryState_Test

open Microsoft.Quantum.Math;

operation PrepareArbitraryState (alpha : Double, beta : Double, theta : Double, q : Qubit) : Unit is Adj+Ctl {
    let theta1 = ArcTan2(beta, alpha) * 2.0;
    Ry(theta1, q);
    R1(theta, q);
}