Biblioteca de circuitos
La biblioteca de circuitos de Qiskit contiene funciones y componentes de alto nivel para crear circuitos cuánticos de uso común.
Tipos de datos
QkPauliProductRotation
struct QkPauliProductRotation
Una representación de los datos de rotación del producto de Pauli.
Una rotación del producto de Pauli implementa una rotación de alrededor de angle un eje definido por un producto de Pauli sobre len qubits. El vector Pauli se representa aquí en formato ZX mediante dos matrices booleanas que representan los componentes Z y X.
bool *z
Puntero a una matriz len de longitud * de componentes de tipo Z.
bool *x
Puntero a una matriz len de longitud x con x componentes.
size_t len
El número de términos de Pauli.
QkParam *ángulo
El ángulo de rotación.
QkPauliProductMeasurement
struct QkPauliProductMeasurement
Una representación de los datos de medición del producto de Pauli.
Una medición del producto de Pauli implementa una proyección sobre el espacio propio del producto de Pauli definido en len los qubits. El vector Pauli se representa aquí en formato ZX mediante dos matrices booleanas que representan los componentes Z y X, y puede incluir un signo menos, indicado por flip_outcome.
bool *z
Puntero a una matriz len de longitud * de componentes de tipo Z.
bool *x
Puntero a una matriz len de longitud x con x componentes.
size_t len
El número de términos de Pauli.
bool resultado_del_lanzamiento
Si el resultado de la medición tiene signo negativo.
Funciones
qk_circuit_library_iqp
QkCircuit *qk_circuit_library_iqp(uint32_t num_qubits, const int64_t *interactions, bool check_input)
Genera un circuito de polinomio cuántico instantáneo (IQP) a partir de una matriz de interacción entera.
La interactions matriz se interpreta como una matriz n × n ordenada por filas de enteros de 64 bits, donde n = num_qubits. Los elementos diagonales establecen potencias de fase de tipo T, y el triángulo superior codifica las interacciones CPhase de dos qubits.
Seguridad
Si num_qubits > 0, interactions debe ser un puntero válido y no nulo a al menos valores num_qubits * num_qubits int64_t contiguos en orden de filas. La memoria a la que apunta interactions debe estar correctamente alineada, ser legible durante toda la duración de esta llamada y no tener alias mutables. Si se pasa un puntero no válido o un búfer demasiado pequeño, se produce un comportamiento indefinido.
Parámetros
- num_qubits – Número de qubits lógicos (
n). Debe coincidir con la dimensión de lainteractionsmatriz. - interacciones – Puntero a una matriz de tipo
n × n«row-major» de tipoint64_t. Solo puede ser NULL sinum_qubits == 0. - check_input – Cuando se
trueejecuta, esta función comprueba que la matriz sea simétrica y devuelve un valorNULLsi no lo es. En ese casofalse, no se realiza ninguna validación adicional.
Devuelve
Una matriz recién asignada QkCircuit* en caso de éxito (el llamante debe liberarla con qk_circuit_free), o NULL si num_qubits > 0 y interactions es NULL, o si check_input es true y la matriz no es simétrica.
qk_circuit_library_random_iqp
QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)
Genera un circuito aleatorio de polinomio cuántico instantáneo (IQP).
Esto crea internamente una matriz de interacción simétrica aleatoria de números enteros y la utiliza para construir un circuito IQP, imitando el constructor de qiskit.circuit.library.IQP Python.
Parámetros
- num_qubits – Número de qubits.
- semilla – semilla del generador de números aleatorios. Si es negativo, la entropía se obtiene del sistema operativo; en caso contrario, se utiliza el valor proporcionado como semilla determinista.
Devuelve
Una variable recién asignada QkCircuit* (el llamante debe liberarla con qk_circuit_free).
qk_pauli_product_rotation_clear
void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)
Borrar los datos internos de los archivos asignados por Rust QkPauliProductRotation.
Esto libera la memoria de las matrices z x y y libera el angle. Esta función solo debe invocarse para QkPauliProductRotation objetos cuyos datos hayan sido rellenados por Rust.
Ejemplo
// 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);Por el contrario, no se debe llamar a esta función si C ya se encarga de borrar los datos.
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);Seguridad
El comportamiento es indefinido si no inst es un puntero válido y no nulo a un QkPauliProductRotation, o si los datos internos de QkPauliProductRotation son incoherentes.
Parámetros
- inst – Un puntero al elemento
QkPauliProductRotationque se va a borrar.
qk_pauli_product_measurement_clear
void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)
Borrar los datos internos de los archivos asignados por Rust QkPauliProductMeasurement.
Esto libera la memoria de las matrices z x y. Esta función solo debe invocarse para QkPauliProductMeasurement objetos cuyos datos hayan sido rellenados por Rust.
Ejemplo
// 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);Por el contrario, no se debe llamar a esta función si C ya se encarga de borrar los datos.
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)`Seguridad
El comportamiento es indefinido si no inst es un puntero válido y no nulo a un QkPauliProductMeasurement, o si los datos internos de QkPauliProductMeasurement son incoherentes.
Parámetros
- inst – Un puntero al elemento
QkPauliProductMeasurementque se va a borrar.
qk_circuit_library_quantum_volume
QkCircuit *qk_circuit_library_quantum_volume(uint32_t num_qubits, size_t depth, int64_t seed)
Generar un circuito modelo Quantum Volume
Los circuitos modelo son ejemplos aleatorios de circuitos utilizados para medir la métrica del volumen cuántico, tal y como se introduce en [1]. Los circuitos modelo consisten en capas de elementos aleatorios de Haar de SU(4) aplicados entre pares correspondientes de qubits en una bipartición aleatoria.
Esta función es multihilo y, de forma predeterminada, iniciará un grupo de subprocesos con un número de subprocesos igual al número de CPU. Puede ajustar el número de subprocesos con la variable de entorno RAYON_NUM_THREADS. Por ejemplo, establecer RAYON_NUM_THREADS=4 limitaría el grupo de subprocesos a 4 subprocesos.
[1] A. Cross y otros. Validación de ordenadores cuánticos mediante circuitos modelo aleatorios, Phys. Rev. A 100, 032328 (2019). arXiv:1811.12926
Ejemplo
QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)Parámetros
- num_qubits : el número de qubits que se utilizarán para el circuito generado.
- Profundidad : el número de capas del circuito generado.
- semilla : una semilla RNG utilizada para generar las matrices SU(4) aleatorias utilizadas en el circuito de salida. Si el número proporcionado es negativo, la semilla utilizada se obtendrá de la entropía del sistema.
Devuelve
Un puntero al circuito de volumen cuántico.
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)
Genera un circuito utilizando la fórmula del producto de Suzuki-Trotter de orden superior a partir de una observable.
Las fórmulas de Suzuki-Trotter mejoran el error de la aproximación de Lie-Trotter. En esta implementación, los operadores se expresan como sumas de un operador de Pauli. Las descomposiciones de orden superior se basan en recursiones; véase la ref. [1] para obtener más información.
Ejemplo
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);Seguridad
El comportamiento es indefinido; no op es un puntero válido y no nulo a un QkObs.
Referencias
[1] : D. Berry, G., Ahokas, R., Cleve y B. Sanders, «Algoritmos cuánticos eficientes para simular hamiltonianos dispersos» (2006). arXiv:quant-ph/0508139
[2] : N. Hatano y M. Suzuki, «Búsqueda de fórmulas de productos exponenciales de orden superior» (2005). arXiv:math-ph/0506007
Parámetros
- op – El
QkObsque contiene la suma de los términos de Pauli. - orden : el orden de la fórmula del producto.
- repeticiones : el número de intervalos de tiempo.
- tiempo – El tiempo de evolución.
- preserve_order – Si
falsese activa, permite reordenar los términos del operador para obtener, en su caso, un circuito de evolución menos profundo. No es relevante al sintetizar un observable con un solo término. - insert_barriers – Indica si se deben insertar separadores entre las evoluciones de los términos.
Devuelve
Un puntero al circuito generado.