GroverOperator
class qiskit.circuit.library.GroverOperator(oracle, state_preparation=None, zero_reflection=None, reflection_qubits=None, insert_barriers=False, mcx_mode='noancilla', name='Q')
ベース: QuantumCircuit
グローバーのオペレーター
グローバーの探索アルゴリズム [1、2は]、所望の出力状態の振幅を増幅するために使用される、いわゆるグローバー演算子の繰り返し適用で構成される。 この演算子( )は、位相オラクル( )、ゼロ位相シフトまたはゼロ反射( )、および入力状態準備( )から構成される:
標準的なグローバー・サーチでは、 :
、拡散演算子とも呼ばれる。 この定式化では、グローバーの演算子は2つのステップで構成されていることがわかる。まず、位相オラクルは良い状態に -1 ( )を掛け合わせ、次に状態全体を平均値の周りに反映させる( )。
このクラスでは、量子振幅増幅(グローバーのアルゴリズムの一般化)のように、異なる状態の準備を設定することができます。 は、ハダマールゲートの層ではない可能性があります [3].
相オラクル の作用は次のように定義される
ここで、 が良い状態であれば 、そうでなければ0。 このオラクルが良い状態の位相を反転させ、結果の量子ビットの状態を反転させないという事実を強調するために、 を位相オラクルと呼ぶ。
結果量子ビットをXゲートとHゲートで挟むことで、ビットフリップオラクルから位相オラクルを簡単に構築できることに注意してください。 例えば
Bitflip oracle Phaseflip oracle
q_0: ──■── q_0: ────────────■────────────
┌─┴─┐ ┌───┐┌───┐┌─┴─┐┌───┐┌───┐
out: ┤ X ├ out: ┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├
└───┘ └───┘└───┘└───┘└───┘└───┘オラクルと 演算子の定義には柔軟性がある。 GroverのアルゴリズムでGrover演算子を適用する前に、量子ビットはまず (標準的な定式化ではハダマードゲート)演算子を1回適用して準備される。 従って、 という形の演算が常に存在することになる。したがって、ビットフリップロジックを に移し、オラクルはビットフリップに基づくZゲートを介した位相反転を行うためだけに残すことが可能である。 この使用例として考えられるのは、状態量子ビットを計算しないオラクルである。
ゼロ反射 は通常次のように定義される
ここで、 は、 クビット上の恒等式である。 デフォルトでは、このクラスは負バージョン を実装しています。これは、ターゲット量子ビットのXゲートで挟まれたマルチ制御Zで単純に実装でき、導入されたグローバル位相はGroverのアルゴリズムには関係ないからです。
例
>>> from qiskit.circuit import QuantumCircuit
>>> from qiskit.circuit.library import GroverOperator
>>> oracle = QuantumCircuit(2)
>>> oracle.z(0) # good state = first qubit is |1>
>>> grover_op = GroverOperator(oracle, insert_barriers=True)
>>> grover_op.decompose().draw()
┌───┐ ░ ┌───┐ ░ ┌───┐ ┌───┐ ░ ┌───┐
state_0: ┤ Z ├─░─┤ H ├─░─┤ X ├───────■──┤ X ├──────░─┤ H ├
└───┘ ░ ├───┤ ░ ├───┤┌───┐┌─┴─┐├───┤┌───┐ ░ ├───┤
state_1: ──────░─┤ H ├─░─┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─░─┤ H ├
░ └───┘ ░ └───┘└───┘└───┘└───┘└───┘ ░ └───┘>>> oracle = QuantumCircuit(1)
>>> oracle.z(0) # the qubit state |1> is the good state
>>> state_preparation = QuantumCircuit(1)
>>> state_preparation.ry(0.2, 0) # non-uniform state preparation
>>> grover_op = GroverOperator(oracle, state_preparation)
>>> grover_op.decompose().draw()
┌───┐┌──────────┐┌───┐┌───┐┌───┐┌─────────┐
state_0: ┤ Z ├┤ RY(-0.2) ├┤ X ├┤ Z ├┤ X ├┤ RY(0.2) ├
└───┘└──────────┘└───┘└───┘└───┘└─────────┘>>> oracle = QuantumCircuit(4)
>>> oracle.z(3)
>>> reflection_qubits = [0, 3]
>>> state_preparation = QuantumCircuit(4)
>>> state_preparation.cry(0.1, 0, 3)
>>> state_preparation.ry(0.5, 3)
>>> grover_op = GroverOperator(oracle, state_preparation,
... reflection_qubits=reflection_qubits)
>>> grover_op.decompose().draw()
┌───┐ ┌───┐
state_0: ──────────────────────■──────┤ X ├───────■──┤ X ├──────────■────────────────
│ └───┘ │ └───┘ │
state_1: ──────────────────────┼──────────────────┼─────────────────┼────────────────
│ │ │
state_2: ──────────────────────┼──────────────────┼─────────────────┼────────────────
┌───┐┌──────────┐┌────┴─────┐┌───┐┌───┐┌─┴─┐┌───┐┌───┐┌────┴────┐┌─────────┐
state_3: ┤ Z ├┤ RY(-0.5) ├┤ RY(-0.1) ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ RY(0.1) ├┤ RY(0.5) ├
└───┘└──────────┘└──────────┘└───┘└───┘└───┘└───┘└───┘└─────────┘└─────────┘>>> mark_state = Statevector.from_label('011')
>>> diffuse_operator = 2 * DensityMatrix.from_label('000') - Operator.from_label('III')
>>> grover_op = GroverOperator(oracle=mark_state, zero_reflection=diffuse_operator)
>>> grover_op.decompose().draw(fold=70)
┌─────────────────┐ ┌───┐ »
state_0: ┤0 ├──────┤ H ├──────────────────────────»
│ │┌─────┴───┴─────┐ ┌───┐ »
state_1: ┤1 UCRZ(0,pi,0,0) ├┤0 ├─────┤ H ├──────────»
│ ││ UCRZ(pi/2,0) │┌────┴───┴────┐┌───┐»
state_2: ┤2 ├┤1 ├┤ UCRZ(-pi/4) ├┤ H ├»
└─────────────────┘└───────────────┘└─────────────┘└───┘»
« ┌─────────────────┐ ┌───┐
«state_0: ┤0 ├──────┤ H ├─────────────────────────
« │ │┌─────┴───┴─────┐ ┌───┐
«state_1: ┤1 UCRZ(pi,0,0,0) ├┤0 ├────┤ H ├──────────
« │ ││ UCRZ(pi/2,0) │┌───┴───┴────┐┌───┐
«state_2: ┤2 ├┤1 ├┤ UCRZ(pi/4) ├┤ H ├
« └─────────────────┘└───────────────┘└────────────┘└───┘を実装している。 grover_operator() は同じ機能を実装しているが MCXGate を抽象化し、コンパイラが最適な分解を選択できるようにしている。 を使うことを推奨する。 grover_operator() を使用することを推奨する。
参照資料:
[1] L. K. Grover (1996), A fast quantum mechanical algorithm for database search、 arXiv:quant-ph/9605043.
[2] I. チュアンとM. Nielsen, Quantum Computation and Quantum Information, Cambridge:Cambridge University Press, 2000. 6.1.2。
[3] ブラサール, G., ホイヤー, P., Mosca, M. および Tapp, A. (2000). 量子振幅の増幅と推定。 arXiv:quant-ph/0005055.
クラス qiskit.circuit.library.grover_operator.GroverOperator は Qiskit 2.1 で非推奨となりました。 Qiskit 3.0 で削除されます。 代わりに qiskit.circuit.library.grover_operator。
パラメーター
- oracle (QuantumCircuit |Statevector) – 不良状態に関するリフレクションを実装するフェーズ・オラクル。 これはビット反転オラクルではないことに注意してください。詳細については、docstringを参照してください。
- state_preparation (QuantumCircuit | None) – オペレーターが正常状態と異常状態の準備を行う。 グローバーのアルゴリズムでは、これはn量子ビットのハダマールゲートであり、振幅増幅や推定では演算子 となる。
- zero_reflection (QuantumCircuit |DensityMatrix |Operator | None) – 「ゼロ状態」に関する考察、 。
- reflection_qubits (list[int] | None) – ゼロ反射が作用する量子ビット。
- insert_barriers (bool) – 反射とAの間にバリアを挿入すべきかどうか。
- mcx_mode (str) – デフォルトのゼロ反射の構築に使用するモード。
- name (str) – 回路の名前。
属性
oracle
オラクルは、悪い状態についてのリフレクションを実行する。
reflection_qubits
S0 が適用される反射量子ビット ( S0 がユーザー指定でない場合)。
state_preparation
A演算子またはハダマルドを実装したサブ回路。
zero_reflection
このサブサーキットは、0.5°の反射を実装している。
name
タイプ: str
人間が読める回路名。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit