Skip to main content
IBM Quantum Platform

SolovayKitaev

class qiskit.transpiler.passes.SolovayKitaev(*args, **kwargs)

GitHub

Bases: TransformationPass

Decomponha aproximadamente as portas 1q em uma base discreta usando o algoritmo Solovay-Kitaev.

O teorema [1] de Solovay-Kitaev afirma que qualquer porta de qubit único pode ser aproximada com precisão arbitrária por um conjunto de portas de qubit único fixas, se o conjunto gerar um subconjunto denso em SU(2)SU(2). Esse é um resultado importante, pois significa que qualquer porta de um único qubit pode ser expressa em termos de um conjunto de portas discretas e universais que sabemos como implementar de forma tolerante a falhas. Portanto, o algoritmo Solovay-Kitaev nos permite pegar qualquer circuito não tolerante a falhas e reformulá-lo de maneira tolerante a falhas.

Essa implementação do algoritmo Solovay-Kitaev é baseada em [2].

Por exemplo, o seguinte circuito

     ┌─────────┐
q_0: ┤ RX(0.8) ├
     └─────────┘

pode ser decomposto em

global phase: 7π/8
     ┌───┐┌───┐┌───┐
q_0: ┤ H ├┤ T ├┤ H ├
     └───┘└───┘└───┘

com um L2-error de aproximadamente 0.01.

Exemplos

Por padrão, o conjunto de portas de base é ["t", "tdg", "h"]:

import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes.synthesis import SolovayKitaev
from qiskit.quantum_info import Operator

circuit = QuantumCircuit(1)
circuit.rx(0.8, 0)

print("Original circuit:")
print(circuit.draw())

skd = SolovayKitaev(recursion_degree=2)

discretized = skd(circuit)

print("Discretized circuit:")
print(discretized.draw())

print("Error:", np.linalg.norm(Operator(circuit).data - Operator(discretized).data))
Original circuit:
   ┌─────────┐
q: ┤ Rx(0.8) ├
   └─────────┘
Discretized circuit:
global phase: 7π/8
   ┌───┐┌───┐┌───┐
q: ┤ H ├┤ T ├┤ H ├
   └───┘└───┘└───┘
Error: 2.828408279166474

Conjuntos de portas individuais podem ser especificados no inicializador.

from qiskit.transpiler.passes import SolovayKitaev

basis = ["s", "sdg", "t", "tdg", "z", "h"]

skd = SolovayKitaev(recursion_degree=2, basis_gates=basis)

Para gerar e armazenar aproximações básicas entre diferentes instâncias, o método SolovayKitaevDecomposition e seu save_basic_approximations() método podem ser usados.

from qiskit.transpiler.passes import SolovayKitaev
from qiskit.synthesis import SolovayKitaevDecomposition

# generate basic approximations
basis = ["s", "sdg", "t", "tdg", "z", "h"]
decomp = SolovayKitaevDecomposition(basis_gates=basis, depth=5)

# store them in a local file
fname = "sk_approx.bin"
decomp.save_basic_approximations(fname)

# load them for running Solovay-Kitaev
skd = SolovayKitaev(recursion_degree=2, basic_approximations=fname)

Referências

[1] Kitaev, A Yu (1997). Cálculos quânticos: algoritmos e correção de erros. Pesquisas matemáticas russas. 52 (6): 1191–1249. Online.

[2] Dawson, Christopher M.; Nielsen, Michael A. (2005) O Algoritmo Solovay-Kitaev. arXiv:quant-ph/0505030.

Parâmetros

  • recursion_degree - A profundidade de recursão do algoritmo Solovay-Kitaev. Uma profundidade de recursão maior aumenta a precisão e o comprimento da decomposição.
  • basic_approximations - As aproximações básicas para encontrar a melhor decomposição discreta na raiz da recursão. Se for uma cadeia de caracteres, especifica o arquivo do qual carregar as aproximações. Se for um dicionário, ele contém {label: SO(3)-matrix} pairs. Se for None, será gerado um padrão com base nos portões HH, TT e TT^\dagger até a profundidade 16. Observe que, se basic_approximations for passado, basis_gates e depth não poderão ser definidos.
  • basis_gates - As portas de base usadas para construir a rede de aproximações básicas. O padrão é ["h", "t", "tdg"]. Esse argumento não pode ser definido se basic_approximations for fornecido.
  • depth - A profundidade máxima da porta usada em aproximações básicas. Esse argumento não pode ser definido se basic_approximations for fornecido.

Atributos

is_analysis_pass

Verificar se o passe é um passe de análise.

Se a passagem for um AnalysisPass,, isso significa que a passagem pode analisar o DAG e escrever os resultados dessa análise no conjunto de propriedades. As modificações no DAG não são permitidas por esse tipo de passe.

is_transformation_pass

Verificar se o passe é um passe de transformação.

Se a passagem for um TransformationPass,, isso significa que a passagem pode manipular o DAG, mas não pode modificar o conjunto de propriedades (mas pode ser lido).


Métodos

execute

execute(passmanager_ir, state, callback=None)

GitHub

Executar a tarefa de otimização para a entrada Qiskit IR.

Parâmetros

  • passmanager_ir (Any) – Qiskit IR para otimizar.
  • state (PassManagerState) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passes.
  • callback (Callable | None) – Uma função de retorno de chamada que é chamada a cada execução da tarefa de otimização.

Retorna

Qiskit IR otimizado e estado do fluxo de trabalho.

Tipo de retorno

tupla [ Any, PassManagerState ]

name

name()

GitHub

Nome do passe.

Tipo de retorno

str

run

run(dag)

GitHub

Execute o passe SolovayKitaev no dag.

Parâmetros

dag (DAGCircuit) – A entrada dag.

Retorna

Saída dag com 1q gates sintetizados na base de alvo discreto.

Aumentos

TranspilerError – se um portão não tiver que_matrix

Tipo de retorno

DAGCircuit

update_status

update_status(state, run_state)

GitHub

Atualizar o status do fluxo de trabalho.

Parâmetros

  • state (PassManagerState) – Passar o estado do gerenciador para atualizar.
  • run_state (RunState) – Status de conclusão da tarefa atual.

Retorna

Estado do gerenciador de passes atualizado.

Tipo de retorno

PassManagerState

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.