CDKMRippleCarryAdder
class qiskit.circuit.library.CDKMRippleCarryAdder(num_state_qubits, kind='full', name='CDKMRippleCarryAdder')
Bases: Adder
Um circuito de ripple-carry para realizar a adição in-place em dois registros de qubit.
Como exemplo, um circuito somador ripple-carry que realiza a adição em dois registros de tamanho 3-qubit com um bit de transporte (kind="full") é o seguinte:
┌──────┐ ┌──────┐
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 ├────────────────────────
└───┘Aqui, as portas MAJ e UMA correspondem às portas introduzidas em [1]. Observe que, nessa implementação, os qubits do registro de entrada são ordenados como todos os qubits do primeiro registro de entrada, seguidos por todos os qubits do segundo registro de entrada.
Há suporte para dois tipos diferentes de somadores. Ao definir o argumento kind , também é possível escolher um half-adder, que não tem carry-in, e um fixed-sized-adder, que não tem carry-in nem carry-out e, portanto, atua em tamanhos de registro fixos. Diferentemente do full-adder, esses circuitos precisam de um qubit auxiliar adicional.
O diagrama do circuito para o somador de ponto fixo (kind="fixed") em entradas de tamanho de 3 qubit é
┌──────┐┌──────┐ ┌──────┐┌──────┐
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 ├
└──────┘ └──────┘Ele tem um qubit a menos do que o full-adder, pois não tem o carry-out, mas usa um qubit auxiliar em vez do carry-in, portanto, tem apenas um qubit a menos, não dois.
Os seguintes objetos de porta genérica realizam adições, como essa classe de circuito, mas permitem que o compilador selecione a decomposição ideal com base no contexto. Implementações específicas podem ser definidas por meio do HLSConfigpor exemplo, esse circuito pode ser escolhido por meio de Adder=["ripple_c04"].
ModularAdderGate: Um somador inplace genérico, módulo . Esse
é funcionalmente equivalente a kind="fixed".
AdderGate: Um somador inplace genérico. Isso
é funcionalmente equivalente a kind="half".
FullAdderGate: Um somador inplace genérico, com um bit de transporte. Isso
é funcionalmente equivalente a kind="full".
Referências
[1] Cuccaro et al, Um novo circuito quântico de adição de transporte de ondulação, 2004. arXiv:quant-ph/0410184
[2] Vedral et al, Quantum Networks for Elementary Arithmetic Operations (Redes Quânticas para Operações Aritméticas Elementares), 1995. arXiv:quant-ph/9511018
Parâmetros
- num_state_qubits (int) – O número de qubits em um dos registros de entrada para o estado ou . Os dois registros de entrada devem ter o mesmo número de qubits.
- kind (str) – O tipo de somador pode ser
'full'para um somador completo,'half'para um meio somador ou'fixed'para um somador de tamanho fixo. Um somador completo inclui tanto o carry-in quanto o carry-out, um meio apenas o carry-out e um somador de tamanho fixo não inclui nem o carry-in nem o carry-out. - name (str) – O nome do objeto de circuito.
Aumentos
ValueError - Se num_state_qubits for menor que 1.
Atributos
name
Tipo: str
Um nome legível por humanos para o circuito.
Exemplo
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit