https://codeforces.com/contest/1357/problem/A4
1 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$R_z$または$R_1$である。$unitary$を一度だけ呼び出して、それが$R_z$ならば0、 $R_1$ならば1を返せ。
$R_z$と$R_1$は、それぞれ $$R_z(\theta) = e^{-i\theta/2}\ket{0}\bra{0} + e^{i\theta/2}\ket{1}\bra{1}$$ $$R_1(\theta) = \ket{0}\bra{0} + e^{i\theta}\ket{1}\bra{1]}$$ で表される演算であり、この問題では$\theta$を任意の値に設定することができます。
ここで、$\theta = 2\pi$としたとき \begin{align*} R_z(2\pi) &= -\ket{0}\bra{0} - \ket{1}\bra{1} \\ &= -I \end{align*} \begin{align*} R_1(2\pi) &= \ket{0}\bra{0} + \ket{1}\bra{1} \\ &= I \end{align*} となり、この識別はDistinguish Z from -Zと同様の方法で可能であることがわかります。
具体的には \begin{align*} [Controlled\;I]\ket{+0} &= \frac1{\sqrt2}\left( \ket{00} + \ket{10} \right) \\ &= \ket{+0} \end{align*} \begin{align*} [Controlled\;-I]\ket{+0} &= \frac1{\sqrt2}\left( \ket{00} - \ket{10} \right) \\ &= \ket{-0} \end{align*} より、状態$\ket{+0}$に対して作用させて0番目のqubitに対してPauli Xを対角とする測定を行うことで判別できます。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Intrinsic;
operation Solve (unitary : ((Double, Qubit) => Unit is Adj+Ctl)) : Int
{
//theta = 2π のとき、Rz = -I, R1 = Iとなる
using (qs = Qubit[2])
{
H(qs[0]);
(Controlled unitary)(qs[0..0], (2.0 * PI(), qs[1]));
return MResetX(qs[0]) == Zero ? 1 | 0;
}
}
}