Kommutatorgeneratoren
Die Operatordarstellungen bieten effiziente Funktionen zur Berechnung verschiedener Kommutatoren. Da diese Funktionen mit generischen Operator-Darstellungen arbeiten (ein Konzept, das es in C nicht gibt), werden sie in den folgenden drei Abschnitten allgemein erläutert. Die tatsächlichen Funktionen, die in der C-API für die verschiedenen Operator-Darstellungen enthalten sind, sind am Ende dieser Seite aufgeführt.
Kommutator
qf_op_type_commutator
OpType qf_op_type_commutator(const OpType *op_a, const OpType *op_b)
Die Funktionssignatur ist hier generisch! Ein echter Operator ersetzt OpType durch eine tatsächliche Operatordarstellung und op_type durch das dazugehörige Präfix (zum Beispiel ferm_op für QfFermionOperator).
Der Kommutator ist wie folgt definiert:
Parameter
- op_a – Ein Zeiger auf die Operator- e.
- op_b – Ein Zeiger auf die Operator .
Rückgabe
Ein Zeiger auf den konstruierten Operator-Kommutator.
Beispiel
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);Antikommutator
qf_op_type_anti_commutator
OpType qf_op_type_anti_commutator(const OpType *op_a, const OpType *op_b)
Die Funktionssignatur ist hier generisch! Ein echter Operator ersetzt OpType durch eine tatsächliche Operatordarstellung und op_type durch das dazugehörige Präfix (zum Beispiel ferm_op für QfFermionOperator).
Der Antikommutator ist wie folgt definiert:
Parameter
- op_a – Ein Zeiger auf die Operator- e.
- op_b – Ein Zeiger auf die Operator .
Rückgabe
Ein Zeiger auf den konstruierten Operator-Antikommutator.
Beispiel
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);Doppelkommutator
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)
Die Funktionssignatur ist hier generisch! Ein echter Operator ersetzt OpType durch eine tatsächliche Operatordarstellung und op_type durch das dazugehörige Präfix (zum Beispiel ferm_op für QfFermionOperator).
Der Doppelkommutator ist wie folgt definiert (siehe auch Kapitel „ 13.6 “, „Equation of motion methods“, Seite 479 von [1]; der Fall sign=false ist der symmetrische Doppelkommutator , der in Gleichung (2) von [ 2] vorkommt):
Wenn ist sign``false , gibt es Folgendes zurück:
Wenn ist sign``true , gibt es Folgendes zurück:
[ 1 ]
R. McWeeny. Methoden der molekularen Quantenmechanik. 2. Auflage, Academic Press, 1992. ISBN 0-12-486552-6.
[ 2 ]
P. J. Ollitrault, A. Miessen, I. Tavernelli. Molekulare Quantendynamik: Eine Perspektive aus der Quanteninformatik. Anm. Chem. Res. 54, 4229–4238 (2021). https://doi.org/10.1021/acs.accounts.1c00514
Parameter
- op_a – Ein Zeiger auf die Operator- e.
- op_b – Ein Zeiger auf die Operator .
- op_c – Ein Zeiger auf die Operator .
- Vorzeichen – die Art des äußeren (Anti-)Kommutators gemäß der obigen Definition.
Rückgabe
Ein Zeiger auf den konstruierten Operator-Antikommutator.
Beispiel
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);Funktionen
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)