Skip to main content
IBM Quantum Platform

Bibliothèque de circuits

La bibliothèque de circuits Qiskit contient des fonctions et des modules de haut niveau permettant de créer des circuits quantiques couramment utilisés.


Types de données

QkPauliProductRotation

struct QkPauliProductRotation

Une représentation des données de rotation du produit de Pauli.

Une rotation par produit de Pauli réalise une rotation d'un angle autour d'un axe défini par un produit de Pauli sur len qubits. Le vecteur Pauli est ici représenté au format ZX, avec deux tableaux booléens correspondant respectivement aux composantes Z et X.

bool *z

Pointeur vers un tableau len de longueur n contenant des composantes de type Z.

bool *x

Pointeur vers un tableau len de longueur x éléments.

size_t len

Le nombre de termes de Pauli.

QkParam *angle

L'angle de rotation.

QkPauliProductMeasurement

struct QkPauliProductMeasurement

Une représentation des données de mesure du produit de Pauli.

Une mesure de produit de Pauli consiste à effectuer une projection sur l'espace propre du produit de Pauli défini sur len qubits. Le vecteur Pauli est ici représenté au format ZX, avec deux tableaux booléens correspondant aux composantes Z et X; il peut comporter un signe moins, indiqué par flip_outcome.

bool *z

Pointeur vers un tableau len de longueur n contenant des composantes de type Z.

bool *x

Pointeur vers un tableau len de longueur x éléments.

size_t len

Le nombre de termes de Pauli.

bool résultat_du_tirage

Si le résultat de la mesure comporte un signe moins.


Fonctions

qk_circuit_library_iqp

QkCircuit *qk_circuit_library_iqp(uint32_t num_qubits, const int64_t *interactions, bool check_input)

Générer un circuit à polynôme quantique instantané (IQP) à partir d'une matrice d'interaction entière.

La interactions matrice est interprétée comme un tableau n × n orienté par les lignes contenant des entiers de 64 bits, où n = num_qubits. Les éléments diagonaux définissent des puissances de phase de type T, tandis que le triangle supérieur code les interactions CPhase à deux qubits.

Sécurité

Si num_qubits > 0, interactions doit être un pointeur valide et non nul pointant vers au moins num_qubits * num_qubits valeurs int64_t contiguës classées selon l'ordre des lignes. La mémoire pointée par interactions doit être correctement alignée, accessible en lecture pendant toute la durée de cet appel et ne pas faire l'objet d'un alias mutable. Le fait de passer un pointeur non valide ou un tampon trop petit entraîne un comportement indéfini.

Paramètres

  • num_qubits – Nombre de qubits logiques (n). Doit correspondre à la dimension de la interactions matrice.
  • interactions – Pointeur vers une matrice à n × n rangs majeurs de type int64_t. Ne peut être NULL que si num_qubits == 0.
  • check_input – Lorsque cette fonction true est appelée, elle vérifie si la matrice est symétrique et renvoie une valeur NULL si ce n'est pas le cas. Dans ce cas false, aucune validation supplémentaire n'est effectuée.

Retours

Une matrice nouvellement allouée QkCircuit* en cas de réussite (l'appelant doit la libérer avec qk_circuit_free), ou NULL si num_qubits > 0 et interactions est NULL, ou si check_input est true et que la matrice n'est pas symétrique.

qk_circuit_library_random_iqp

QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)

Générer un circuit polynomial quantique instantané (IQP) aléatoire.

Cela génère en interne une matrice d'interaction symétrique aléatoire d'entiers et l'utilise pour construire un circuit IQP, à l'instar du constructeur qiskit.circuit.library.IQPPython.

Paramètres

  • num_qubits – Nombre de qubits.
  • graine – graine du générateur aléatoire. Si la valeur est négative, l'entropie est extraite du système d'exploitation; dans le cas contraire, la valeur fournie est utilisée comme graine déterministe.

Retours

Une mémoire nouvellement allouée QkCircuit* (l'appelant doit la libérer avec qk_circuit_free).

qk_pauli_product_rotation_clear

void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)

Effacer les données internes des objets alloués par Rust QkPauliProductRotation.

Cela libère la mémoire des tableaux z x et et libère le angle. Cette fonction ne doit être appelée que pour QkPauliProductRotation les objets dont les données ont été renseignées par Rust.

Exemple

// let `circuit` be a QkCircuit* and `index` a size_t at the position of a QkPauliProductRotation
QkPauliProductRotation inst;

// query the QkPauliProductRotation data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductRotation);
qk_circuit_inst_pauli_product_rotation(circuit, index, &inst);

// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_rotation_clear(&inst);

En revanche, cette fonction ne doit pas être appelée si le langage C se charge déjà d'effacer les données.

bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {z, x, 4, angle};

// since this data is allocated by C, we do not call `qk_pauli_product_rotation_clear(&rotation)`!
qk_param_free(angle);

Sécurité

Le comportement est indéfini si inst n'est pas un pointeur valide et non nul vers un QkPauliProductRotation, ou si les données internes de QkPauliProductRotation sont incohérentes.

Paramètres

  • inst – Un pointeur vers l'élément QkPauliProductRotation à effacer.

qk_pauli_product_measurement_clear

void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)

Effacer les données internes des objets alloués par Rust QkPauliProductMeasurement.

Cela libère la mémoire des tableaux z x et. Cette fonction ne doit être appelée que pour QkPauliProductMeasurement les objets dont les données ont été renseignées par Rust.

Exemple

// let `circuit` be a QkCircuit* and `index` a size_t at the position
// of a QkPauliProductMeasurement
QkPauliProductMeasurement inst;

// query the QkPauliProductMeasurement data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductMeasurement);
qk_circuit_inst_pauli_product_measurement(circuit, index, &inst);

// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_measurement_clear(&inst);

En revanche, cette fonction ne doit pas être appelée si le langage C se charge déjà d'effacer les données.

bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkPauliProductMeasurement inst = {z, x, 4, true};

// since this data is allocated by C, we do not call `qk_pauli_product_measurement_clear(&inst)`

Sécurité

Le comportement est indéfini si inst n'est pas un pointeur valide et non nul vers un QkPauliProductMeasurement, ou si les données internes de QkPauliProductMeasurement sont incohérentes.

Paramètres

  • inst – Un pointeur vers l'élément QkPauliProductMeasurement à effacer.

qk_circuit_library_quantum_volume

QkCircuit *qk_circuit_library_quantum_volume(uint32_t num_qubits, size_t depth, int64_t seed)

Générer un circuit modèle Quantum Volume

Les circuits modèles sont des exemples aléatoires de circuits utilisés pour mesurer la métrique Quantum Volume, telle que présentée au point [1]. Les circuits modèles sont constitués de couches d'éléments aléatoires de Haar de SU(4) appliqués entre des paires correspondantes de qubits dans une bipartition aléatoire.

Cette fonction est multithread et lancera par défaut un pool de threads dont le nombre sera égal au nombre de processeurs. Vous pouvez régler le nombre de threads à l'aide de la variable d'environnement RAYON_NUM_THREADS. Par exemple, définir RAYON_NUM_THREADS=4 limiterait le pool de threads à 4 threads.

[1] A. Cross et al. Validation des ordinateurs quantiques à l'aide de circuits modèles aléatoires, Phys. Rév. A 100, 032328 (2019). arXiv:1811.12926

Exemple

QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)

Paramètres

  • num_qubits – Nombre de qubits à utiliser pour le circuit généré.
  • profondeur – Nombre de couches pour le circuit généré.
  • seed – Une graine RNG utilisée pour générer les matrices SU(4) aléatoires utilisées dans le circuit de sortie. Si le nombre fourni est négatif, la graine utilisée sera tirée de l'entropie du système.

Retours

Un pointeur vers le circuit de volume quantique.

qk_circuit_library_suzuki_trotter

QkCircuit *qk_circuit_library_suzuki_trotter(const QkObs *op, uint32_t order, uint32_t reps, double time, bool preserve_order, bool insert_barriers)

Générer un circuit à partir d'une observable en utilisant la formule du produit de Suzuki-Trotter d'ordre supérieur.

Les formules de Suzuki-Trotter corrigent l'erreur de l'approximation de Lie-Trotter. Dans cette mise en œuvre, les opérateurs sont représentés sous forme de termes de somme d'un opérateur de Pauli. Les décompositions d'ordre supérieur reposent sur des récursions, voir la référence. [1] pour plus de détails.

Exemple

QkObs *obs = qk_obs_zero(1);

QkBitTerm op1_bits[1] = {QkBitTerm_X};
QkObsTerm term1 = {(QkComplex64){1.0, 0.0}, 1, op1_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term1);

QkBitTerm op2_bits[1] = {QkBitTerm_Y};
QkObsTerm term2 = {(QkComplex64){1.0, 0.0}, 1, op2_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term2);

QkCircuit *qc = qk_circuit_library_suzuki_trotter(obs, 2, 1, 0.1, true, false);

qk_obs_free(obs);
qk_circuit_free(qc);

Sécurité

Le comportement est indéfini : ce op n'est pas un pointeur valide et non nul vers un QkObs.

Références

[1] : D. Berry, G., Ahokas, R., Cleve et B. Sanders, « Algorithmes quantiques efficaces pour la simulation d'hamiltoniens clairsemés » (2006). arXiv:quant-ph/0508139

[2] : N. Hatano et M. Suzuki, « Détermination des formules de produits exponentiels d'ordre supérieur » (2005). arXiv:math-ph/0506007

Paramètres

  • op – L'opérateur QkObs contenant la somme des termes de Pauli.
  • ordre – L'ordre des termes de la formule du produit.
  • reps – Le nombre d'itérations.
  • temps – Le temps d'évolution.
  • preserve_order – Si cette falseoption est activée, elle permet de réorganiser les termes de l'opérateur afin d'obtenir éventuellement un circuit d'évolution moins profond. Cela n'a pas d'importance lorsqu'on synthétise une observable à un seul terme.
  • insert_barriers – Indique s'il faut insérer des séparateurs entre les termes.

Retours

Un pointeur vers le circuit généré.

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