VBERippleCarryAdder
class qiskit.circuit.library.VBERippleCarryAdder(num_state_qubits, kind='full', name='VBERippleCarryAdder')
ベース: Adder
VBEリップルキャリー加算器 [1]。
この回路は、2つの等しいサイズの量子レジスタのインプレース加算を行う。 一例として、2qubitサイズの2つのレジスタに対して完全加算(すなわちキャリーインビットを含む)を行う古典的な加算回路は以下の通りである:
┌────────┐ ┌───────────┐┌──────┐
cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
│ │ │ ││ │
a_0: ┤1 ├───────────────────────┤1 ├┤1 ├
│ │┌────────┐ ┌──────┐│ ││ Sum │
a_1: ┤ ├┤1 ├──■──┤1 ├┤ ├┤ ├
│ ││ │ │ │ ││ ││ │
b_0: ┤2 Carry ├┤ ├──┼──┤ ├┤2 Carry_dg ├┤2 ├
│ ││ │┌─┴─┐│ ││ │└──────┘
b_1: ┤ ├┤2 Carry ├┤ X ├┤2 Sum ├┤ ├────────
│ ││ │└───┘│ ││ │
cout_0: ┤ ├┤3 ├─────┤ ├┤ ├────────
│ ││ │ │ ││ │
helper_0: ┤3 ├┤0 ├─────┤0 ├┤3 ├────────
└────────┘└────────┘ └──────┘└───────────┘ここで、 キャリーゲートとサムゲートは[、1].で導入されたゲートに対応しています。 Carry_dg は、Carry ゲートの逆に対応します。 なお、この実装では、入力レジスタの量子ビットは、最初の入力レジスタのすべての量子ビットが先に、続いて2番目の入力レジスタのすべての量子ビットが配置される順序となっている。 これは、 [1] の図2とは順序が異なり、その結果、回路図も異なってしまいます。
以下の汎用ゲート・オブジェクトは、この回路クラスと同様に加算を行うが、コンパイラがコンテキストに基づいて最適な分解を選択できるようになっている。 具体的な実装は HLSConfig例えば、この回路は Adder=["ripple_v95"]。
ModularAdderGate:一般的なインプレース加算器、モジュロ 。この
は kind="fixed" と機能的に等価である。
AdderGate:汎用のインプレース加算器。 この
は kind="half" と機能的に等価である。
FullAdderGate:キャリーインビットを持つ一般的なインプレース加算器。 この
は kind="full" と機能的に等価である。
参照資料:
[1] ヴェドラル他 初等算術演算のための量子ネットワーク, 1995. arXiv:quant-ph/9511018
パラメーター
- num_state_qubits (int) – レジスタのサイズ。
- kind (str) – 加算器の種類は、全加算器の場合は
'full'、半加算器の場合は'half'、固定サイズ加算器の場合は'fixed'。 フル加算器にはキャリーインとキャリーアウトの両方が含まれ、ハーフ加算器にはキャリーアウトのみが含まれ、固定サイズ加算器にはキャリーインもキャリーアウトも含まれない。 - name (str) – 回路の名前。
レイズ
ValueError - num_state_qubits が1より小さい場合。
属性
name
タイプ: str
人間が読める回路名。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit