本日はC1 |01⟩ + |10⟩ + |11⟩状態の生成です。
https://codeforces.com/contest/1356/problem/C
Q#では任意の状態を作る操作が用意されていますが、問題の条件にPauliX,Y,Zゲート、Hゲートおよびそれらのcontrolledバージョンのみが利用可能です。そして、問題の注にもある通り、以前のCoding Contestの問題であり、Quantum Katasに入っている問題とよく似ています。
QuantumKatas/Tasks.qs at master · microsoft/QuantumKatas · GitHub
以前の問題は|00⟩ + |01⟩ + |10⟩ という状態を作っているので、この状態を作ったあと、Xゲートを適用すればOKです。今回は解説に書いている事後選択(post-selection)とある方法を使って実装しました。Q#では repeat~until~fixup 構文により、ある条件を満たすまで一連の操作を試みる(=都合のいい状態を事後で選択できる。当たるまでまわせばガチャはあたる)ことができます。
namespace Solution {
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
operation Solve (qs : Qubit[]) : Unit {
using (ancilla = Qubit()) {
repeat {
// |00⟩ + |01⟩ + |10⟩ + |11⟩ 状態を作る
ApplyToEach(H, qs);
// (|00⟩ + |01⟩ + |10⟩) ⊗ |0⟩ + |11⟩ ⊗ |1⟩ 状態を作る
Controlled X(qs, ancilla);
// (|11⟩ + |10⟩ + |01⟩) ⊗ |0⟩ + |00⟩ ⊗ |1⟩ 状態にする
ApplyToEach(X, qs);
// 測定して|0⟩のときだけ残すようにする
let res = MResetZ(ancilla);
}
until (res == Zero)
fixup {
ResetAll(qs);
}
}
}
}
次回が量子機械学習と新しいテーマなので今回は短いですがここまでです。