Síntese de circuitos
qiskit.synthesis
Síntese da evolução
EvolutionSynthesis() | Interface para algoritmos de síntese de evolução. |
ProductFormula(ordem[, representantes,...] ) | Classe base de fórmula de produto para a decomposição de exponenciais de operadores não comutáveis. |
LieTrotter([repetições, inserir_barreiras,...] ) | A fórmula do produto Lie-Trotter. |
SuzukiTrotter([ordem, representantes,...] ) | A fórmula do produto Suzuki-Trotter (de ordem superior). |
MatrixExponential() | Evolução exata do operador por meio de exponenciação de matriz e síntese unitária. |
QDrift([repetições, inserir_barreiras,...] ) | O método QDrift Trotterization, que seleciona cada termo na Trotterização de forma aleatória, com uma probabilidade proporcional ao seu peso. |
Síntese de Função Linear
synth_cnot_count_full_pmh
qiskit.synthesis.synth_cnot_count_full_pmh(state, section_size=None)
Sintetizar circuitos reversíveis lineares para arquitetura all-to-all usando os métodos Patel, Markov e Hayes.
Essa função é uma implementação do algoritmo de Patel, Markov e Hayes de [1] para a síntese ideal de circuitos reversíveis lineares para arquitetura all-to-all, conforme especificado por uma matriz .
Parâmetros
- state (list[list[bool]] | ndarray[bool]) – matriz booleana invertível, descrevendo o estado do circuito de entrada.
- section_size (int | None) – O tamanho de cada seção no algoritmo de Patel-Markov-Hayes [1]. Se
Nonefor escolhido para ser com , o que minimiza aproximadamente o limite superior do número de operações de linha dado na [1] Eq. (3).
Retorna
Um circuito somente CX que implementa a transformação linear.
Aumentos
ValueError - Quando section_size é maior que o número de colunas.
Tipo de retorno
Referências
- Patel, Ketan N., Igor L. Markov e John P. Hayes, Optimal synthesis of linear reversible circuits, Quantum Information & Computation 8.3 (2008): 282-294. arXiv:quant-ph/0302002 [quant-ph]
synth_cnot_depth_line_kms
qiskit.synthesis.synth_cnot_depth_line_kms(mat)
Sintetize o circuito reversível linear para arquiteturas lineares de vizinhança mais próxima usando o método Kutin, Moulton e Smithline.
Algoritmo de síntese para circuitos reversíveis lineares de [1], seção 7. Esse algoritmo sintetiza qualquer circuito reversível linear de qubits em uma arquitetura linear do vizinho mais próximo usando portas CX com profundidade de no máximo .
Parâmetros
mat (ndarray[bool]) – Uma matriz booleana invertível.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError - se mat não for invertível.
Tipo de retorno
Referências
- Kutin, S., Moulton, D. P., Smithline, L., Computação à distância, Chicago J. Theor. Computador. Ciências, vol. 2007, (2007), arXiv:quant-ph/0701194
Síntese de fase linear
synth_cz_depth_line_mr
qiskit.synthesis.synth_cz_depth_line_mr(mat)
Síntese de um circuito CZ para conectividade de vizinho mais próximo linear (LNN), com base em Maslov e Roetteler.
Observe que esse método reverte a ordem dos qubits no circuito e retorna um circuito contendo CXGates e portas de fase (SGate, SdgGate ou ZGate).
Parâmetros
mat (ndarray) – uma matriz quadrada diagonal superior de tipos booleanos que representa o circuito CZ. mat[i][j]=1 for i<j representa uma cz(i,j) porta. Apenas o triângulo superior é lido; a diagonal e o triângulo inferior não têm efeito.
Retorna
Uma implementação de circuito do circuito CZ de profundidade para conectividade LNN.
Tipo de retorno
Referências
- Dmitri Maslov, Martin Roetteler, Circuitos estabilizadores mais curtos via decomposição de Bruhat e transformações de circuitos quânticos, arXiv:1705.09176.
synth_cx_cz_depth_line_my
qiskit.synthesis.synth_cx_cz_depth_line_my(mat_x, mat_z)
Síntese conjunta de um circuito -CZ-CX- para conectividade linear do vizinho mais próximo (LNN), com profundidade de 2 qubits no máximo 5n, com base em Maslov e Yang. Esse método calcula o circuito CZ dentro do circuito CX por meio de inserções de porta de fase.
Parâmetros
- mat_z (ndarray) – uma matriz booleana simétrica que representa um circuito CZ.
mat_z[i][j]=1representa uma portacz(i,j) - mat_x (ndarray) – uma matriz booleana invertível que representa um circuito CX.
Retorna
Uma implementação de circuito de um circuito CX seguindo um circuito CZ, denotado como circuito -CZ-CX-, com profundidade de dois qubits no máximo 5n, para conectividade LNN.
Tipo de retorno
Referências
- Kutin, S., Moulton, D. P., Smithline, L., Computação à distância, Chicago J. Theor. Computador. Ciências, vol. 2007, (2007), arXiv:quant-ph/0701194
- Dmitri Maslov, Willers Yang, Os circuitos CNOT precisam de pouca ajuda para implementar transformações de Clifford sem Hadamard arbitrárias que eles geram, arXiv:2210.16195.
synth_cnot_phase_aam
qiskit.synthesis.synth_cnot_phase_aam(cnots, angles, section_size=2)
Essa função é uma implementação do algoritmo GraySynth de Amy, Azimadeh e Mosca.
GraySynth é um algoritmo heurístico descrito em [ [1] ] para a síntese de pequenas redes de paridade. É inspirado nos códigos de Gray. Dado um conjunto de cadeias binárias (denominadas cnots a seguir), o algoritmo sintetiza uma rede de paridade para escolhendo repetidamente um índice para expandir e, em seguida, realizando efetivamente uma recursão sobre os cofatores e , que consistem nas cadeias , com ou , respectivamente. À medida que um subconjunto é expandido recursivamente, aplicam-se cx portas de lógica de modo que um bit-alvo designado contenha a paridade (parcial) , onde se e somente se para todos os . Se contiver um único elemento , então , e o bit-alvo contém o valor , conforme desejado.
Notavelmente, em vez de descomputar essa sequência de portas cx (CNOT) quando um subconjunto termina de ser sintetizado, o algoritmo mantém o invariante de que as paridades restantes a serem computadas são expressas sobre o estado atual dos bits. Isso permite que o algoritmo evite o "retrocesso" inerente aos métodos baseados em não computação.
O algoritmo é descrito em detalhes na seção 4 de [1].
Parâmetros
-
Uma matriz cujas colunas são as paridades a serem sintetizadas e. g.:
[[0, 1, 1, 1, 1, 1], [1, 0, 0, 1, 1, 1], [1, 0, 0, 1, 0, 0], [0, 0, 1, 0, 1, 0]]corresponde a:
x1^x2 + x0 + x0^x3 + x0^x1^x2 + x0^x1^x3 + x0^x1 -
angles (list[str]) – Uma lista contendo todas as portas de mudança de fase que devem ser aplicadas, na mesma ordem que em
cnots. Um número é interpretado como o ângulo de , caso contrário, os elementos devem ser't','tdg','s','sdg'ou'z'. -
section_size (int) – O tamanho de cada seção no algoritmo Patel-Markov-Hayes.
section_sizedeve ser um fator do número de qubits.
Retorna
O circuito quântico decomposto.
Aumentos
QiskitError - quando as dimensões de cnots e angles não estiverem alinhadas.
Tipo de retorno
Referências
- Matthew Amy, Parsiad Azimzadeh e Michele Mosca. Sobre a complexidade do controle-NOT de circuitos de fase controlados-NOT.., Quantum Science and Technology 4.1 (2018): 015002. arXiv:1712.01859
Síntese de Permutações
synth_permutation_depth_lnn_kms
qiskit.synthesis.synth_permutation_depth_lnn_kms(pattern)
Sintetize um circuito de permutação para uma arquitetura linear do vizinho mais próximo usando o método Kutin, Moulton, Smithline.
Esse é o algoritmo de síntese de permutação de [1], seção 6. Ele sintetiza qualquer permutação de n qubits em uma arquitetura linear do vizinho mais próximo usando portas SWAP com profundidade de no máximo e tamanho de no máximo (em que tanto a profundidade quanto o tamanho são medidos em relação aos SWAPs).
Parâmetros
pattern (list[int] | ndarray[int]) – Padrão de permutação, descrevendo quais qubits ocupam as posições 0, 1, 2, etc. após a aplicação da permutação. Ou seja, pattern[k] = m quando a permutação mapeia o qubit m para a posição k. Por exemplo, o padrão [2, 4, 3, 0, 1] significa que o qubit 2 vai para a posição 0, o qubit 4 vai para a posição 1, etc.
Retorna
O circuito quântico sintetizado.
Tipo de retorno
Referências
- Samuel A. Kutin, David Petrie Moulton e Lawren M. Smithline. Computação à distância.., arXiv:quant-ph/0701194v1
synth_permutation_basic
qiskit.synthesis.synth_permutation_basic(pattern)
Sintetize um circuito de permutação para uma arquitetura totalmente conectada usando classificação.
Mais precisamente, se a permutação de entrada for um ciclo de comprimento m, isso criará um circuito quântico com m-1 SWAPs (e de profundidade m-1); se a permutação de entrada consistir em vários ciclos disjuntos, cada ciclo será essencialmente tratado de forma independente.
Parâmetros
pattern (list[int] | ndarray[int]) – Padrão de permutação, descrevendo quais qubits ocupam as posições 0, 1, 2, etc. após a aplicação da permutação. Ou seja, pattern[k] = m quando a permutação mapeia o qubit m para a posição k. Por exemplo, o padrão [2, 4, 3, 0, 1] significa que o qubit 2 vai para a posição 0, o qubit 4 vai para a posição 1, etc.
Retorna
O circuito quântico sintetizado.
Tipo de retorno
synth_permutation_acg
qiskit.synthesis.synth_permutation_acg(pattern)
Sintetize um circuito de permutação para uma arquitetura totalmente conectada usando o método de Alon, Chung e Graham.
Isso produz um circuito quântico de profundidade 2 (medido no número de SWAPs).
Essa implementação é baseada na Proposição 4.1 na referência [1], com a prova detalhada apresentada no Teorema 2 na referência [2]
Parâmetros
pattern (list[int] | ndarray[int]) – Padrão de permutação, descrevendo quais qubits ocupam as posições 0, 1, 2, etc. após a aplicação da permutação. Ou seja, pattern[k] = m quando a permutação mapeia o qubit m para a posição k. Por exemplo, o padrão [2, 4, 3, 0, 1] significa que o qubit 2 vai para a posição 0, o qubit 4 vai para a posição 1, etc.
Retorna
O circuito quântico sintetizado.
Tipo de retorno
Referências
- N. Alon, F. R. K. Chung e R. L. Graham. Permutações de roteamento em gráficos por meio de correspondências.., Anais do Vigésimo Quinto Simpósio Anual da ACM sobre Teoria da Computação (1993). Páginas 583-591. (Resumo estendido) 10.1145/167088.167239
- N. Alon, F. R. K. Chung e R. L. Graham. Permutações de roteamento em gráficos por meio de correspondências.., (Artigo completo)
synth_permutation_reverse_lnn_kms
qiskit.synthesis.synth_permutation_reverse_lnn_kms(num_qubits)
Sintetize a permutação reversa para arquiteturas lineares do vizinho mais próximo usando o método Kutin, Moulton e Smithline.
Algoritmo de síntese para permutação reversa de [1], seção 5. Esse algoritmo sintetiza a permutação reversa em qubits em uma arquitetura linear do vizinho mais próximo usando portas CX com profundidade .
Parâmetros
num_qubits (int) – O número de qubits.
Retorna
O circuito quântico sintetizado.
Tipo de retorno
Referências
- Kutin, S., Moulton, D. P., Smithline, L., Computação à distância, Chicago J. Theor. Computador. Ciências, vol. 2007, (2007), arXiv:quant-ph/0701194
Síntese de Clifford
synth_clifford_full
qiskit.synthesis.synth_clifford_full(clifford, method=None)
Decompor um operador Clifford em um operador QuantumCircuit.
Para qubits, isso se baseia na decomposição de custo CX ideal da referência [1]. Para qubits, isso é feito usando a rotina geral de compilação gulosa não otimizada da referência [3], que normalmente produz um custo CX melhor em comparação com o método AG em [2].
Parâmetros
- clifford (Clifford) – Um operador de Clifford.
- method (str | None) – um método de síntese (
'AG'ou'greedy'). Se definido, isso substitui a decomposição ótima para qubits d .
Retorna
Uma implementação de circuito do Clifford.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
- S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits (Simulação aprimorada de circuitos estabilizadores ), Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196
- Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin, Otimização de circuitos Clifford com modelos e portas Pauli simbólicas, arXiv:2105.02291 [quant-ph]
synth_clifford_ag
qiskit.synthesis.synth_clifford_ag(clifford)
Decompor um operador Clifford em um operador QuantumCircuit com base no método de Aaronson-Gottesman [1].
Parâmetros
clifford (Clifford) – Um operador de Clifford.
Retorna
Uma implementação de circuito do Clifford.
Tipo de retorno
Referências
- S. Aaronson, D. Gottesman, Improved Simulation of Stabilizer Circuits (Simulação aprimorada de circuitos estabilizadores ), Phys. Rev. A 70, 052328 (2004). arXiv:quant-ph/0406196
synth_clifford_bm
qiskit.synthesis.synth_clifford_bm(clifford)
Decomposição de custo CX ideal de um operador Clifford em 2 qubits ou 3 qubits em um operador QuantumCircuit com base no método de Bravyi-Maslov [1].
Parâmetros
clifford (Clifford) – Um operador de Clifford.
Retorna
Uma implementação de circuito do Clifford.
Aumentos
QiskitError - se Clifford estiver em mais de 3 qubits.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
synth_clifford_greedy
qiskit.synthesis.synth_clifford_greedy(clifford)
Decompor um operador Clifford em um operador QuantumCircuit com base no compilador de Clifford guloso descrito no Apêndice A de Bravyi, Hu, Maslov e Shaydulin [1].
Esse método normalmente produz um melhor custo CX em comparação com o método Aaronson-Gottesman.
Observe que essa função implementa apenas o compilador de Clifford guloso do Apêndice A de [1], e não os modelos e as otimizações de portas simbólicas de Pauli mencionadas no mesmo documento.
Parâmetros
clifford (Clifford) – Um operador de Clifford.
Retorna
Uma implementação de circuito do Clifford.
Aumentos
QiskitError - se a eliminação Gaussiana simétrica falhar.
Tipo de retorno
Referências
- Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin, Otimização de circuitos Clifford com modelos e portas Pauli simbólicas, arXiv:2105.02291 [quant-ph]
synth_clifford_layers
qiskit.synthesis.synth_clifford_layers(cliff, cx_synth_func=<function _default_cx_synth_func>, cz_synth_func=<function _default_cz_synth_func>, cx_cz_synth_func=None, cz_func_reverse_qubits=False, validate=False)
Síntese de um Clifford em camadas, ela fornece uma decomposição semelhante à síntese descrita no Lema 8 de Bravyi e Maslov [1].
Por exemplo, um circuito Clifford de 5 qubits é decomposto nas seguintes camadas:
┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
│ ││ ││ ││ ││ ││ ││ ││ │
q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├
│ ││ ││ ││ ││ ││ ││ ││ │
q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
│ ││ ││ ││ ││ ││ ││ ││ │
q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├
│ ││ ││ ││ ││ ││ ││ ││ │
q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├
└─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘Essa decomposição é para as funções padrão cz_synth_func e cx_synth_func . Com outras funções, é possível ver uma decomposição ligeiramente diferente.
Parâmetros
- cliff (Clifford) – Um operador de Clifford.
- cx_synth_func (Callable[[ndarray], QuantumCircuit]) – Uma função para decompor o subcircuito CX. Recebe como entrada uma matriz booleana invertível e produz uma saída
QuantumCircuit. - cz_synth_func (Callable[[ndarray], QuantumCircuit]) – Uma função para decompor o subcircuito CZ. Ele recebe como entrada uma matriz simétrica booleana e gera um
QuantumCircuit. - cx_cz_synth_func (Callable) – opcional, uma função para decompor os subcircuitos CZ e CX.
- validate (Boolean) – se for True, valida o processo de síntese.
- cz_func_reverse_qubits (Boolean) – Verdadeiro somente se
cz_synth_funcforsynth_cz_depth_line_mr()pois essa função retorna um circuito que reverte a ordem dos qubits.
Retorna
Uma implementação de circuito do Clifford.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
synth_clifford_depth_lnn
qiskit.synthesis.synth_clifford_depth_lnn(cliff)
Síntese de um Clifford em camadas para conectividade de vizinho mais próximo linear.
A profundidade do circuito n-qubit sintetizado é limitada por , o que não é ideal. Ele deve ser substituído por um algoritmo melhor que ofereça uma profundidade limitada por [3].
Parâmetros
cliff (Clifford) – um operador de Clifford.
Retorna
uma implementação de circuito do Clifford.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
- Dmitri Maslov, Martin Roetteler, Circuitos estabilizadores mais curtos via decomposição de Bruhat e transformações de circuitos quânticos, arXiv:1705.09176.
- Dmitri Maslov, Willers Yang, Os circuitos CNOT precisam de pouca ajuda para implementar transformações de Clifford sem Hadamard arbitrárias que eles geram, arXiv:2210.16195.
Síntese CNOTDihedral
synth_cnotdihedral_full
qiskit.synthesis.synth_cnotdihedral_full(elem)
Decompor um elemento CNOTDihedral em um elemento QuantumCircuit.
Para qubits, isso se baseia na decomposição de custo CX ideal da referência [1]. Para qubits, isso é feito usando a rotina de compilação geral não otimizada da referência [2].
Parâmetros
elem (CNOTDihedral) – A CNOTDihedral elemento.
Retorna
Uma implementação de circuito do CNOTDihedral elemento.
Tipo de retorno
Referências
- Shelly Garion e Andrew W. Cross, Synthesis of CNOT-Dihedral circuits with optimal number of two qubit gates, Quantum 4(369), 2020
- Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin e Jay M. Gambetta, Scalable randomized benchmarking of non-Clifford gates, npj Quantum Inf 2, 16012 (2016).
synth_cnotdihedral_two_qubits
qiskit.synthesis.synth_cnotdihedral_two_qubits(elem)
Decompor um elemento CNOTDihedral em um único qubit e dois qubits em um elemento QuantumCircuit. Essa decomposição tem um número ideal de CXGates.
Parâmetros
elem (CNOTDihedral) – A CNOTDihedral elemento.
Retorna
Uma implementação de circuito do CNOTDihedral elemento.
Aumentos
QiskitError – se o elemento não for de 1 qubit ou 2 qubits CNOTDihedral.
Tipo de retorno
Referências
- Shelly Garion e Andrew W. Cross, On the structure of the CNOT-Dihedral group, arXiv:2006.12042 [quant-ph]
synth_cnotdihedral_general
qiskit.synthesis.synth_cnotdihedral_general(elem)
Decompor um elemento CNOTDihedral em um elemento QuantumCircuit.
Decompor um elemento geral CNOTDihedral elementos. O número de portas CX não é necessariamente o ideal. Para uma decomposição de um elemento de 1 ou 2 qubits, chame synth_cnotdihedral_two_qubits().
Parâmetros
elem (CNOTDihedral) – A CNOTDihedral elemento.
Retorna
Uma implementação de circuito do CNOTDihedral elemento.
Aumentos
QiskitError - se o elemento não puder ser decomposto em um circuito.
Tipo de retorno
Referências
- Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin e Jay M. Gambetta, Scalable randomized benchmarking of non-Clifford gates, npj Quantum Inf 2, 16012 (2016).
Síntese do estado do estabilizador
synth_stabilizer_layers
qiskit.synthesis.synth_stabilizer_layers(stab, cz_synth_func=<function _default_cz_synth_func>, cz_func_reverse_qubits=False, validate=False)
Síntese de um estado estabilizador em camadas.
Ela fornece uma decomposição semelhante à síntese descrita no Lema 8 da referência [1], sem o subcircuito inicial livre de Hadamard, que não afeta o estado do estabilizador.
Por exemplo, um estado estabilizador de 5 qubits é decomposto nas seguintes camadas:
┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
│ ││ ││ ││ ││ │
q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├
│ ││ ││ ││ ││ │
q_2: ┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
│ ││ ││ ││ ││ │
q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├
│ ││ ││ ││ ││ │
q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├
└─────┘└─────┘└─────┘└─────┘└────────┘Parâmetros
- stab (StabilizerState) – Um estado estabilizador.
- cz_synth_func (Callable[[ndarray], QuantumCircuit]) – Uma função para decompor o subcircuito CZ. Ele recebe como entrada uma matriz simétrica booleana e gera um
QuantumCircuit. - cz_func_reverse_qubits (bool) –
Truesomente secz_synth_funcforsynth_cz_depth_line_mr()pois essa função retorna um circuito que reverte a ordem dos qubits. - validate (bool) – Se
True, valida o processo de síntese.
Retorna
Uma implementação de circuito do estado do estabilizador.
Aumentos
QiskitError - se a entrada não for um StabilizerState.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
synth_stabilizer_depth_lnn
qiskit.synthesis.synth_stabilizer_depth_lnn(stab)
Síntese de um estado estabilizador de n-qubit para conectividade de vizinho mais próximo linear, em profundidade de 2-qubit e duas camadas CX distintas, usando CXGates e portas de fase (SGate, SdgGate ou ZGate).
Parâmetros
stab (StabilizerState) – Um estado estabilizador.
Retorna
Uma implementação de circuito do estado do estabilizador.
Tipo de retorno
Referências
- S. Bravyi, D. Maslov, Hadamard-free circuits expose the structure of the Clifford group, arXiv:2003.09412 [quant-ph]
- Dmitri Maslov, Martin Roetteler, Circuitos estabilizadores mais curtos via decomposição de Bruhat e transformações de circuitos quânticos, arXiv:1705.09176.
synth_circuit_from_stabilizers
qiskit.synthesis.synth_circuit_from_stabilizers(stabilizers, allow_redundant=False, allow_underconstrained=False, invert=False)
Síntese de um circuito que gera um estado estabilizado pelos estabilizadores usando a eliminação Gaussiana com portas Clifford. Se os estabilizadores estiverem com restrições insuficientes e allow_underconstrained for True, o circuito produzirá um dos estados estabilizados pelos estabilizadores. Com base na implementação do stim.
Parâmetros
- stabilizers (Collection[str]) – Lista de cordas estabilizadoras
- allow_redundant (bool) – Permitir estabilizadores redundantes (ou seja, alguns estabilizadores podem ser produtos de outros)
- allow_underconstrained (bool) – Permitir um conjunto de estabilizadores subrestrito (ou seja, os estabilizadores não especificam um estado único)
- invert (bool) – Circuito inverso de retorno
Retorna
Um circuito que gera um estado estabilizado por stabilizers.
Aumentos
QiskitError - se os estabilizadores forem inválidos, não forem comutáveis ou forem contraditórios, se a lista tiver restrições insuficientes e allow_underconstrained for False, ou se a lista for redundante e allow_redundant for False.
Tipo de retorno
Referências
Síntese de Base Discreta
SolovayKitaevDecomposition([...]) | O algoritmo de decomposição discreta de Solovay Kitaev. |
gridsynth_rz
qiskit.synthesis.gridsynth_rz(angle, epsilon=1e-10)
Rotação RZ aproximada utilizando o algoritmo de Ross-Selinger.
O algoritmo é descrito em [1]. O código-fonte (em Rust) está disponível em https://github.com/qiskit-community/rsgridsynth.
Parâmetros
- angle (float) – Especifica o ângulo da rotação RZ.
- epsilon (float) – O erro de aproximação permitido.
Retorna
Um circuito de um qubit aproximando-se de RZ(angle).
Tipo de retorno
Referências
[1] Neil J. Ross, Peter Selinger, Aproximação Clifford+T ideal sem ancilla de rotações z,
gridsynth_unitary
qiskit.synthesis.gridsynth_unitary(matrix, epsilon=1e-10)
Aproxime uma matriz unitária de 1 qubit usando o algoritmo de Ross-Selinger.
O algoritmo é descrito em [1]. O código-fonte (em Rust) está disponível em https://github.com/qiskit-community/rsgridsynth.
Parâmetros
Retorna
Um circuito de um qubit aproximando-se de matrix.
Tipo de retorno
Referências
[1] Neil J. Ross, Peter Selinger, Aproximação Clifford+T ideal sem ancilla de rotações z,
generate_basic_approximations
qiskit.synthesis.generate_basic_approximations(basis_gates, depth, filename=None)
Gera uma lista de GateSequences com as portas em basis_gates.
A função qiskit.synthesis.discrete_basis.generate_basis_approximations.generate_basic_approximations() está obsoleta a partir do Qiskit 2.3. Será removido no mínimo três meses após a data de lançamento. Use a classe SolovayKitaevDecomposition diretamente para gerar, armazenar e carregar as aproximações básicas.
Parâmetros
- basis_gates (list[str |Gate]) – As portas a partir das quais serão criadas as sequências de portas.
- depth (int) – A profundidade máxima das aproximações.
- filename (str | None) – Se fornecido, as aproximações básicas serão armazenadas nesse arquivo.
Retorna
Lista de GateSequences que usam as portas em basis_gates.
Aumentos
ValueError - Se basis_gates contiver um identificador de porta inválido.
Tipo de retorno
lista [GateSequence]
Síntese da alteração da base
synth_qft_line
qiskit.synthesis.synth_qft_line(num_qubits, do_swaps=True, approximation_degree=0)
Construa um circuito para a Transformada Quântica de Fourier usando conectividade linear de vizinhança.
A construção é baseada na Fig. 2.b em Fowler et al. [1].
Com o valor padrão de do_swaps = True, esse algoritmo de síntese cria um circuito que implementa fielmente a operação QFT. Quando do_swaps = False, esse algoritmo de síntese cria um circuito que corresponde à "QFT com reversão": aplicando a QFT e invertendo a ordem de seus qubits de saída.
Parâmetros
- num_qubits (int) – O número de qubits nos quais a Transformada Quântica de Fourier atua.
- approximation_degree (int) – O grau de aproximação (0 para nenhuma aproximação). É possível implementar o QFT aproximadamente ignorando as rotações de fase controlada com o ângulo abaixo de um limite. Isso é discutido em mais detalhes em https://arxiv.org/abs/quant-ph/9601018 ou https://arxiv.org/abs/quant-ph/0403071.
- do_swaps (bool) – Se deve sintetizar a operação "QFT" ou "QFT-com-reversão".
Retorna
Um circuito que implementa a operação QFT.
Tipo de retorno
Referências
- A. G. Fowler, S. J. Devitt e L. C. L. Hollenberg, Implementação do algoritmo de Shor em uma matriz linear de qubits vizinhos mais próximos, Quantum Info. Computador. 4, 4 (julho de 2004), 237-251. arXiv:quant-ph/0402196 [quant-ph]
synth_qft_full
qiskit.synthesis.synth_qft_full(num_qubits, do_swaps=True, approximation_degree=0, insert_barriers=False, inverse=False, name=None)
Construa um circuito para a Transformada Quântica de Fourier usando a conectividade de todos para todos.
Com o valor padrão de do_swaps = True, esse algoritmo de síntese cria um circuito que implementa fielmente a operação QFT. Esse circuito contém uma sequência de portas de troca no final, correspondendo à inversão da ordem de seus qubits de saída. Em alguns aplicativos, essa permutação de reversão pode ser evitada. A configuração do_swaps = False cria um circuito sem essa permutação de reversão, à custa de que esse circuito implemente a "QFT-com-reversão" em vez da QFT. Como alternativa, a passagem ElidePermutations transpiler é capaz de remover essas portas de troca.
Parâmetros
- num_qubits (int) – O número de qubits nos quais a Transformada Quântica de Fourier atua.
- do_swaps (bool) – Se deve sintetizar a operação "QFT" ou "QFT-com-reversão".
- approximation_degree (int) – O grau de aproximação (0 para nenhuma aproximação). É possível implementar o QFT aproximadamente ignorando as rotações de fase controlada com o ângulo abaixo de um limite. Isso é discutido em mais detalhes em https://arxiv.org/abs/quant-ph/9601018 ou https://arxiv.org/abs/quant-ph/0403071.
- insert_barriers (bool) – Se
True, são inseridas barreiras para melhorar a visualização. - inverse (bool) – Se
True, a Transformada de Fourier Quântica inversa é construída. - name (str | None) – O nome do circuito.
Retorna
Um circuito que implementa a operação QFT.
Tipo de retorno
Síntese Unitária
Decomposição de matrizes unitárias gerais para qualquer número de qubits.
qs_decomposition
qiskit.synthesis.qs_decomposition(mat, opt_a1=None, opt_a2=None, decomposer_1q=None, decomposer_2q=None, *, _depth=0)
Decompõe uma matriz unitária em portas de um e dois qubits usando a Decomposição Quântica de Shannon, com base na Decomposição ZXZ de Bloco.
Essa decomposição é descrita em Krol e Al-Ars [2] e aprimora o método de Shende et al. [1].
┌───┐ ┌───┐ ┌───┐
─┤ ├─ ────□──┤ H ├──□──┤ H ├──□──
│ │ ≃ ┌─┴─┐└───┘┌─┴─┐└───┘┌─┴─┐
/─┤ ├─ ──┤ C ├─────┤ B ├─────┤ A ├
└───┘ └───┘ └───┘ └───┘O número de CXGates gerados com a decomposição sem otimizações é o mesmo que o método não otimizado em [1] :
Se opt_a1 = True, a contagem de CX é reduzida, melhorando [1], por:
Salvando dois CXGates em vez de um em cada etapa da recursão.
Se opt_a2 = True, a contagem de CX é reduzida, como em [1], por:
Portanto, o número de CXGates gerados com a decomposição com otimizações é
Parâmetros
- mat (ndarray) – matriz unitária para decompor
- opt_a1 (bool | None) – se deve tentar a otimização A.1 de [1, 2]. Isso deve eliminar 2
cxpor chamada. - opt_a2 (bool | None) – se deve tentar a otimização A.2 de [1, 2]. Isso decompõe as unidades de dois qubits em uma porta diagonal e uma unidade de dois
cxe reduz a contagem geral decxem . Essa otimização não deve ser feita se a unitária original for controlada. - decomposer_1q (Callable[[ndarray], QuantumCircuit] | None) – descomponedor opcional do tipo
1Q. Se for None, usaOneQubitEulerDecomposer. - decomposer_2q (Callable[[ndarray], QuantumCircuit] | None) – descomponedor opcional do tipo
2Q. Se for None, usaTwoQubitBasisDecomposer.
Retorna
Circuito quântico decomposto.
Tipo de retorno
Referências
- Shende, Bullock, Markov, Synthesis of Quantum Logic Circuits (Síntese de circuitos lógicos quânticos ), arXiv:0406176 [quant-ph]
- Krol, Al-Ars, Beyond Quantum Shannon: Circuit Construction for General n-Qubit Gates Based on Block ZXZ-Decomposition (Além do Quantum Shannon: construção de circuitos para portas gerais de n-Qubit com base na decomposição ZXZ de blocos ), arXiv:2403.13692
O Compilador Quântico Aproximado está disponível como o módulo qiskit.synthesis.unitary.aqc.
Síntese de um qubit
OneQubitEulerDecomposer([base, use_dag] ) | Uma classe para decompor unitários de 1 qubit em rotações de ângulo de Euler. |
Síntese de dois qubits
TwoQubitBasisDecomposer(portão[,...] ) | Uma classe para decompor unitários de 2 qubits em um número mínimo de usos de uma porta de base de 2 qubits. |
XXDecomposer([base_fidelidade, euler_base,...] ) | Uma classe para a decomposição ótima de operadores unitários de 2 qubits em portas de base de 2 qubits do XX tipo (ou seja, cada uma localmente equivalente a , para um que pode variar). |
TwoQubitWeylDecomposition(unitário_matriz[,...] ) | Decomposição de Weyl de dois qubits. |
TwoQubitControlledUDecomposer(...[, euler_basis] ) | Decomponha o unitário de dois qubits em termos de uma porta desejada que seja localmente equivalente a um RXXGate. |
two_qubit_cnot_decompose
qiskit.synthesis.two_qubit_cnot_decompose(*args, **kwargs)
Essa é uma instância de TwoQubitBasisDecomposer que sempre usa cx como a porta KAK para a decomposição da base. Você pode usar essa função como um acesso rápido às decomposições de 2 qubits baseadas em cx.
Parâmetros
- unitary (Operator or np.ndarray) – O 4x4 unitário para sintetizar.
- basis_fidelity (float or None) – Se for dada a fidelidade presumida para aplicativos de
CXGate. - approximate (bool) – Se
Trueaproximado sebasis_fidelityfor menor que 1.0.
Retorna
O circuito sintetizado do unitário de entrada.
Tipo de retorno
Síntese Multicontrolada
synth_mcmt_vchain
qiskit.synthesis.synth_mcmt_vchain(gate, num_ctrl_qubits, num_target_qubits, ctrl_state=None)
Sintetizar MCMT usando uma cadeia em V.
Isso usa uma cadeia de portas CCX, usando num_ctrl_qubits - 1 qubits auxiliares.
Por exemplo, uma porta H de 3 controles e 2 alvos será sintetizada como:
q_0: ──■────────────────────────■──
│ │
q_1: ──■────────────────────────■──
│ │
q_2: ──┼────■──────────────■────┼──
│ │ ┌───┐ │ │
q_3: ──┼────┼──┤ H ├───────┼────┼──
│ │ └─┬─┘┌───┐ │ │
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
└───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
q_6: ─────┤ X ├──■────■──┤ X ├─────
└───┘ └───┘Parâmetros
- gate (Gate) – Porta de base a ser aplicada aos alvos.
- num_ctrl_qubits (int) – Número de qubits de controle.
- num_target_qubits (int) – Número de qubits de destino.
- ctrl_state (int | None) – Estado de controle opcional como um número inteiro.
Retorna
O circuito sintetizado para a porta MCMT.
Tipo de retorno
synth_mcmt_xgate
qiskit.synthesis.synth_mcmt_xgate(num_ctrl_qubits, num_target_qubits, ctrl_state=None)
Sintetizar a porta MCMT X.
Isso usa uma estrutura de circuito especial que é eficiente para portas MCMT X. Ele não requer qubits auxiliares e se beneficia de decomposições MCX eficientes.
E.g. uma porta X de 3 controles e 3 alvos será sintetizada como:
q_0: ─────────────■────────────
|
q_1: ─────────────■────────────
|
q_2: ─────────────■────────────
┌─┴─┐
q_3: ────────■──┤ X ├──■───────
┌─┴─┐└───┘┌─┴─┐
q_4: ───■──┤ X ├─────┤ X ├──■──
┌─┴─┐└───┘ └───┘┌─┴─┐
q_5: ─┤ X ├───────────────┤ X ├
└───┘ └───┘Parâmetros
- num_ctrl_qubits (int) – Número de qubits de controle.
- num_target_qubits (int) – Número de qubits de destino.
- ctrl_state (int | None) – Estado de controle opcional como um número inteiro.
Retorna
O circuito sintetizado para a porta MCMT X.
Tipo de retorno
synth_mcx_1_clean_kg24
qiskit.synthesis.synth_mcx_1_clean_kg24(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando um qubit auxiliar limpo d , produzindo um circuito com portas d Toffoli ou portas CX d e profundidade , conforme descrito na Seção. 5.1 de [1]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
1. Khattar e Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits arXiv:2407.17966
synth_mcx_1_dirty_kg24
qiskit.synthesis.synth_mcx_1_dirty_kg24(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando um qubit auxiliar sujo d , produzindo um circuito com portas d Toffoli ou portas CX d e profundidade , conforme descrito na Seção. 5.3 de [1]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
1. Khattar e Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits arXiv:2407.17966
synth_mcx_2_clean_kg24
qiskit.synthesis.synth_mcx_2_clean_kg24(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando qubits auxiliares limpos d , produzindo um circuito com portas d Toffoli ou portas d CX e profundidade d , conforme descrito na Seção. 5.2 de [1]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
1. Khattar e Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits arXiv:2407.17966
synth_mcx_2_dirty_kg24
qiskit.synthesis.synth_mcx_2_dirty_kg24(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando qubits auxiliares sujos d , produzindo um circuito com portas d Toffoli ou portas d CX e profundidade d , conforme descrito na Seção. 5.4 de [1]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
1. Khattar e Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits arXiv:2407.17966
synth_mcx_n_dirty_i15
qiskit.synthesis.synth_mcx_n_dirty_i15(num_ctrl_qubits, relative_phase=False, action_only=False)
Sintetize uma porta X multicontrolada com controles com base no artigo de Iten et al. [1].
Para um circuito de tipo , o método utiliza qubits auxiliares “dirty”, produzindo um circuito com qubits e, no máximo, portas CX. No caso de um o, utilizam-se, em vez disso, circuitos eficientes explicitamente construídos que não requerem qubits auxiliares.
Parâmetros
- num_ctrl_qubits (int) – O número de qubits de controle.
- relative_phase (bool) – quando definido como
True, o método aplica a porta X multicontrolada otimizada até uma fase relativa, de modo que, pelo lema 8 de [1], as fases relativas doaction partse cancelam com as fases doreset part. - action_only (bool) – quando definido como
True, o método aplica apenas oaction partdo lema 8 de [1].
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
- Iten et al. et al., Circuitos quânticos para isometrias, Phys. Rev. A 93, 23/03/2018 (2016), arXiv:1501.06911
synth_mcx_n_clean_m15
qiskit.synthesis.synth_mcx_n_clean_m15(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando qubits auxiliares limpos d , de modo a produzir um circuito com qubits d e, no máximo, portas CX, segundo Maslov [1]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
- Maslov, Física. Rev. A 93, 022311 (2016), arXiv:1508.03273
synth_mcx_1_clean_b95
qiskit.synthesis.synth_mcx_1_clean_b95(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles d , utilizando um único qubit auxiliar limpo, produzindo um circuito com qubits e, no máximo, portas CX, por [1], [2]. Para um circuito do tipo , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a um e, respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
- Barenco et. al, Elementary gates for quantum computation (Portas elementares para computação quântica ), Phys.Rev. A52 3457 (1995), arXiv:quant-ph/9503016
- Iten et al. et al., Circuitos quânticos para isometrias, Phys. Rev. A 93, 23/03/2018 (2016), arXiv:1501.06911
synth_mcx_noaux_v24
qiskit.synthesis.synth_mcx_noaux_v24(num_ctrl_qubits)
Sintetize uma porta X multicontrolada com controles com base na implementação para MCPhaseGate.
Por sua vez, a porta MCPhase usa a decomposição para unidades especiais multicontroladas descritas em [1].
Produz um circuito quântico com qubits. O número de CX-gates é quadrático em .
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
- Vale et. al, Circuit Decomposition of Multicontrolled Special Unitary Single-Qubit Gates, IEEE TCAD 43(3) (2024), arXiv:2302.06377
synth_mcx_noaux_hp24
qiskit.synthesis.synth_mcx_noaux_hp24(num_ctrl_qubits)
Sintetize um X gate multicontrolado com controles com base no trabalho de Huang e Palsberg.
Produz um circuito quântico com qubits. O número de CX-gates é linear em .
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Retorna
O circuito quântico sintetizado.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Tipo de retorno
Referências
- Huang e Palsberg, Compiling Conditional Quantum Gates without Using Helper Qubits, PLDI (2024), <https://dl.acm.org/doi/10.1145/3656436> `_
synth_mcx_gray_code
qiskit.synthesis.synth_mcx_gray_code(num_ctrl_qubits)
Sintetize uma porta X com múltiplos controles e controles do tipo utilizando o código Gray.
Gera um circuito quântico com qubits. Este método gera um número exponencial de portas CX e deve ser utilizado apenas para valores pequenos de . Para , o circuito resultante consiste em uma única porta X, CX ou CCX (correspondendo a , respectivamente) e não utiliza qubits auxiliares.
Parâmetros
num_ctrl_qubits (int) – O número de qubits de controle.
Aumentos
QiskitError – se num_ctrl_qubits for ilegal.
Retorna
O circuito quântico sintetizado.
Tipo de retorno
synth_c3x
synth_c4x
Síntese aritmética binária
Víbora
adder_qft_d00
qiskit.synthesis.adder_qft_d00(num_state_qubits, kind='half', annotated=False)
Um circuito que usa QFT para realizar a adição no local em dois registros de qubit.
Para registros com qubits, o somador QFT pode executar o módulo de adição (com kind="fixed") ou a adição comum adicionando qubits de transporte (com kind="half"). O somador fixo usa CPhaseGate operadores, com um adicional para o meio somador.
Como exemplo, um circuito somador QFT sem ponto fixo que realiza a adição em dois registros de tamanho de 2 qubit é o seguinte:
a_0: ─────────■──────■────────■──────────────────────────────────
│ │ │
a_1: ─────────┼──────┼────────┼────────■──────■──────────────────
┌──────┐ │ │ │P(π/4) │ │P(π/2) ┌─────────┐
b_0: ┤0 ├─┼──────┼────────■────────┼──────■───────┤0 ├
│ │ │ │P(π/2) │P(π) │ │
b_1: ┤1 Qft ├─┼──────■─────────────────■──────────────┤1 qft_dg ├
│ │ │P(π) │ │
cout: ┤2 ├─■───────────────────────────────────────┤2 ├
└──────┘ └─────────┘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
"half"para um meio somador ou"fixed"para um somador de tamanho fixo. Um meio somador contém um carry-out para representar o bit mais significativo, mas o somador de tamanho fixo não contém e, portanto, executa o módulo de adição2 ** num_state_qubits. - annotated (bool) – Se for
True, crie operações de controle e inversas apropriadas como objetosAnnotatedOperation.
Tipo de retorno
Referências
[1] T. G. Draper, Addition on a Quantum Computer (Adição em um computador quântico), 2000. arXiv:quant-ph/0008033
[2] Ruiz-Perez et al, Aritmética quântica com a transformada quântica de Fourier, 2017. arXiv:1411.5949
[3] Vedral et al, Quantum Networks for Elementary Arithmetic Operations (Redes Quânticas para Operações Aritméticas Elementares), 1995. arXiv:quant-ph/9511018
adder_ripple_c04
qiskit.synthesis.adder_ripple_c04(num_state_qubits, kind='half')
Um circuito de transporte de ondulação para realizar a adição no local em dois registros de qubit.
Esse circuito usa CCX gates e CX gates, em uma profundidade de [1]. A constante depende do tipo de somador implementado.
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. Ao contrário 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.
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.
Aumentos
ValueError - Se num_state_qubits for menor que 1.
Tipo de retorno
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
adder_ripple_v95
qiskit.synthesis.adder_ripple_v95(num_state_qubits, kind='half')
O somador de transporte de ondulação VBE [1].
Esse método usa CCX gates e CX gates em uma profundidade de [2].
Esse circuito realiza a adição no local de dois registros quânticos de tamanho igual. Como exemplo, um circuito somador clássico que executa a adição total (ou seja, incluindo um bit de transporte) em dois registros de tamanho 2-qubit é o seguinte:
┌────────┐ ┌───────────┐┌──────┐
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 ├────────
└────────┘└────────┘ └──────┘└───────────┘Aqui, as portas de transporte e soma correspondem às portas introduzidas em [1]. Carry_dg correspondem ao inverso da porta Carry. 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. Essa é uma ordenação diferente em comparação com a Figura 2 em [1], o que leva a um desenho diferente do circuito.
Parâmetros
- num_state_qubits (int) – O tamanho do registro.
- 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.
Aumentos
ValueError - Se num_state_qubits for menor que 1.
Tipo de retorno
Referências
[1] Vedral et al, Quantum Networks for Elementary Arithmetic Operations (Redes Quânticas para Operações Aritméticas Elementares), 1995. arXiv:quant-ph/9511018
[2] Cuccaro et al, Um novo circuito quântico de adição de transporte de ondulação, 2004. arXiv:quant-ph/0410184
adder_ripple_r25
qiskit.synthesis.adder_ripple_r25(num_qubits)
O somador de transporte de ondulação RV [1]. Construa um circuito somador quântico sem ancilla com profundidade sublinear com base no somador RV ripple-carry mostrado em [1]. A implementação tem uma profundidade de e usa math:O(n log n) gates.
Como exemplo, um circuito somador ripple-carry que realiza a adição em dois registros de 4 qubits é o seguinte:
┌───────────┐ ┌────────┐
a_0: ─────────────────────────┤0 ├────────────────────┤0 ├───────────────■─────────────────
┌────────┐│ │ │ │┌───────────┐ │
a_1: ──■────────────┤0 ├┤2 ├──■─────────────────┤2 ├┤0 ├──┼────■────────────
│ │ ││ │ │ │ ││ │ │ │
a_2: ──┼────■───────┤1 ├┤4 ├──┼────■────────────┤4 ├┤1 LAD_1_dg ├──┼────┼────■───────
│ │ │ ││ │ │ │ │ ││ │ │ │ │
a_3: ──┼────┼────■──┤2 ├┤6 ├──┼────┼────■───────┤6 LAD_2 ├┤2 ├──┼────┼────┼────■──
│ │ │ │ ││ │ │ │ │ │ │└───────────┘┌─┴─┐ │ │ │
b_0: ──┼────┼────┼──┤ ├┤1 LAD_2_dg ├──┼────┼────┼───────┤1 ├─────────────┤ X ├──┼────┼────┼──
┌─┴─┐ │ │ │ LAD_1 ││ │┌─┴─┐ │ │ ┌───┐│ │ ┌───┐ └───┘┌─┴─┐ │ │
b_1: ┤ X ├──┼────┼──┤ ├┤3 ├┤ X ├──┼────┼──┤ X ├┤3 ├────┤ X ├─────────┤ X ├──┼────┼──
└───┘┌─┴─┐ │ │ ││ │└───┘┌─┴─┐ │ ├───┤│ │ ├───┤ └───┘┌─┴─┐ │
b_2: ─────┤ X ├──┼──┤ ├┤5 ├─────┤ X ├──┼──┤ X ├┤5 ├────┤ X ├──────────────┤ X ├──┼──
└───┘┌─┴─┐│ ││ │ └───┘┌─┴─┐└───┘└────────┘ └───┘ └───┘┌─┴─┐
b_3: ──────────┤ X ├┤ ├┤7 ├──────────┤ X ├───────────────────────────────────────────┤ X ├
└───┘│ ││ │ └───┘ └───┘
cout: ───────────────┤3 ├┤8 ├───────────────────────────────────────────────────────────────
└────────┘└───────────┘Aqui LAD_1 e LAD_2 são as escadas CX e CCX, respectivamente, 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.
Parâmetros
num_qubits (int) – O tamanho do registro.
Retorna
O circuito quântico que implementa o somador de transporte de ondulação RV.
Aumentos
ValueError - Se num_qubits for menor que 1.
Tipo de retorno
Referências
1. Remaud e Vandaele, Ancilla-free Quantum Adder with Sublinear Depth, 2025. arXiv:2501.16802
adder_modular_v17
qiskit.synthesis.adder_modular_v17(num_qubits)
Construa um circuito somador modular sem qubits auxiliares com base no somador do tipo Van Rentergem da Fig. 15 de [1]. A implementação usa no máximo CX gates para um somador com k qubits em cada registro, onde k = num_qubits.
Parâmetros
num_qubits (int) – O tamanho do registro.
Retorna
O circuito quântico que implementa o somador modular.
Aumentos
ValueError - Se num_qubits for menor que 1.
Tipo de retorno
Referências
[1] Gidney, Factoring com n+2 qubits limpos e n-1 qubits sujos, 2017. arxiv:1706.07884
multiplicadores
multiplier_cumulative_h18
qiskit.synthesis.multiplier_cumulative_h18(num_state_qubits, num_result_qubits=None)
Um circuito de multiplicação para armazenar o produto de dois registros de entrada fora do lugar.
O circuito usa a abordagem da Ref. [1]. Por exemplo, um circuito multiplicador que realiza uma multiplicação não modular em dois registros de 3 qubits é:
from qiskit.synthesis.arithmetic import multiplier_cumulative_h18
num_state_qubits = 3
circuit = multiplier_cumulative_h18(num_state_qubits)
circuit.draw("mpl")
A multiplicação nesse circuito é implementada em uma abordagem clássica, executando uma série de adições deslocadas usando um dos registros de entrada, enquanto os qubits do outro registro de entrada atuam como qubits de controle para os somadores.
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.
- num_result_qubits (int | None) – O número de qubits de resultado para limitar a saída. Se o número de qubits de resultado for , o módulo de multiplicação será executado para limitar a saída ao número especificado de qubits. O valor padrão é
2 * num_state_qubitspara representar qualquer resultado possível da multiplicação das duas entradas.
Aumentos
ValueError - Se num_result_qubits for fornecido e não for válido, significa que não está em [num_state_qubits, 2 * num_state_qubits].
Tipo de retorno
Referências
[1] Häner et al, Otimização de circuitos quânticos para aritmética, 2018. arXiv:1805.12445
multiplier_qft_r17
qiskit.synthesis.multiplier_qft_r17(num_state_qubits, num_result_qubits=None)
Um circuito de multiplicação QFT para armazenar o produto de dois registros de entrada fora do lugar.
A multiplicação nesse circuito é implementada usando o procedimento da Fig. 3 em [1], em que as rotações de soma ponderada são implementadas conforme indicado na Fig. 5 em [1]. O QFT é usado no registro de saída e é seguido por rotações controladas por registros de entrada. As rotações transformam o estado no produto de dois registros de entrada na base QFT, que é revertida da base QFT usando a QFT inversa. Por exemplo, em 3 qubits de estado, um multiplicador completo é dado por:
from qiskit.synthesis.arithmetic import multiplier_qft_r17
num_state_qubits = 3
circuit = multiplier_qft_r17(num_state_qubits)
circuit.draw("mpl")
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.
- num_result_qubits (int | None) – O número de qubits de resultado para limitar a saída. Se o número de qubits de resultado for , o módulo de multiplicação será executado para limitar a saída ao número especificado de qubits. O valor padrão é
2 * num_state_qubitspara representar qualquer resultado possível da multiplicação das duas entradas.
Aumentos
ValueError - Se num_result_qubits for fornecido e não for válido, significa que não está em [num_state_qubits, 2 * num_state_qubits].
Tipo de retorno
Referências
[1] Ruiz-Perez et al, Aritmética quântica com a transformada quântica de Fourier, 2017. arXiv:1411.5949
Somas
synth_weighted_sum_carry
qiskit.synthesis.synth_weighted_sum_carry(weighted_sum)
Sintetize uma porta de soma ponderada, pelo número de qubits de estado e os pesos dos qubits.
Esse método está descrito no Apêndice A de [1].
Referência:
[1] Stamatopoulos et al. Precificação de opções usando computadores quânticos (2020)
Parâmetros
weighted_sum (WeightedSumGate)
Tipo de retorno
Síntese aritmética unária
Comparadores de inteiros
synth_integer_comparator_2s
qiskit.synthesis.synth_integer_comparator_2s(num_state_qubits, value, geq=True)
Implemente uma comparação de números inteiros com base no complemento 2s.
Isso se baseia no Apêndice B de [1].
Parâmetros
- num_state_qubits (int) – O número de qubits que codificam o valor a ser comparado.
- value (int) – O valor a ser comparado.
- geq (bool) – Se
Trueinverter o bit de destino se o estado do qubit for do que o valor, caso contrário, implemente .
Retorna
Um circuito que implementa o comparador de números inteiros.
Tipo de retorno
Referências
[1] J. Gacon et al. "Otimização baseada em simulação aprimorada por quantum"
synth_integer_comparator_greedy
qiskit.synthesis.synth_integer_comparator_greedy(num_state_qubits, value, geq=True)
Implemente uma comparação de números inteiros com base na comparação de valor por valor.
Para value menor que 2 ** (num_state_qubits - 1) , esse circuito implementa value portas multicontroladas com estados de controle 0, 1,..., value - 1, de modo que o qubit de destino seja invertido se o estado do qubit representar qualquer um dos valores permitidos. Para value maior que isso, geq é invertido. Essa implementação pode exigir um número exponencial de portas. Se os qubits auxiliares estiverem disponíveis, a implementação fornecida por synth_integer_comparator_2s() é mais eficiente.
Parâmetros
- num_state_qubits (int) – O número de qubits que codificam o valor a ser comparado.
- value (int) – O valor a ser comparado.
- geq (bool) – Se
Trueinverter o bit de destino se o estado do qubit for do que o valor, caso contrário, implemente .
Retorna
Um circuito que implementa o comparador de números inteiros.
Tipo de retorno