Skip to main content
IBM Quantum Platform

順序関数

qf_ferm_op_canonical_order

QfFermionOperator *qf_ferm_op_canonical_order(const QfFermionOperator *op)

フェルミオン演算子のコピーを、その項が正準順序で並んだ状態で返します。

各項は、その係数には依存せず、各項の構造(それが表す演算子列)のみに基づいて、標準的な順序に並べ替えられています。 したがって、演算子がどのように組み立てられたかに関わらず、与えられた項の集合に対しては、その順序は決定的である。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり、標準形にしたりするものではありません。

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

任意の群インデックス(参照 qf_ferm_op_get_groups())は保持されます。群インデックスは項ごとのタグであり、項の順序に依存しないため、各項は移動する際にもその群インデックスを保持したままになります。 その後、同じグループに属する項は、もはや連続しなくなります。 入力にグループが含まれていない場合、結果にもグループは含まれません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_maj_op_canonical_order

QfMajoranaOperator *qf_maj_op_canonical_order(const QfMajoranaOperator *op)

マジョラナ演算子のコピーを、その項が標準的な順序で並んだ状態で返します。

各項は、その係数には依存せず、各項の構造(それが表す演算子列)のみに基づいて、標準的な順序に並べ替えられています。 したがって、演算子がどのように組み立てられたかに関わらず、与えられた項の集合に対しては、その順序は決定的である。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり、標準形にしたりするものではありません。

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

任意の群インデックス(参照 qf_maj_op_get_groups())は保持されます。群インデックスは項ごとのタグであり、項の順序に依存しないため、各項は移動する際にもその群インデックスを保持したままになります。 その後、同じグループに属する項は、もはや連続しなくなります。 入力にグループが含まれていない場合、結果にもグループは含まれません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_edge_op_canonical_order

QfEdgeVertexOperator *qf_edge_op_canonical_order(const QfEdgeVertexOperator *op)

エッジ・頂点演算子のコピーを、その項が標準順序で並んだ状態で返します。

各項は、その係数には依存せず、各項の構造(それが表す演算子列)のみに基づいて、標準的な順序に並べ替えられています。 したがって、演算子がどのように組み立てられたかに関わらず、与えられた項の集合に対しては、その順序は決定的である。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり、標準形にしたりするものではありません。

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

任意の群インデックス(参照 qf_edge_op_get_groups())は保持されます。群インデックスは項ごとのタグであり、項の順序には依存しないため、各項は移動する際にもその群インデックスを保持したままになります。 その後、同じグループに属する項は、もはや連続しなくなります。 入力にグループが含まれていない場合、結果にもグループは含まれません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_transfer_op_canonical_order

QfTransferVertexOperator *qf_transfer_op_canonical_order(const QfTransferVertexOperator *op)

項が標準順序で並んだ、転送頂点演算子のコピーを返します。

各項は、その係数には依存せず、各項の構造(それが表す演算子列)のみに基づいて、標準的な順序に並べ替えられています。 したがって、演算子がどのように組み立てられたかに関わらず、与えられた項の集合に対しては、その順序は決定的である。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり、標準形にしたりするものではありません。

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

任意の群インデックス(参照 qf_transfer_op_get_groups())は保持されます。群インデックスは項ごとのタグであり、項の順序には依存しないため、各項は移動する際にもその群インデックスを保持したままになります。 その後、同じグループに属する項は、もはや連続しなくなります。 入力にグループが含まれていない場合、結果にもグループは含まれません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_ferm_op_group_order

QfFermionOperator *qf_ferm_op_group_order(const QfFermionOperator *op)

群指標順に項が並べられたフェルミオン演算子のコピーを返します。

用語はグループインデックスのみでソートされるため、各グループは連続した用語の列となり、グループインデックスは非減少となる。 このソートは安定しているため、グループ内の項は相対的な順序を保ちます。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり正規化したりするものではありません。

グループインデックスは、どの項がグループをなすかを指定するだけなので、これにより演算子の配置は変わりますが、その値は変わりません。 このレイアウトがもたらすのは、検索コストの削減です。通常、要求されたグループを見つけるにはすべての項をスキャンする必要があります qf_ferm_op_split_out_groups() が、グループ順に並べられた演算子では、各グループの項が1つの範囲を形成するため、二分探索によってその範囲を特定できます。したがって、検索コストは、 保持されている項の数ではなく、 要求されたグループの数に応じて決まります。

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

グループインデックスを追跡しない演算子(参照 qf_ferm_op_get_groups())には、並べ替えの基準となるものがなく、変更されていないコピーとして返されます。 結果にはグループも一切含まれていません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_maj_op_group_order

QfMajoranaOperator *qf_maj_op_group_order(const QfMajoranaOperator *op)

群指標順に項が並べられたマジョラナ演算子のコピーを返します。

用語はグループインデックスのみでソートされるため、各グループは連続した用語の列となり、グループインデックスは非減少となる。 このソートは安定しているため、グループ内の項は相対的な順序を保ちます。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり正規化したりするものではありません。

グループインデックスは、どの項がグループをなすかを指定するだけなので、これにより演算子の配置は変わりますが、その値は変わりません。 このレイアウトがもたらすのは、検索コストの削減です。通常、要求されたグループを見つけるにはすべての項をスキャンする必要があります qf_maj_op_split_out_groups() が、グループ順に並べられた演算子では、各グループの項が1つの範囲を形成するため、二分探索によってその範囲を特定できます。したがって、検索コストは、 保持されている項の数ではなく、 要求されたグループの数に応じて決まります。

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

グループインデックスを追跡しない演算子(参照 qf_maj_op_get_groups())には、並べ替えの基準となるものがなく、変更されていないコピーとして返されます。 結果にはグループも一切含まれていません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_edge_op_group_order

QfEdgeVertexOperator *qf_edge_op_group_order(const QfEdgeVertexOperator *op)

エッジ・頂点演算子のコピーを返し、その項は群インデックスの順に並べ替えられています。

用語はグループインデックスのみでソートされるため、各グループは連続した用語の列となり、グループインデックスは非減少となる。 このソートは安定しているため、グループ内の項は相対的な順序を保ちます。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり正規化したりするものではありません。

グループインデックスは、どの項がグループをなすかを指定するだけなので、これにより演算子の配置は変わりますが、その値は変わりません。 このレイアウトがもたらすのは、検索コストの削減です。通常、要求されたグループを見つけるにはすべての項をスキャンする必要があります qf_edge_op_split_out_groups() が、グループ順に並べられた演算子では、各グループの項が1つの範囲を形成するため、二分探索によってその範囲を特定できます。したがって、検索コストは、 保持されている項の数ではなく、 要求されたグループの数に応じて決まります。

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

グループインデックスを追跡しない演算子(参照 qf_edge_op_get_groups())には、並べ替えの基準となるものがなく、変更されていないコピーとして返されます。 結果にはグループも一切含まれていません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

qf_transfer_op_group_order

QfTransferVertexOperator *qf_transfer_op_group_order(const QfTransferVertexOperator *op)

群指数順に項が並べられた転送頂点演算子のコピーを返します。

用語はグループインデックスのみでソートされるため、各グループは連続した用語の列となり、グループインデックスは非減少となる。 このソートは安定しているため、グループ内の項は相対的な順序を保ちます。 式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、演算子を単純化したり正規化したりするものではありません。

グループインデックスは、どの項がグループをなすかを指定するだけなので、これにより演算子の配置は変わりますが、その値は変わりません。 このレイアウトがもたらすのは、検索コストの削減です。通常、要求されたグループを見つけるにはすべての項をスキャンする必要があります qf_transfer_op_split_out_groups() が、グループ順に並べられた演算子では、各グループの項が1つの範囲を形成するため、二分探索によってその範囲を特定できます。したがって、検索コストは、 保持されている項の数ではなく、 要求されたグループの数に応じて決まります。

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

グループインデックスを追跡しない演算子(参照 qf_transfer_op_get_groups())には、並べ替えの基準となるものがなく、変更されていないコピーとして返されます。 結果にはグループも一切含まれていません。

パラメーター

  • op – 順序を変更するオペランドへのポインタ。

戻り値

作成された演算子へのポインタ。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。