Skip to main content
IBM Quantum Platform

Ordnungsfunktionen

qf_ferm_op_canonical_order

QfFermionOperator *qf_ferm_op_canonical_order(const QfFermionOperator *op)

Gibt eine Kopie eines fermionischen Operators zurück, dessen Terme in kanonischer Reihenfolge angeordnet sind.

Die Terme sind in einer kanonischen Reihenfolge sortiert, die ausschließlich von der Struktur des jeweiligen Terms (der von ihm dargestellten Operatorfolge) und nicht von seinem Koeffizienten abhängt. Die Reihenfolge ist daher für eine gegebene Menge von Termen deterministisch, unabhängig davon, wie der Operator zusammengesetzt wurde. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

 1QfFermionOperator *op = qf_ferm_op_zero();
 2bool actions[2] = {true, false};
 3uint32_t modes_a[2] = {1, 0};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_ferm_op_add_term(op, 2, actions, modes_a, &coeff_a);
 6uint32_t modes_b[2] = {0, 1};
 7QkComplex64 coeff_b = {2.0, 0.0};
 8qf_ferm_op_add_term(op, 2, actions, modes_b, &coeff_b);
 9
10QfFermionOperator *ordered = qf_ferm_op_canonical_order(op);
Anmerkung

Alle Gruppenindizes (siehe qf_ferm_op_get_groups()) bleiben erhalten: Jeder Term behält seinen Gruppenindex bei, wenn er verschoben wird, da ein Gruppenindex eine termbezogene Kennung ist, die unabhängig von der Reihenfolge der Terme ist. Begriffe derselben Gruppe sind danach einfach nicht mehr zusammenhängend. Wenn die Eingabe keine Gruppen enthält, enthält auch das Ergebnis keine.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_maj_op_canonical_order

QfMajoranaOperator *qf_maj_op_canonical_order(const QfMajoranaOperator *op)

Gibt eine Kopie eines Majorana-Operators zurück, dessen Terme in kanonischer Reihenfolge angeordnet sind.

Die Terme sind in einer kanonischen Reihenfolge sortiert, die ausschließlich von der Struktur des jeweiligen Terms (der von ihm dargestellten Operatorfolge) und nicht von seinem Koeffizienten abhängt. Die Reihenfolge ist daher für eine gegebene Menge von Termen deterministisch, unabhängig davon, wie der Operator zusammengesetzt wurde. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

1QfMajoranaOperator *op = qf_maj_op_zero();
2uint32_t modes_a[2] = {1, 0};
3QkComplex64 coeff_a = {1.0, 0.0};
4qf_maj_op_add_term(op, 2, modes_a, &coeff_a);
5uint32_t modes_b[2] = {0, 1};
6QkComplex64 coeff_b = {2.0, 0.0};
7qf_maj_op_add_term(op, 2, modes_b, &coeff_b);
8
9QfMajoranaOperator *ordered = qf_maj_op_canonical_order(op);
Anmerkung

Alle Gruppenindizes (siehe qf_maj_op_get_groups()) bleiben erhalten: Jeder Term behält seinen Gruppenindex bei, wenn er verschoben wird, da ein Gruppenindex eine termbezogene Kennung ist, die unabhängig von der Reihenfolge der Terme ist. Begriffe derselben Gruppe sind danach einfach nicht mehr zusammenhängend. Wenn die Eingabe keine Gruppen enthält, enthält auch das Ergebnis keine.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_edge_op_canonical_order

QfEdgeVertexOperator *qf_edge_op_canonical_order(const QfEdgeVertexOperator *op)

Gibt eine Kopie eines Kanten-Knoten-Operators zurück, dessen Terme in kanonischer Reihenfolge angeordnet sind.

Die Terme sind in einer kanonischen Reihenfolge sortiert, die ausschließlich von der Struktur des jeweiligen Terms (der von ihm dargestellten Operatorfolge) und nicht von seinem Koeffizienten abhängt. Die Reihenfolge ist daher für eine gegebene Menge von Termen deterministisch, unabhängig davon, wie der Operator zusammengesetzt wurde. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

 1QfEdgeVertexOperator *op = qf_edge_op_zero();
 2uint32_t left_a[1] = {1};
 3uint32_t right_a[1] = {2};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_edge_op_add_term(op, 1, left_a, right_a, &coeff_a);
 6uint32_t left_b[1] = {0};
 7uint32_t right_b[1] = {1};
 8QkComplex64 coeff_b = {2.0, 0.0};
 9qf_edge_op_add_term(op, 1, left_b, right_b, &coeff_b);
10
11QfEdgeVertexOperator *ordered = qf_edge_op_canonical_order(op);
Anmerkung

Alle Gruppenindizes (siehe qf_edge_op_get_groups()) bleiben erhalten: Jeder Term behält seinen Gruppenindex bei, wenn er verschoben wird, da ein Gruppenindex eine termbezogene Kennung ist, die unabhängig von der Reihenfolge der Terme ist. Begriffe derselben Gruppe sind danach einfach nicht mehr zusammenhängend. Wenn die Eingabe keine Gruppen enthält, enthält auch das Ergebnis keine.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_transfer_op_canonical_order

QfTransferVertexOperator *qf_transfer_op_canonical_order(const QfTransferVertexOperator *op)

Gibt eine Kopie eines Transfer-Vertex-Operators zurück, dessen Terme in kanonischer Reihenfolge angeordnet sind.

Die Terme sind in einer kanonischen Reihenfolge sortiert, die ausschließlich von der Struktur des jeweiligen Terms (der von ihm dargestellten Operatorfolge) und nicht von seinem Koeffizienten abhängt. Die Reihenfolge ist daher für eine gegebene Menge von Termen deterministisch, unabhängig davon, wie der Operator zusammengesetzt wurde. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

 1QfTransferVertexOperator *op = qf_transfer_op_zero();
 2uint32_t left_a[1] = {1};
 3uint32_t right_a[1] = {2};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_transfer_op_add_term(op, 1, left_a, right_a, &coeff_a);
 6uint32_t left_b[1] = {0};
 7uint32_t right_b[1] = {1};
 8QkComplex64 coeff_b = {2.0, 0.0};
 9qf_transfer_op_add_term(op, 1, left_b, right_b, &coeff_b);
10
11QfTransferVertexOperator *ordered = qf_transfer_op_canonical_order(op);
Anmerkung

Alle Gruppenindizes (siehe qf_transfer_op_get_groups()) bleiben erhalten: Jeder Term behält seinen Gruppenindex bei, wenn er verschoben wird, da ein Gruppenindex eine termbezogene Kennung ist, die unabhängig von der Reihenfolge der Terme ist. Begriffe derselben Gruppe sind danach einfach nicht mehr zusammenhängend. Wenn die Eingabe keine Gruppen enthält, enthält auch das Ergebnis keine.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_ferm_op_group_order

QfFermionOperator *qf_ferm_op_group_order(const QfFermionOperator *op)

Gibt eine Kopie eines fermionischen Operators zurück, dessen Terme nach Gruppenindex geordnet sind.

Die Begriffe werden ausschließlich nach ihrem Gruppenindex sortiert, wodurch jede Gruppe eine zusammenhängende Folge von Begriffen bildet und die Gruppenindizes nicht absteigend sind. Die Sortierung ist stabil, sodass die Elemente innerhalb einer Gruppe ihre relative Reihenfolge beibehalten. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

Gruppenindizes geben lediglich an, welche Terme zusammengehören; daher ändert sich dadurch lediglich die Darstellung des Operators, nicht jedoch sein Wert. Was das Layout einbringt, sind Suchkosten: Im Allgemeinen qf_ferm_op_split_out_groups() muss jeder Term durchsucht werden, um die angeforderten Gruppen zu finden, doch bei einem gruppengeordneten Operator bilden die Terme jeder Gruppe einen Bereich, der durch binäre Suche lokalisiert werden kann, sodass eine Suche nur die Kosten der angeforderten Gruppen verursacht und nicht die der enthaltenen Terme.

 1QfFermionOperator *op = qf_ferm_op_zero();
 2bool actions[2] = {true, false};
 3uint32_t modes_a[2] = {0, 1};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_ferm_op_add_term(op, 2, actions, modes_a, &coeff_a);
 6uint32_t modes_b[2] = {1, 0};
 7QkComplex64 coeff_b = {2.0, 0.0};
 8qf_ferm_op_add_term(op, 2, actions, modes_b, &coeff_b);
 9uint32_t groups[2] = {1, 0};
10qf_ferm_op_set_groups(op, groups, 2);
11
12QfFermionOperator *ordered = qf_ferm_op_group_order(op);
Anmerkung

Ein Operator, der keine Gruppenindizes verfolgt (siehe qf_ferm_op_get_groups()), hat keine Sortierkriterien und wird als unveränderte Kopie zurückgegeben. Das Ergebnis enthält ebenfalls keine Gruppen.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_maj_op_group_order

QfMajoranaOperator *qf_maj_op_group_order(const QfMajoranaOperator *op)

Gibt eine Kopie eines Majorana-Operators zurück, dessen Terme nach Gruppenindex geordnet sind.

Die Begriffe werden ausschließlich nach ihrem Gruppenindex sortiert, wodurch jede Gruppe eine zusammenhängende Folge von Begriffen bildet und die Gruppenindizes nicht absteigend sind. Die Sortierung ist stabil, sodass die Elemente innerhalb einer Gruppe ihre relative Reihenfolge beibehalten. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

Gruppenindizes geben lediglich an, welche Terme zusammengehören; daher ändert sich dadurch lediglich die Darstellung des Operators, nicht jedoch sein Wert. Was das Layout einbringt, sind Suchkosten: Im Allgemeinen qf_maj_op_split_out_groups() muss jeder Term durchsucht werden, um die angeforderten Gruppen zu finden, doch bei einem gruppengeordneten Operator bilden die Terme jeder Gruppe einen Bereich, der durch binäre Suche lokalisiert werden kann, sodass eine Suche nur die Kosten der angeforderten Gruppen verursacht und nicht die der enthaltenen Terme.

 1QfMajoranaOperator *op = qf_maj_op_zero();
 2uint32_t modes_a[2] = {0, 1};
 3QkComplex64 coeff_a = {1.0, 0.0};
 4qf_maj_op_add_term(op, 2, modes_a, &coeff_a);
 5uint32_t modes_b[2] = {2, 3};
 6QkComplex64 coeff_b = {2.0, 0.0};
 7qf_maj_op_add_term(op, 2, modes_b, &coeff_b);
 8uint32_t groups[2] = {1, 0};
 9qf_maj_op_set_groups(op, groups, 2);
10
11QfMajoranaOperator *ordered = qf_maj_op_group_order(op);
Anmerkung

Ein Operator, der keine Gruppenindizes verfolgt (siehe qf_maj_op_get_groups()), hat keine Sortierkriterien und wird als unveränderte Kopie zurückgegeben. Das Ergebnis enthält ebenfalls keine Gruppen.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_edge_op_group_order

QfEdgeVertexOperator *qf_edge_op_group_order(const QfEdgeVertexOperator *op)

Gibt eine Kopie eines Kanten-Knoten-Operators zurück, dessen Terme nach Gruppenindex sortiert sind.

Die Begriffe werden ausschließlich nach ihrem Gruppenindex sortiert, wodurch jede Gruppe eine zusammenhängende Folge von Begriffen bildet und die Gruppenindizes nicht absteigend sind. Die Sortierung ist stabil, sodass die Elemente innerhalb einer Gruppe ihre relative Reihenfolge beibehalten. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

Gruppenindizes geben lediglich an, welche Terme zusammengehören; daher ändert sich dadurch lediglich die Darstellung des Operators, nicht jedoch sein Wert. Was das Layout einbringt, sind Suchkosten: Im Allgemeinen qf_edge_op_split_out_groups() muss jeder Term durchsucht werden, um die angeforderten Gruppen zu finden, doch bei einem gruppengeordneten Operator bilden die Terme jeder Gruppe einen Bereich, der durch binäre Suche lokalisiert werden kann, sodass eine Suche nur die Kosten der angeforderten Gruppen verursacht und nicht die der enthaltenen Terme.

 1QfEdgeVertexOperator *op = qf_edge_op_zero();
 2uint32_t left_a[1] = {0};
 3uint32_t right_a[1] = {1};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_edge_op_add_term(op, 1, left_a, right_a, &coeff_a);
 6uint32_t left_b[1] = {1};
 7uint32_t right_b[1] = {2};
 8QkComplex64 coeff_b = {2.0, 0.0};
 9qf_edge_op_add_term(op, 1, left_b, right_b, &coeff_b);
10uint32_t groups[2] = {1, 0};
11qf_edge_op_set_groups(op, groups, 2);
12
13QfEdgeVertexOperator *ordered = qf_edge_op_group_order(op);
Anmerkung

Ein Operator, der keine Gruppenindizes verfolgt (siehe qf_edge_op_get_groups()), hat keine Sortierkriterien und wird als unveränderte Kopie zurückgegeben. Das Ergebnis enthält ebenfalls keine Gruppen.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

qf_transfer_op_group_order

QfTransferVertexOperator *qf_transfer_op_group_order(const QfTransferVertexOperator *op)

Gibt eine Kopie eines Transfer-Vertex-Operators zurück, dessen Terme nach Gruppenindex geordnet sind.

Die Begriffe werden ausschließlich nach ihrem Gruppenindex sortiert, wodurch jede Gruppe eine zusammenhängende Folge von Begriffen bildet und die Gruppenindizes nicht absteigend sind. Die Sortierung ist stabil, sodass die Elemente innerhalb einer Gruppe ihre relative Reihenfolge beibehalten. Die Terme selbst bleiben unverändert – dadurch werden sie lediglich neu angeordnet, der Operator wird jedoch weder vereinfacht noch in Normalform gebracht.

Gruppenindizes geben lediglich an, welche Terme zusammengehören; daher ändert sich dadurch lediglich die Darstellung des Operators, nicht jedoch sein Wert. Was das Layout einbringt, sind Suchkosten: Im Allgemeinen qf_transfer_op_split_out_groups() muss jeder Term durchsucht werden, um die angeforderten Gruppen zu finden, doch bei einem gruppengeordneten Operator bilden die Terme jeder Gruppe einen Bereich, der durch binäre Suche lokalisiert werden kann, sodass eine Suche nur die Kosten der angeforderten Gruppen verursacht und nicht die der enthaltenen Terme.

 1QfTransferVertexOperator *op = qf_transfer_op_zero();
 2uint32_t left_a[1] = {0};
 3uint32_t right_a[1] = {1};
 4QkComplex64 coeff_a = {1.0, 0.0};
 5qf_transfer_op_add_term(op, 1, left_a, right_a, &coeff_a);
 6uint32_t left_b[1] = {1};
 7uint32_t right_b[1] = {2};
 8QkComplex64 coeff_b = {2.0, 0.0};
 9qf_transfer_op_add_term(op, 1, left_b, right_b, &coeff_b);
10uint32_t groups[2] = {1, 0};
11qf_transfer_op_set_groups(op, groups, 2);
12
13QfTransferVertexOperator *ordered = qf_transfer_op_group_order(op);
Anmerkung

Ein Operator, der keine Gruppenindizes verfolgt (siehe qf_transfer_op_get_groups()), hat keine Sortierkriterien und wird als unveränderte Kopie zurückgegeben. Das Ergebnis enthält ebenfalls keine Gruppen.

Parameter

  • op – Ein Zeiger auf den Operator, dessen Terme neu angeordnet werden sollen.

Rückgabe

Ein Zeiger auf den erstellten Operator.

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.