Generadores con conmutador
Las representaciones de operadores ofrecen funciones eficaces para el cálculo de diversos conmutadores. Dado que estas funciones funcionan con representaciones genéricas de operadores (un concepto que no existe en C), se explican de forma genérica en las tres secciones siguientes. Las funciones concretas que contiene la API de C para las distintas representaciones de los operadores se enumeran al final de esta página.
Conmutador
qf_op_type_commutator
OpType qf_op_type_commutator(const OpType *op_a, const OpType *op_b)
¡La firma de la función aquí es genérica! Uno auténtico sustituirá OpType por una representación real del operador y op_type por su prefijo correspondiente (por ejemplo, ferm_op por QfFermionOperator).
El conmutador se define como:
Parámetros
- op_a – Un puntero al operador .
- op_b – Un puntero al operador .
Devuelve
Un puntero al conmutador del operador construido.
Ejemplo
1QfFermionOperator *op1 = qf_ferm_op_zero();
2QkComplex64 coeff1 = {1.0, 0.0};
3bool action1[2] = {true, false};
4uint32_t modes1[2] = {0, 0};
5qf_ferm_op_add_term(op1, 2, action1, modes1, &coeff1);
6QfFermionOperator *op2 = qf_ferm_op_zero();
7QkComplex64 coeff2 = {2.0, 0.0};
8bool action2[2] = {false, true};
9uint32_t modes2[2] = {0, 0};
10qf_ferm_op_add_term(op2, 2, action2, modes2, &coeff2);
11
12QfFermionOperator *comm = qf_ferm_op_commutator(op1, op2);Anticommutador
qf_op_type_anti_commutator
OpType qf_op_type_anti_commutator(const OpType *op_a, const OpType *op_b)
¡La firma de la función aquí es genérica! Uno auténtico sustituirá OpType por una representación real del operador y op_type por su prefijo correspondiente (por ejemplo, ferm_op por QfFermionOperator).
El anticomutador se define como:
Parámetros
- op_a – Un puntero al operador .
- op_b – Un puntero al operador .
Devuelve
Un puntero al anticomutador del operador construido.
Ejemplo
1QfFermionOperator *op1 = qf_ferm_op_zero();
2QkComplex64 coeff1 = {1.0, 0.0};
3bool action1[2] = {true, false};
4uint32_t modes1[2] = {0, 0};
5qf_ferm_op_add_term(op1, 2, action1, modes1, &coeff1);
6QfFermionOperator *op2 = qf_ferm_op_zero();
7QkComplex64 coeff2 = {2.0, 0.0};
8bool action2[2] = {false, true};
9uint32_t modes2[2] = {0, 0};
10qf_ferm_op_add_term(op2, 2, action2, modes2, &coeff2);
11
12QfFermionOperator *anti_comm = qf_ferm_op_anti_commutator(op1, op2);De doble conmutador
qf_op_type_double_commutator
OpType qf_op_type_double_commutator(const OpType *op_a, const OpType *op_b, const OpType *op_c, bool sign)
¡La firma de la función aquí es genérica! Uno auténtico sustituirá OpType por una representación real del operador y op_type por su prefijo correspondiente (por ejemplo, ferm_op por QfFermionOperator).
El doble conmutador se define de la siguiente manera (véase también el capítulo « 13.6 », «Equation of motion methods», página 479 de [1]; el sign=false caso es el doble conmutador simétrico que aparece en la ecuación (2) de [ 2] ):
Si es sign false, devuelve
Si es sign true, devuelve
[ 1 ]
R. McWeeny. Métodos de mecánica cuántica molecular. 2.ª edición, Academic Press, 1992. ISBN 0-12-486552-6.
[ 2 ]
P. J. Ollitrault, A. Miessen, I. Tavernelli. Dinámica cuántica molecular: una perspectiva de la informática cuántica. Según... Química. Res. 54, 4229-4238 (2021). https://doi.org/10.1021/acs.accounts.1c00514
Parámetros
- op_a – Un puntero al operador .
- op_b – Un puntero al operador .
- op_c – Un puntero al operador .
- signo : la naturaleza del (anti-)conmutador exterior según la definición anterior.
Devuelve
Un puntero al anticomutador del operador construido.
Ejemplo
1QfFermionOperator *op1 = qf_ferm_op_zero();
2QkComplex64 coeff1 = {1.0, 0.0};
3bool action1[2] = {true, false};
4uint32_t modes1[2] = {0, 0};
5qf_ferm_op_add_term(op1, 2, action1, modes1, &coeff1);
6QfFermionOperator *op2 = qf_ferm_op_zero();
7QkComplex64 coeff2 = {2.0, 0.0};
8bool action2[2] = {false, true};
9uint32_t modes2[2] = {0, 0};
10qf_ferm_op_add_term(op2, 2, action2, modes2, &coeff2);
11QfFermionOperator *op3 = qf_ferm_op_zero();
12qf_ferm_op_add_term(op3, 2, action1, modes1, &coeff1);
13QkComplex64 coeff3 = {2.0, 0.5};
14qf_ferm_op_add_term(op3, 2, action2, modes2, &coeff3);
15
16QfFermionOperator *double_comm = qf_ferm_op_double_commutator(op1, op2, op3, false);Funciones
qf_ferm_op_commutator
QfFermionOperator *qf_ferm_op_commutator(const QfFermionOperator *op_a, const QfFermionOperator *op_b)
qf_ferm_op_anti_commutator
QfFermionOperator *qf_ferm_op_anti_commutator(const QfFermionOperator *op_a, const QfFermionOperator *op_b)
qf_ferm_op_double_commutator
QfFermionOperator *qf_ferm_op_double_commutator(const QfFermionOperator *op_a, const QfFermionOperator *op_b, const QfFermionOperator *op_c, bool sign)
qf_maj_op_commutator
QfMajoranaOperator *qf_maj_op_commutator(const QfMajoranaOperator *op_a, const QfMajoranaOperator *op_b)
qf_maj_op_anti_commutator
QfMajoranaOperator *qf_maj_op_anti_commutator(const QfMajoranaOperator *op_a, const QfMajoranaOperator *op_b)
qf_maj_op_double_commutator
QfMajoranaOperator *qf_maj_op_double_commutator(const QfMajoranaOperator *op_a, const QfMajoranaOperator *op_b, const QfMajoranaOperator *op_c, bool sign)
qf_edge_op_commutator
QfEdgeVertexOperator *qf_edge_op_commutator(const QfEdgeVertexOperator *op_a, const QfEdgeVertexOperator *op_b)
qf_edge_op_anti_commutator
QfEdgeVertexOperator *qf_edge_op_anti_commutator(const QfEdgeVertexOperator *op_a, const QfEdgeVertexOperator *op_b)
qf_edge_op_double_commutator
QfEdgeVertexOperator *qf_edge_op_double_commutator(const QfEdgeVertexOperator *op_a, const QfEdgeVertexOperator *op_b, const QfEdgeVertexOperator *op_c, bool sign)
qf_transfer_op_commutator
QfTransferVertexOperator *qf_transfer_op_commutator(const QfTransferVertexOperator *op_a, const QfTransferVertexOperator *op_b)
qf_transfer_op_anti_commutator
QfTransferVertexOperator *qf_transfer_op_anti_commutator(const QfTransferVertexOperator *op_a, const QfTransferVertexOperator *op_b)
qf_transfer_op_double_commutator
QfTransferVertexOperator *qf_transfer_op_double_commutator(const QfTransferVertexOperator *op_a, const QfTransferVertexOperator *op_b, const QfTransferVertexOperator *op_c, bool sign)