CDKMRippleCarryAdder
class qiskit.circuit.library.CDKMRippleCarryAdder(num_state_qubits, kind='full', name='CDKMRippleCarryAdder')
Bases: Adder
Un circuito ripple-carry para realizar sumas in-place en dos registros qubit.
Como ejemplo, un circuito sumador de acarreo de ondulación que realiza la suma en dos registros de 3 qubits de tamaño con un bit de acarreo (kind="full") es como sigue:
┌──────┐ ┌──────┐
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 ├────────────────────────
└───┘Aquí las puertas MAJ y UMA corresponden a las puertas introducidas en [1]. Nótese que en esta implementación los qubits del registro de entrada se ordenan como todos los qubits del primer registro de entrada, seguidos de todos los qubits del segundo registro de entrada.
Se admiten dos tipos diferentes de sumadores. Estableciendo el argumento kind , también puede elegir una media escalera, que no tiene carry-in, y una escalera de tamaño fijo, que no tiene ni carry-in ni carry-out, y por lo tanto actúa sobre tamaños de registro fijos. A diferencia de la escalera completa, estos circuitos necesitan un qubit auxiliar adicional.
El diagrama de circuito para el sumador de punto fijo (kind="fixed") en entradas de tamaño 3qubit es
┌──────┐┌──────┐ ┌──────┐┌──────┐
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 ├
└──────┘ └──────┘Tiene un qubit menos que la escalera completa, ya que no tiene el carry-out, pero utiliza un qubit de ayuda en lugar del carry-in, por lo que sólo tiene un qubit menos, no dos.
Los siguientes objetos puerta genéricos realizan adiciones, como esta clase de circuito, pero permiten al compilador seleccionar la descomposición óptima basada en el contexto. Las implementaciones específicas pueden establecerse a través de HLSConfigpor ejemplo, este circuito puede elegirse a través de Adder=["ripple_c04"].
ModularAdderGate: Un sumador genérico, módulo . Este
es funcionalmente equivalente a kind="fixed".
AdderGate: Un sumador inplace genérico. Este
es funcionalmente equivalente a kind="half".
FullAdderGate: Sumador inplace genérico, con un bit de arrastre. Este
es funcionalmente equivalente a kind="full".
Referencias:
[1] Cuccaro et al., Un nuevo circuito cuántico de adición por ondulación, 2004. arXiv:quant-ph/0410184
[2] Vedral et al., Redes cuánticas para operaciones aritméticas elementales, 1995. arXiv:quant-ph/9511018
Parámetros
- num_state_qubits (int) – El número de qubits en cualquiera de los registros de entrada para el estado o . Los dos registros de entrada deben tener el mismo número de qubits.
- kind (str) – El tipo de sumador, puede ser
'full'para un sumador completo,'half'para un medio sumador, o'fixed'para un sumador de tamaño fijo. Un sumador completo incluye tanto carry-in como carry-out, un medio sólo carry-out, y un sumador de tamaño fijo ni carry-in ni carry-out. - name (str) – El nombre del objeto circuito.
Eleva
ValueError - Si num_state_qubits es inferior a 1.
Atributos
name
Tipo: str
Un nombre legible para el circuito.
Ejemplo
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit