銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Microsoft Q# Coding Contest warmupラウンドの自分の回答を公開しています

Microsoft Q# Coding Contest warmupラウンドが終了して結果として私は107位でした。自分にとってはたぶんこれが初めてのオンラインプログラミングコンテスト参加だったと思います。

f:id:tanaka733:20180704190050p:plain

また問題も公開されているようです。 codeforces.com

というわけで自分が提出した回答をGitHubに公開してみました。 github.com

問題そのものの解説はすでにあるようなので、

smijake3.hatenablog.com

最初の問題を例にどうやって実行したかを説明してみます。問題としては、状態{|0 \rangle}であるQubit型の引数qと1か-1であるInt型の引数signに与えられ、signが1であればqを{| + \rangle = \frac{1}{\sqrt{2}}(|0 \rangle + |1 \rangle)}、-1であればqを{| - \rangle = \frac{1}{\sqrt{2}}(|0 \rangle - |1 \rangle)}に変化させるoperationを記述するというものです。引数で渡された状態を変化させるため、このoperationは返り値を持ちません。

先日のエントリで書いた通り、QubitはC#のDriverクラスでは生成できないので、もうひとつQ#のoperationを作成し、その中でQubitを生成、operationを実行、実行した結果を確認、という手順を踏みます。というわけで、テスト用のQ#コードはこのようになります。

namespace Solution
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Extensions.Diagnostics;

    operation Test() : () 
    {
        body 
        {
            using (register = Qubit[1])
            {
                let q = register[0];
                DumpMachine("dump-initial.txt");

                Solve(q,-1);
                DumpMachine("dump-0.txt");
                Reset(q);

                Solve(q,1);
                DumpMachine("dump-1.txt");
                Reset(q);
            }
        }
    }
}

usingでQubitを初期化、(必要はないですが)配列のindex0のQubitを変数qとしています。DumpMachineは引数にファイルパスをとって、そのパスにQubitの状態を出力します。Solve operationを実行したあと、DumpMachineで状態を出力、Resetで再度初期化を行っています。DumpMachineの出力結果は次のようになって、期待通りのoperationを記述できたことがわかります。

dump-initial.txt

Ids: [0;]
Wavefunction:
0:  1   0
1:  0   0

dump-0.txt

Ids: [0;]
Wavefunction:
0:  0.707107    0
1:  -0.707107   0

dump-1.txt

Ids: [0;]
Wavefunction:
0:  0.707107    0
1:  0.707107    0

まじめに測定するコードを書いてもいいと思うのですが、デバッグ目的ではDumpMachineがかなり便利でした。 Microsoft Q# Coding Contestの本戦は土曜1時(金曜深夜25時)からなので、W-cup観戦の合間にいかがでしょうか。