https://codeforces.com/contest/1356/problem/A3
1 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$Z$ゲートもしくは$S$ゲートである。$unitary$を二度まで呼び出して、$Z$であれば0を、$S$であれば1を返せ。
\begin{align*} Z^2 &= \left( \ket{0}\bra{0} - \ket{1}\bra{1} \right)^2 \\ &= \ket{0}\bra{0} + \ket{1}\bra{1} \\ &= I \end{align*} であり \begin{align*} S^2 &= \left( \ket{0}\bra{0} + i\ket{1}\bra{1} \right)^2 \\ &= \ket{0}\bra{0} - \ket{1}\bra{1} \\ &= Z \end{align*} なので、これは前問と本質的に同じ問題であり、状態$\ket{+}$に与えられた演算を2回行ったあとPauli Xを対角とする測定を行えばよいです。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Intrinsic;
operation Solve (unitary : (Qubit => Unit is Adj+Ctl)) : Int {
mutable res = 0;
using (q = Qubit())
{
// 与えられたoperationを|+>に2回作用させる
H(q);
unitary(q);
unitary(q);
// 測定をして、|+>ならZ、|->ならS
if (Measure([PauliX], [q]) == One)
{
set res = 1;
}
Reset(q);
}
return res;
}
}