Skip to main content
IBM Quantum Platform

グループ化関数

「グループ演算子の用語」 を参照してください。このモジュールの機能に関する詳細な説明については、演算子の構造を参照してください。


割り当て

C API では、ユーザーに常にグループインデックスの指定を任せるのではなく、グループ化情報を自動的に決定する一連の関数が用意されています。

コラム「 1 」
コラム「 2 」
qf_ferm_op_group_terms_by_electronic_structure()演算子の項を、その電子構造に基づいて分類する。

解析

集合の指標には本質的な意味はない。それらは、どの項が互いに属し合うかを示すだけであり、その理由については決して示さない。 したがって、以下の関数のいずれも、グループ分けが「正しい」かどうかを報告するものではなく、報告の対象となる「正しさ」という単一の概念も存在しません。 それぞれが、既存のグループに関する、明確に提示された一つの限定的な質問に答えるもので、その解釈は読者に委ねられています。 これらは、下流の消費者がグループ化について抱く仮定を、呼び出しのたびに処理コストを支払うのではなく、事前に確認できるようにするために提供されています。

これらの関数はジェネリックな演算子の表現(C言語には存在しない概念)を用いて動作するため、以下の3つのセクションで一般的な観点から説明します。 各種演算子の表現に対応する C API に含まれる実際の関数は、このページの下部に一覧表示されています。

そのいずれも、操作者がグループインデックスを追跡する必要があります。 まず qf_op_type_has_groups こちらを確認してください。グループを指定せずに演算子で呼び出すと、処理が中断されます。

群係数の平均値

qf_op_type_group_coeff_means

void qf_op_type_group_coeff_means(const OpType *op, double *means_out)

警告

ここでの関数のシグネチャはジェネリックです! 実際の式では、 は実際の演算子の表記 OpType に、 はそれに対応する接頭辞 op_type に置き換えられます(例えば、 は ferm_op となります QfFermionOperator)。

第- i番目の項は、グループ内の各項 abs(coeff) について の和を i、そのグループの項の数で割った値である。 これは、個々の項ではなくグループ全体を抽出するランダム化積分公式(例えば、 qDRIFT )のサンプリング重みです。これは 1つの原子グループの大きさを表しており、グループ化こそが、そもそも各サンプリングされた部分がエルミート性を持つ(したがってその時間発展がユニタリとなる)理由であるため、これが適切な尺度となります。

これは、呼び出し元側で と qf_op_type_get_coeffs を簡約する(それぞれ、 展開前の項ごとに1つの値となる qf_op_type_get_groups )のではなく、演算子に対して1回のパスで計算されます。

注

どの項も含まれていないグループインデックスの重みは であり 0.0、これによりそのグループはサンプルから除外される。

パラメーター

  • op – どのグループを縮小するかを指定する演算子へのポインタ。
  • means_out – 平均値を格納するdouble型の配列へのポインタ。 サイズは.に合わせてください qf_op_type_num_groups。

群のエルミティック性

qf_op_type_groups_are_hermitian

void qf_op_type_groups_are_hermitian(const OpType *op, double atol, bool *hermitian_out)

警告

ここでの関数のシグネチャはジェネリックです! 前述の注意事項を参照してください。

群はそれ自体に意味を規定しない。これにより、各群が個別にエルミート群であるという一般的な慣例が成り立つ。 これは、ランダム化された生成式が群全体をサンプリングする際に依拠する性質である。なぜなら、ユニタリな時間発展を持つのはエルミート群のみだからである。 空の群は、零演算子がエルミート演算子であるため、エルミート群とみなされる。

注

これは、以下の片側保証を継承しています qf_op_type_is_hermitian。すなわち、a 型のエントリ true は常に信頼できるのに対し、a 型 false のエントリは、その正規形が真の標準形である演算子型の場合にのみ信頼できるものです。 その他の場合、この検証は保守的であり、実際にはハーミティアンである群 false について、そうではないと報告してしまう可能性がある。 どちらが該当するかは、各通信事業者の説明をご確認ください。

注

これは、……を意味するものでもなければ、……によって示唆されるものでもない qf_op_type_groups_have_uniform_coeffs。 係数がすべて等しいからといって、その群がエルミート群になるとは限らず、また、エルミート群であっても絶対値が混在する場合がある。

パラメーター

  • op – チェック対象のグループを持つ演算子へのポインタ。
  • atol – 係数が等しいとみなされる絶対許容誤差の上限値。
  • hermitian_out – グループごとに1つのフラグを書き込むためのブール値の配列へのポインタ。 サイズは.に合わせてください qf_op_type_num_groups。

群係数の均一性

qf_op_type_groups_have_uniform_coeffs

void qf_op_type_groups_have_uniform_coeffs(const OpType *op, double atol, bool abs, bool *uniform_out)

警告

ここでの関数のシグネチャはジェネリックです! 前述の注意事項を参照してください。

では abs、係数の大きさが比較されるが、これはが平均化を行う際に qf_op_type_group_coeff_means 用いる仮定である abs(coeff)。 それがなければ、係数は完全に一致していなければなりません。 なお、複素係数を持つ共役対は、絶対値は等しいものの係数が等しくないため、エルミート群であっても、より厳密な条件を満たさない場合があることに留意されたい。 空の群または単一の項からなる群は、自明に一様である。

注

これは「 qf_op_type_groups_are_hermitian:」の弱形というわけではありません。どちらとも、もう一方を意味するものではありません。 係数がすべて等しいからといって、その群がエルミート群になるとは限らず、また、エルミート群であっても絶対値が混在する場合がある。

パラメーター

  • op – チェック対象のグループを持つ演算子へのポインタ。
  • atol – 係数が等しいとみなされる絶対許容誤差の上限値。
  • abs – 係数そのものではなく、係数の絶対値を比較するかどうか。
  • uniform_out – グループごとに1つのフラグを書き込むためのブール値の配列へのポインタ。 サイズは.に合わせてください qf_op_type_num_groups。

例

 1QfFermionOperator *op = qf_ferm_op_zero();
 2bool actions[2] = {true, false};
 3QkComplex64 coeff = {1.0, 0.0};
 4uint32_t modes_a[2] = {0, 1};
 5qf_ferm_op_add_term(op, 2, actions, modes_a, &coeff);
 6uint32_t modes_b[2] = {1, 0};
 7qf_ferm_op_add_term(op, 2, actions, modes_b, &coeff);
 8
 9uint32_t groups_in[2] = {0, 0};
10assert(qf_ferm_op_set_groups(op, groups_in, 2) == QfExitCode_Success);
11
12double means[1];
13qf_ferm_op_group_coeff_means(op, means);
14assert(means[0] == 1.0);
15
16bool hermitian[1];
17qf_ferm_op_groups_are_hermitian(op, 1e-8, hermitian);
18assert(hermitian[0]);
19
20bool uniform[1];
21qf_ferm_op_groups_have_uniform_coeffs(op, 1e-8, true, uniform);
22assert(uniform[0]);

関数

qf_ferm_op_group_terms_by_electronic_structure

QfExitCode qf_ferm_op_group_terms_by_electronic_structure(QfFermionOperator *op, uint32_t num_modes, bool two_body_physicist_order)

演算子の項を、その電子構造に基づいて分類する。

この関数は、電子構造ハミルトニアンに含まれる対称摂動を満たす項がグループ化される QfFermionOperator ように、指定された の 属性 groups (「」も参照 qf_ferm_op_get_groups())を自動的に設定します。

警告

指定された演算子は、正規順序でなければならない! これは、検証されていない実装の根底にある前提です! その形式の演算子を得る方法については qf_ferm_op_normal_ordered() を参照してください。

より具体的に言えば、次のような形の電子構造ハミルトニアンが与えられたとき、

H=∑ijcijai†aj+∑ijklcijklai†aj†akal ,\mathcal{H} = \sum_{ij} c_{ij} a^\dagger_i a_j + \sum_{ijkl} c_{ijkl} a^\dagger_i a^\dagger_j a_k a_l \, ,

この関数は、の順列対称性を持つ1体項と (i, j) 、の順列対称性を持つ2体項をグループ化します (i, j, k, l)。 2体項については、すべての順列がグループ化されるわけではありません。 その代わりに、この式は、4つの指標がどのように2つずつペアにグループ化され、そのペア内で順列対称性が生じるかを決定 two_body_physicist_order する:

  • two_body_physicist_order=False (デフォルト): および (i, l) (j, k)
  • two_body_physicist_order=True: そして (i, k) (j, l)
1QfFCIDump *fcidump = NULL;
2qf_fcidump_from_file("molecule.fcidump", &fcidump);
3QfFermionOperator *op = qf_ferm_op_from_fcidump(fcidump);
4
5uint32_t num_modes = 2 * qf_fcidump_norb(fcidump);
6
7QfFermionOperator *normal = qf_ferm_op_normal_ordered(op, NULL);
8
9QfExitCode exit = qf_ferm_op_group_terms_by_electronic_structure(normal, num_modes, false);

パラメーター

  • op – 項をグループ化する正常順序のフェルミオン演算子へのポインタ。
  • num_modes – 演算子に含まれるフェルミオンモードの数。
  • two_body_physicist_order – 2体項が物理学者の順序で格納されるかどうか。

戻り値

終了コード。

  • QfExitCode_Success 成功した際に
  • QfExitCode_ValueError グループ化中に無効な項が見つかった場合。

qf_ferm_op_group_coeff_means

void qf_ferm_op_group_coeff_means(const QfFermionOperator *op, double *means_out)

qf_ferm_op_groups_are_hermitian

void qf_ferm_op_groups_are_hermitian(const QfFermionOperator *op, double atol, bool *hermitian_out)

qf_ferm_op_groups_have_uniform_coeffs

void qf_ferm_op_groups_have_uniform_coeffs(const QfFermionOperator *op, double atol, bool abs, bool *uniform_out)

qf_maj_op_group_coeff_means

void qf_maj_op_group_coeff_means(const QfMajoranaOperator *op, double *means_out)

qf_maj_op_groups_are_hermitian

void qf_maj_op_groups_are_hermitian(const QfMajoranaOperator *op, double atol, bool *hermitian_out)

qf_maj_op_groups_have_uniform_coeffs

void qf_maj_op_groups_have_uniform_coeffs(const QfMajoranaOperator *op, double atol, bool abs, bool *uniform_out)

qf_edge_op_group_coeff_means

void qf_edge_op_group_coeff_means(const QfEdgeVertexOperator *op, double *means_out)

qf_edge_op_groups_are_hermitian

void qf_edge_op_groups_are_hermitian(const QfEdgeVertexOperator *op, double atol, bool *hermitian_out)

qf_edge_op_groups_have_uniform_coeffs

void qf_edge_op_groups_have_uniform_coeffs(const QfEdgeVertexOperator *op, double atol, bool abs, bool *uniform_out)

qf_transfer_op_group_coeff_means

void qf_transfer_op_group_coeff_means(const QfTransferVertexOperator *op, double *means_out)

qf_transfer_op_groups_are_hermitian

void qf_transfer_op_groups_are_hermitian(const QfTransferVertexOperator *op, double atol, bool *hermitian_out)

qf_transfer_op_groups_have_uniform_coeffs

void qf_transfer_op_groups_have_uniform_coeffs(const QfTransferVertexOperator *op, double atol, bool abs, bool *uniform_out)

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