Skip to main content
IBM Quantum Platform

Libreria di circuiti

La libreria di circuiti Qiskit contiene funzioni ed elementi costitutivi di livello superiore per la realizzazione dei circuiti quantistici più comunemente utilizzati.


Tipi di dati

QkPauliProductRotation

struct QkPauliProductRotation

Una rappresentazione dei dati relativi alla rotazione del prodotto di Pauli.

Una rotazione del prodotto di Pauli consiste nella rotazione di un sistema di qubit angle attorno a un asse definito dal prodotto di Pauli su len tali qubit. Il vettore Pauli è qui rappresentato in formato ZX con due array booleani che rappresentano le componenti Z e X.

bool *z

Puntatore a un array len di lunghezza n contenente componenti di tipo Z.

bool *x

Puntatore a un array dilen lunghezza X componenti.

size_t lunghezza

Il numero dei termini di Pauli.

QkParam *angolo

L'angolo di rotazione.

QkPauliProductMeasurement

struct QkPauliProductMeasurement

Una rappresentazione dei dati di misurazione del prodotto Pauli.

Una misurazione del prodotto di Pauli implementa una proiezione nello spazio proprio del prodotto di Pauli definito su len qubit. Il vettore Pauli è qui rappresentato in formato ZX con due array booleani che indicano le componenti Z e X e può includere un segno meno, indicato da flip_outcome.

bool *z

Puntatore a un array len di lunghezza n contenente componenti di tipo Z.

bool *x

Puntatore a un array dilen lunghezza X componenti.

size_t lunghezza

Il numero dei termini di Pauli.

bool risultato_del_lancio

Se il risultato della misurazione presenta un segno meno.


Funzioni

qk_circuit_library_iqp

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

Genera un circuito a polinomio quantistico istantaneo (IQP) a partire da una matrice di interazione intera.

La interactions matrice viene interpretata come un array n × n a righe di interi a 64 bit, dove n = num_qubits. Le voci diagonali definiscono le potenze di fase di tipo T, mentre il triangolo superiore codifica le interazioni CPhase a due qubit.

Sicurezza

Se num_qubits > 0, interactions deve essere un puntatore valido e non nullo a almeno num_qubits * num_qubits valori int64_t contigui in ordine row-major. La memoria indicata da interactions deve essere correttamente allineata, leggibile per tutta la durata di questa chiamata e non soggetta ad alias mutabili. Il passaggio di un puntatore non valido o di un buffer troppo piccolo comporta un comportamento indefinito.

Parametri

  • num_qubits – Numero di qubit logici (n). Deve corrispondere alla dimensione della interactions matrice.
  • interazioni – Puntatore a una matrice n × n con disposizione a righe di tipo int64_t. Può essere NULL solo se num_qubits == 0.
  • check_input – Quando viene chiamata true, questa funzione verifica che la matrice sia simmetrica e restituisce un valore NULL se non lo è. In tal caso false, non viene eseguita alcuna verifica aggiuntiva.

Risultati

Una matrice appena allocata QkCircuit* in caso di successo (il chiamante deve liberarla con qk_circuit_free), oppure NULL se num_qubits > 0 e interactions è NULL, oppure se check_input è true e la matrice non è simmetrica.

qk_circuit_library_random_iqp

QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)

Genera un circuito quantistico polinomiale istantaneo (IQP) casuale.

Questo crea internamente una matrice di interazione simmetrica casuale di numeri interi e la utilizza per costruire un circuito IQP, rispecchiando il costruttore qiskit.circuit.library.IQP Python.

Parametri

  • num_qubits – Numero di qubit.
  • seme – seme RNG. Se il valore è negativo, l'entropia viene ricavata dal sistema operativo; in caso contrario, il valore specificato viene utilizzato come seme deterministico.

Risultati

Una memoria appena allocata QkCircuit* (il chiamante deve liberarla con qk_circuit_free).

qk_pauli_product_rotation_clear

void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)

Cancella i dati interni dei file allocati da Rust QkPauliProductRotation.

Questo libera la memoria degli array z x e e libera il angle. Questa funzione deve essere chiamata solo per QkPauliProductRotation gli oggetti i cui dati sono stati popolati da Rust.

Esempio

// 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);

Al contrario, questa funzione non dovrebbe essere chiamata se C provvede già a cancellare i dati.

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);

Sicurezza

Il comportamento è indefinito se non inst è un puntatore valido e non nullo a un QkPauliProductRotation, oppure se i dati interni di QkPauliProductRotation sono incoerenti.

Parametri

  • inst – Un puntatore all'elemento QkPauliProductRotation da cancellare.

qk_pauli_product_measurement_clear

void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)

Cancella i dati interni dei file allocati da Rust QkPauliProductMeasurement.

Questo libera la memoria degli z array x e. Questa funzione deve essere chiamata solo per QkPauliProductMeasurement gli oggetti i cui dati sono stati popolati da Rust.

Esempio

// 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);

Al contrario, questa funzione non dovrebbe essere chiamata se C provvede già a cancellare i dati.

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)`

Sicurezza

Il comportamento è indefinito se non inst è un puntatore valido e non nullo a un QkPauliProductMeasurement, oppure se i dati interni di QkPauliProductMeasurement sono incoerenti.

Parametri

  • inst – Un puntatore all'elemento QkPauliProductMeasurement da cancellare.

qk_circuit_library_quantum_volume

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

Generare un circuito modello Quantum Volume

I circuiti modello sono istanze casuali di circuiti utilizzati per misurare la metrica Quantum Volume, come introdotto nel punto [1]. I circuiti modello consistono in strati di elementi casuali di Haar di SU(4) applicati tra coppie corrispondenti di qubit in una bipartizione casuale.

Questa funzione è multithread e avvierà un pool di thread con un numero di thread pari al numero di CPU per impostazione predefinita. È possibile regolare il numero di thread con la variabile di ambiente RAYON_NUM_THREADS. Ad esempio, impostando RAYON_NUM_THREADS=4 si limiterà il pool di thread a 4 thread.

[1] A. Cross et al. Convalida dei computer quantistici utilizzando circuiti modello randomizzati, Phys. Rev. A 100, 032328 (2019). arXiv:1811.12926

Esempio

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

Parametri

  • num_qubits – Il numero di qubit da utilizzare per il circuito generato.
  • profondità – Il numero di livelli per il circuito generato.
  • seed – Un seme RNG utilizzato per generare le matrici SU(4) casuali utilizzate nel circuito di uscita. Se il numero fornito è negativo, il seme utilizzato sarà ricavato dall'entropia del sistema.

Risultati

Un puntatore al circuito del volume quantistico.

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)

Generare un circuito utilizzando la formula del prodotto di Suzuki-Trotter di ordine superiore a partire da un osservabile.

Le formule di Suzuki-Trotter migliorano l'errore dell'approssimazione di Lie-Trotter. In questa implementazione, gli operatori sono espressi come somme di termini di un operatore di Pauli. Le decomposizioni di ordine superiore si basano su ricorsioni; cfr. rif. [1] per ulteriori dettagli.

Esempio

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);

Sicurezza

Il comportamento è indefinito non op è un puntatore valido e non nullo a un QkObs.

Riferimenti

[1] : D. Berry, G., Ahokas, R., Cleve e B. Sanders, «Algoritmi quantistici efficienti per la simulazione di hamiltoniani sparsi» (2006). arXiv:quant-ph/0508139

[2] : N. Hatano e M. Suzuki, «Trovare formule esponenziali di prodotti di ordine superiore» (2005). arXiv:math-ph/0506007

Parametri

  • op – Il termine QkObs che contiene la somma dei termini di Pauli.
  • ordine – L'ordine della formula del prodotto.
  • reps – Il numero di intervalli temporali.
  • tempo – Il tempo di evoluzione.
  • preserve_order – Se impostato false, consente di riorganizzare i termini dell'operatore per ottenere potenzialmente un circuito di evoluzione meno profondo. Non è rilevante quando si sintetizza un osservabile con un unico termine.
  • insert_barriers – Indica se inserire delle separazioni tra le evoluzioni dei termini.

Risultati

Un puntatore al circuito generato.

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