https://codeforces.com/contest/1116/problem/A1
2桁の量子状態$\ket{00}$が与えられるので、状態 $$\frac{1}{\sqrt{3}}\left( \ket{00}+\ket{01}+\ket{10} \right)$$ を作れ。
解法が3つくらいあって、どれも有用なので自分用のメモも兼ねてすべて書きます。
単一のqubit$\ket{0}$に対して $$R\ket{0}=\left( \frac{\sqrt{2}}{\sqrt{3}}\ket{0}+\frac{1}{\sqrt{3}}\ket{1} \right)$$ となる回転操作$R$が存在するとき、0番目のqubitに$R$を作用させると $$R_0\ket{00}=\left( \frac{\sqrt{2}}{\sqrt{3}}\ket{0}_0+\frac{1}{\sqrt{3}}\ket{1}_0 \right)\otimes\ket{0}_1$$ を得ます。さらに、0番目のqubitが$\ket{0}$のとき1番目のqubitにアダマール・ゲート$H$を作用させる演算を行うと $$\frac{\sqrt{2}}{\sqrt{3}}\ket{0}_0\otimes\frac{1}{\sqrt{2}}\left( \ket{0}_1+\ket{1}_1 \right)+\frac{1}{\sqrt{3}}\ket{1}_0\otimes\ket{0}_1=\frac{1}{\sqrt{3}}\left( \ket{00}+\ket{01}+\ket{10} \right)$$ となり、目的の状態を得ます。
演算$R$について $$\left( \begin{array} {rr} \frac{\sqrt{2}}{\sqrt{3}} \\ \frac{1}{\sqrt{3}} \end{array} \right) = \left( \begin{array} {rr} \cos{\theta} & -\sin{\theta} \\ \sin{\theta} & \cos{\theta} \end{array} \right) \left( \begin{array} {rr} 1 \\ 0 \end{array} \right) = \left( \begin{array} {rr} \cos{\theta} \\ \sin{\theta} \end{array} \right) $$ より、$\theta=\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$となり、これはブロッホ球上でのY軸回りの$2\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$回転に対応します。
始状態の2つのqubitにアダマール・ゲートを作用させると全状態の重ね合わせ $$\frac{1}{2}\left( \ket{00}+\ket{01}+\ket{10}+\ket{11} \right)$$ を得ます。ここに新たにqubitをひとつ加えて、0,1番目のqubitを制御bitに、2番目のqubitをターゲットbitにしたCCNOTゲートを作用させると $$\frac{1}{2}\left(\ket{00}+\ket{01}+\ket{10}\right)\otimes\ket{0}+\frac{1}{2}\ket{11}\otimes\ket{1}$$ となります。これはエンタングル状態であって、この状態から2番目のqubitに対してPauli Z演算子を対角とした測定を行うと、75%の確率で固有値1を得ることができて、その場合に残りのqubitは目的の状態になっています。
目的の状態でない状態が得られることもありますが、同じことを何度も繰り返せばいつかは目的の状態が得られます。
Q#にはPrepareUniformSuperpositionという演算があり、これは状態$\ket{0\dots 0}$を入力すると、重ね合わせ状態 $$\frac{1}{\sqrt{M}}\sum_{j=0}^{M-1}\ket{j}$$ を作る演算です。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Extensions.Math;
operation Solve (qs : Qubit[]) : Unit {
Ry(2.0*ArcCos(Sqrt(2.0)/Sqrt(3.0)),qs[0]);
(ControlledOnInt(0,H))([qs[0]],qs[1]);
}
}
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
using(x=Qubit()){
repeat{
ApplyToEach(H,qs);
Controlled X(qs,x);
let res=MResetZ(x);
}
until(res==Zero)
fixup{
ResetAll(qs);
}
}
}
}
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
PrepareUniformSuperposition(3,BigEndian(qs));
}
}