https://codeforces.com/contest/1357/problem/A2
2 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$I\otimes I$、${\rm CNOT_{12}}$、${\rm CNOT_{21}}$、${\rm SWAP}$のうちのどれかである。$unitary$を二度まで呼び出して、それが$I\otimes I$ならば0、 ${\rm CNOT_{12}}$ならば1、 ${\rm CNOT_{21}}$ならば2、 ${\rm SWAP}$ならば3を返せ。
この問題では与えられた演算を2回まで呼び出すことができるので、与えられた演算を$\ket{01}, \ket{10}$の2つの状態に作用させると $$I\otimes I\ket{01} = \ket{01},\; I\otimes I\ket{10} = \ket{10}$$ $${\rm CNOT_{12}}\ket{01} = \ket{01},\; {\rm CNOT_{12}}\ket{10} = \ket{11}$$ $${\rm CNOT_{21}}\ket{01} = \ket{11},\; {\rm CNOT_{21}}\ket{10} = \ket{10}$$ $${\rm SWAP}\ket{01} = \ket{10},\; {\rm SWAP}\ket{10} = \ket{01}$$ となり、演算を作用させたあとの状態を測定することで4つの演算をすべて識別することができます。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Arithmetic;
open Microsoft.Quantum.Intrinsic;
operation ToString (register : LittleEndian) : String
{
//与えられたQubit[]の各桁を測定して、対応する文字列を返す
mutable res = "";
let qs = register!;
for (idx in 0..Length(qs) - 1)
{
set res += M(qs[idx]) == Zero ? "0" | "1";
}
return res;
}
operation Solve (unitary : (Qubit[] => Unit is Adj+Ctl)) : Int
{
mutable str = "";
using (qs = Qubit[4])
{
//|01>, |10>にunitaryを作用させる
ApplyToEach(X, qs[1..2]);
ApplyToEach(unitary, [qs[0..1], qs[2..3]]);
//測定する
set str = ToString(LittleEndian(qs));
ResetAll(qs);
}
//測定結果に対応する整数を返す
for (idx in 0..3)
{
if(str == ["0110", "0111", "1110", "1001"][idx])
{
return idx;
}
}
return -1;
}
}