https://codeforces.com/contest/1356/problem/B1
$N$ qubitの量子状態がLittleEndianで与えられるので、状態を${\rm mod}\;2^N$でインクリメントする演算を定義せよ。例として \begin{align*} U\left( \frac1{\sqrt2} \left( \ket{11} + \ket{10} \right) \right) &= U\left( \frac1{\sqrt2} \left( \ket{3} + \ket{1} \right) \right) \\ &= \frac1{\sqrt2} \left( \ket{0} + \ket{2} \right) \\ &= \frac1{\sqrt2} \left( \ket{00} + \ket{01} \right) \end{align*} ただし、$X$ゲートとそのControlled派生以外の演算を用いてはならない。
通常、整数のインクリメントは以下の手順で行うことができます。
この問題では、上記と同様の手順で2進数で表される量子状態のインクリメント操作を行うことができます。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Arithmetic;
open Microsoft.Quantum.Intrinsic;
operation Solve (register : LittleEndian) : Unit is Adj+Ctl
{
//LittleEndianをQubit[]に変換する
let qs = register!;
//最下位bitをインクリメントする
X(qs[0]);
//最下位bitが0になったら繰り上がり
if (Length(qs) > 1)
{
(ControlledOnInt(0, Solve))(qs[0..0], LittleEndian(qs[1...]));
}
}
}