CDKMRippleCarryAdder
class qiskit.circuit.library.CDKMRippleCarryAdder(num_state_qubits, kind='full', name='CDKMRippleCarryAdder')
Basen: Adder
Eine Ripple-Carry-Schaltung zur Durchführung von In-Place-Addition auf zwei Qubit-Registern.
Ein Beispiel für eine Ripple-Carry-Addierschaltung, die zwei 3-Qubit-Register mit einem Carry-In-Bit (kind="full") addiert, sieht wie folgt aus:
┌──────┐ ┌──────┐
cin_0: ┤2 ├─────────────────────────────────────┤2 ├
│ │┌──────┐ ┌──────┐│ │
a_0: ┤0 ├┤2 ├─────────────────────┤2 ├┤0 ├
│ ││ │┌──────┐ ┌──────┐│ ││ │
a_1: ┤ MAJ ├┤0 ├┤2 ├─────┤2 ├┤0 ├┤ UMA ├
│ ││ ││ │ │ ││ ││ │
a_2: ┤ ├┤ MAJ ├┤0 ├──■──┤0 ├┤ UMA ├┤ ├
│ ││ ││ │ │ │ ││ ││ │
b_0: ┤1 ├┤ ├┤ MAJ ├──┼──┤ UMA ├┤ ├┤1 ├
└──────┘│ ││ │ │ │ ││ │└──────┘
b_1: ────────┤1 ├┤ ├──┼──┤ ├┤1 ├────────
└──────┘│ │ │ │ │└──────┘
b_2: ────────────────┤1 ├──┼──┤1 ├────────────────
└──────┘┌─┴─┐└──────┘
cout_0: ────────────────────────┤ X ├────────────────────────
└───┘Die MAJ- und UMA-Tore entsprechen den unter [1]. vorgestellten Toren. Beachten Sie, dass in dieser Implementierung die Qubits der Eingangsregister in der Reihenfolge angeordnet sind, dass alle Qubits aus dem ersten Eingangsregister, gefolgt von allen Qubits aus dem zweiten Eingangsregister kommen.
Es werden zwei verschiedene Arten von Addierern unterstützt. Mit dem Argument kind können Sie auch einen Halbaddierer wählen, der keinen Übertrag hat, und einen Festgrößenaddierer, der weder Übertrag noch Übertrag hat und daher auf feste Registergrößen wirkt. Anders als die Volladdierer benötigen diese Schaltungen ein zusätzliches Hilfsqubit.
Der Schaltplan für den Festkomma-Addierer (kind="fixed") mit 3-Qubit großen Eingängen lautet
┌──────┐┌──────┐ ┌──────┐┌──────┐
a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
│ ││ │┌──────┐┌──────┐│ ││ │
a_1: ┤ ├┤0 ├┤2 ├┤2 ├┤0 ├┤ ├
│ ││ ││ ││ ││ ││ │
a_2: ┤ ├┤ MAJ ├┤0 ├┤0 ├┤ UMA ├┤ ├
│ ││ ││ ││ ││ ││ │
b_0: ┤1 MAJ ├┤ ├┤ MAJ ├┤ UMA ├┤ ├┤1 UMA ├
│ ││ ││ ││ ││ ││ │
b_1: ┤ ├┤1 ├┤ ├┤ ├┤1 ├┤ ├
│ │└──────┘│ ││ │└──────┘│ │
b_2: ┤ ├────────┤1 ├┤1 ├────────┤ ├
│ │ └──────┘└──────┘ │ │
help_0: ┤2 ├────────────────────────────────┤2 ├
└──────┘ └──────┘Er hat ein Qubit weniger als der Full-Adder, da er keinen Carry-Out hat, aber statt des Carry-In ein Helper-Qubit verwendet, so dass er nur ein Qubit weniger hat, nicht zwei.
Die folgenden generischen Gatterobjekte führen wie diese Schaltkreisklasse Additionen durch, ermöglichen es dem Compiler jedoch, die optimale Zerlegung auf der Grundlage des Kontexts auszuwählen. Spezifische Implementierungen können über die HLSConfigeingestellt werden, z.B. kann diese Schaltung über Adder=["ripple_c04"] gewählt werden.
ModularAdderGate: Ein generischer Inplace-Addierer, modulo . Diese
ist funktional äquivalent zu kind="fixed".
AdderGate: Ein allgemeiner Inplace-Addierer. Diese
ist funktional äquivalent zu kind="half".
FullAdderGate: Ein generischer Inplace-Addierer mit einem Carry-In-Bit. Diese
ist funktional äquivalent zu kind="full".
Quellenangaben:
[1] Cuccaro et al, Eine neue Quanten-Ripple-Carry-Additionsschaltung, 2004. arXiv:quant-ph/0410184
[2] Vedral et al., Quantennetzwerke für elementare arithmetische Operationen, 1995. arXiv:quant-ph/9511018
Parameter
- num_state_qubits (int) – Die Anzahl der Qubits in einem der beiden Eingangsregister für den Zustand oder . Die beiden Eingangsregister müssen die gleiche Anzahl von Qubits haben.
- kind (str) – Die Art des Addierers kann
'full'für einen Volladdierer,'half'für einen Halbaddierer oder'fixed'für einen Addierer fester Größe sein. Ein Volladdierer enthält sowohl Übertrag als auch Übertrag, ein Halbaddierer nur Übertrag, und ein Addierer fester Größe weder Übertrag noch Übertrag. - name (str) – Der Name des Schaltkreisobjekts.
Erhöht
ValueError - Wenn num_state_qubits kleiner als 1 ist.
Attribute
name
Typ: str
Ein von Menschen lesbarer Name für den Stromkreis.
Beispiel
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit