Skip to main content
IBM Quantum Platform

SolovayKitaev

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

GitHub

Basi: TransformationPass

Decomporre approssimativamente le porte di 1q in una base discreta utilizzando l'algoritmo di Solovay-Kitaev.

Il teorema di Solovay-Kitaev [1] afferma che qualsiasi porta a singolo qubit può essere approssimata con precisione arbitraria da un insieme di porte a singolo qubit fisse, se l'insieme genera un sottoinsieme denso in SU(2)SU(2). Si tratta di un risultato importante, poiché significa che qualsiasi porta a singolo qubit può essere espressa in termini di un insieme discreto e universale di porte che sappiamo come implementare in modo tollerante ai guasti. Pertanto, l'algoritmo di Solovay-Kitaev ci permette di prendere qualsiasi circuito non tollerante ai guasti e di riformularlo in modo tollerante ai guasti.

Questa implementazione dell'algoritmo di Solovay-Kitaev si basa su [2].

Ad esempio, il seguente circuito

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

può essere scomposto in

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

con un L2-error di circa 0.01.

Esempi

Per impostazione predefinita, il gate di base impostato è ["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

I set di porte individuali possono essere specificati nell'inizializzatore.

from qiskit.transpiler.passes import SolovayKitaev

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

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

Per generare e memorizzare approssimazioni di base tra diverse istanze, è possibile utilizzare il metodo SolovayKitaevDecomposition e il suo save_basic_approximations() metodo.

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)

Riferimenti:

[1] Kitaev, A Yu (1997). Calcoli quantistici: algoritmi e correzione degli errori. Indagini matematiche russe. 52 (6): 1191–1249. Online.

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

Parametri

  • grado_di_ricorsione - La profondità di ricorsione dell'algoritmo Solovay-Kitaev. Una maggiore profondità di ricorsione aumenta la precisione e la lunghezza della decomposizione.
  • approssimazioni_di_base - Le approssimazioni di base per trovare la migliore decomposizione discreta alla radice della ricorsione. Se è una stringa, specifica il file da cui caricare le approssimazioni. Se è un dizionario, contiene le coppie {label: SO(3)-matrix} . Se None, viene generato un valore predefinito basato sulle porte HH, TT e TT^\dagger fino alla profondità 16. Si noti che se viene passato basic_approximations , basis_gates e depth non possono essere impostati.
  • porte_base - Le porte base utilizzate per costruire la rete di approssimazioni di base. L'impostazione predefinita è ["h", "t", "tdg"]. Questo argomento non può essere impostato se viene fornito basic_approximations .
  • depth - La profondità massima del gate utilizzata nelle approssimazioni di base. Questo argomento non può essere impostato se viene fornito basic_approximations .

Attributi

is_analysis_pass

Controlla se il passaggio è un passaggio di analisi.

Se il passo è un AnalysisPass,, significa che il passo può analizzare il DAG e scrivere i risultati di tale analisi nel set di proprietà. Questo tipo di passaggio non consente di modificare il DAG.

is_transformation_pass

Controlla se il passaggio è un passaggio di trasformazione.

Se il passaggio è un TransformationPass,, significa che il passaggio può manipolare il DAG, ma non può modificare il set di proprietà (ma può essere letto).


Metodi

execute

execute(passmanager_ir, state, callback=None)

GitHub

Eseguire l'attività di ottimizzazione per l'IR Qiskit in ingresso.

Parametri

  • passmanager_ir (DAGCircuit) – Qiskit IR da ottimizzare.
  • state (DAGCircuit) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ad ogni esecuzione di un'attività di ottimizzazione.

Risultati

Qiskit IR ottimizzato e stato del flusso di lavoro.

Tipo di restituzione

tuple [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nome del passo.

Tipo di restituzione

STR

run

run(dag)

GitHub

Eseguire il passaggio SolovayKitaev su dag.

Parametri

dag (DAGCircuit) – L'input dag.

Risultati

Output dag con le porte 1q sintetizzate nella base di destinazione discreta.

Aumenti

TranspilerError – se un gate non deve_matrix

Tipo di restituzione

DAGCircuito

update_status

update_status(state, run_state)

GitHub

Aggiornare lo stato del flusso di lavoro.

Parametri

  • state (PassManagerState) – Passare lo stato del gestore da aggiornare.
  • run_state (RunState) – Stato di completamento dell'attività corrente.

Risultati

Stato aggiornato del gestore dei passaggi.

Tipo di restituzione

PassManagerState

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.