Skip to main content
IBM Quantum Platform

SolovayKitaev

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

GitHub

Bases : TransformationPass

Décomposer approximativement les portes 1q en une base discrète à l'aide de l'algorithme Solovay-Kitaev.

Le théorème de Solovay-Kitaev [1] stipule que toute porte à qubit unique peut être approximée avec une précision arbitraire par un ensemble de portes à qubit unique fixes, si l'ensemble génère un sous-ensemble dense dans SU(2)SU(2). Il s'agit d'un résultat important, car il signifie que toute porte à qubit unique peut être exprimée en termes d'un ensemble de portes discret et universel que nous savons comment mettre en œuvre de manière tolérante aux fautes. Par conséquent, l'algorithme de Solovay-Kitaev nous permet de prendre n'importe quel circuit non tolérant aux fautes et de le reformuler de manière à ce qu'il soit tolérant aux fautes.

Cette mise en œuvre de l'algorithme de Solovay-Kitaev est basée sur [2.]

Par exemple, le circuit suivant

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

peut être décomposé en

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

avec un L2-error d'environ 0.01.

Exemples

Par défaut, l'ensemble de portes de base est ["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

Des ensembles de portes individuels peuvent être spécifiés dans l'initialiseur.

from qiskit.transpiler.passes import SolovayKitaev

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

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

Pour générer et stocker des approximations de base entre différentes instances, la méthode SolovayKitaevDecomposition et sa save_basic_approximations() méthode peuvent être utilisées.

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)

Références :

[1] Kitaev, A Yu (1997). Calculs quantiques : algorithmes et correction d'erreurs. Revue mathématique russe. 52 (6) : 1191-1249. En ligne.

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

Paramètres

  • recursion_degree - Profondeur de récursion pour l'algorithme Solovay-Kitaev. Une profondeur de récursion plus importante augmente la précision et la longueur de la décomposition.
  • basic_approximations - Approximations de base pour la recherche de la meilleure décomposition discrète à la racine de la récursion. S'il s'agit d'une chaîne, elle spécifie le fichier à partir duquel les approximations doivent être chargées. S'il s'agit d'un dictionnaire, il contient les paires {label: SO(3)-matrix} . Si None, un défaut basé sur les portes HH, TT et TT^\dagger jusqu'à la profondeur 16 est généré. Notez que si basic_approximations est transmis, basis_gates et depth ne peuvent pas être définis.
  • basis_gates - Portes de base utilisées pour construire le réseau d'approximations de base. La valeur par défaut est ["h", "t", "tdg"]. Cet argument ne peut pas être défini si basic_approximations est fourni.
  • depth - Profondeur maximale de la porte utilisée dans les approximations de base. Cet argument ne peut pas être défini si basic_approximations est fourni.

Attributs

is_analysis_pass

Vérifier si la passe est une passe d'analyse.

Si le passe est un AnalysisPass,, cela signifie qu'il peut analyser le DAG et écrire les résultats de cette analyse dans l'ensemble de propriétés. Les modifications sur le DAG ne sont pas autorisées par ce type de passe.

is_transformation_pass

Vérifier si le laissez-passer est un laissez-passer de transformation.

Si la passe est une TransformationPass,, cela signifie qu'elle peut manipuler le DAG, mais qu'elle ne peut pas modifier l'ensemble des propriétés (mais qu'elle peut les lire).


Méthodes

execute

execute(passmanager_ir, state, callback=None)

GitHub

Exécuter la tâche d'optimisation pour l'entrée Qiskit IR.

Paramètres

  • passmanager_ir (DAGCircuit) – IR Qiskit à optimiser.
  • state (DAGCircuit) – État lié à l'exécution du flux de travail par le gestionnaire de passes lui-même.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Une fonction de rappel qui est appelée à chaque exécution d'une tâche d'optimisation.

Retours

Qiskit IR optimisé et état du flux de travail.

Type de retour

tuple [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nom du laissez-passer.

Type de retour

str

run

run(dag)

GitHub

Exécuter la passe SolovayKitaev sur dag.

Paramètres

dag (DAGCircuit) – L'entrée dag.

Retours

Sortie dag avec 1q portes synthétisées dans la base cible discrète.

Augmentations

TranspilerError – si une porte ne doit pas_matrix

Type de retour

DAGCircuit

update_status

update_status(state, run_state)

GitHub

Mettre à jour le statut du flux de travail.

Paramètres

  • state (PassManagerState) – Transmettre l'état du gestionnaire à mettre à jour.
  • run_state (RunState) – Statut d'achèvement de la tâche en cours.

Retours

Mise à jour de l'état du gestionnaire de passe.

Type de retour

PassManagerState

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.