回路ライブラリー
Qiskitの回路ライブラリには、一般的に使用される量子回路を構築するための関数や高レベルな構成要素が含まれています。
データ・タイプ
QkPauliProductRotation
struct QkPauliProductRotation
パウリ積の回転データの図示。
パウリ積による回転とは、n len 個の量子ビットに対するパウリ積 angle によって定義される軸を中心とした回転を実装するものである。 ここでのパウリ演算子は、Z成分とX成分を表す2つのブール配列を用いてZX形式で表現されています。
bool *z
Z成分の長さ-len 配列へのポインタ。
bool *x
X個の要素からlen なる配列へのポインタ。
size_t len
パウリ項の数。
QkParam *角度
回転角度。
QkPauliProductMeasurement
struct QkPauliProductMeasurement
パウリ積の測定データの図示。
パウリ積の測定は、定義されたパウリ積の固有 len 空間への射影を実装する。 ここでのパウリ表現はZX形式で表され、Z成分とX成分をそれぞれ表す2つのブール配列で構成されており、マイナス記号を含めることも可能です。マイナス記号は「 flip_outcome.」で示されます。
bool *z
Z成分の長さ-len 配列へのポインタ。
bool *x
X個の要素からlen なる配列へのポインタ。
size_t len
パウリ項の数。
bool flip_outcome
測定結果にマイナス符号が付いているかどうか。
関数
qk_circuit_library_iqp
QkCircuit *qk_circuit_library_iqp(uint32_t num_qubits, const int64_t *interactions, bool check_input)
整数の相互作用行列から、瞬間量子多項式(IQP)回路を生成する。
この interactions 行列は、64ビット整数の行優先 n × n 配列として解釈され、ここで n = num_qubits。 対角要素はT型の位相パワーを設定し、上三角部分は2量子ビットのCPhase相互作用を表現している。
安全
もし num_qubits > 0であるならば、 interactions は、行優先順序で少なくとも 個 num_qubits * num_qubits の連続した int64_t 値を指す、有効かつNULLではないポインタでなければならない。 が指すメモリは、適切にアラインメントされ、この呼び出しの期間 interactions 中は読み取り可能であり、かつ可変エイリアスになっていない必要があります。 無効なポインタや、容量が不足しているバッファを渡すと、未定義の挙動を引き起こします。
パラメーター
- num_qubits – 論理量子ビットの数 (
n)。行列interactionsの次元と一致している必要があります。 - interactions – 型 の行優先
n × n行列int64_tへのポインタ。 以下の場合にのみNULLnum_qubits == 0となり得る。 - check_input – この関数は
true、行列が対称行列であるかどうかを検証し、そうでない場合はNULLを返す。 この場合false、追加の検証は行われません。
戻り値
成功時には QkCircuit* 新たに割り当てられた(呼び出し元は で解放する必要がある qk_circuit_free)、あるいは NULL が interactions``num_qubits > 0 で である場合 NULL、または が true``check_input で行列が非対称である場合は。
qk_circuit_library_random_iqp
QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)
ランダムな瞬間量子多項式(IQP)回路を生成する。
これは内部でランダムな対称整数相互作用行列を生成し、それを用いてIQP回路を構築します。これは、 Python コン qiskit.circuit.library.IQP ストラクタと同様の動作をします。
パラメーター
- num_qubits – 量子ビットの数。
- シード – RNGシード。 負の値の場合、エントロピーはOSから取得されます。それ以外の場合は、指定された値が確定的なシードとして使用されます。
戻り値
新たに割り当てられた QkCircuit* (呼び出し元は で解放する必要があります qk_circuit_free)。
qk_pauli_product_rotation_clear
void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)
Rustによって割り当てられた内部 QkPauliProductRotationデータを消去する。
これにより、 および x z 配列のメモリが解放され、 も解放されます angle。 この関数は、Rustによってデータが設定されたオブジェクト QkPauliProductRotation に対してのみ呼び出す必要があります。
例
// let `circuit` be a QkCircuit* and `index` a size_t at the position of a QkPauliProductRotation
QkPauliProductRotation inst;
// query the QkPauliProductRotation data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductRotation);
qk_circuit_inst_pauli_product_rotation(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_rotation_clear(&inst);一方、C側ですでにデータの消去が行われている場合は、この関数を呼び出してはなりません。
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {z, x, 4, angle};
// since this data is allocated by C, we do not call `qk_pauli_product_rotation_clear(&rotation)`!
qk_param_free(angle);安全
が有効な、NULLではないへのポインタ QkPauliProductRotationでない inst 場合、またはの内部データが QkPauliProductRotation 不整合な場合、動作は未定義となる。
パラメーター
- inst – クリアする
QkPauliProductRotation対象へのポインタ。
qk_pauli_product_measurement_clear
void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)
Rustによって割り当てられた内部 QkPauliProductMeasurementデータを消去する。
これにより、 および x z 配列のメモリが解放されます。 この関数は、Rustによってデータが設定されたオブジェクト QkPauliProductMeasurement に対してのみ呼び出す必要があります。
例
// let `circuit` be a QkCircuit* and `index` a size_t at the position
// of a QkPauliProductMeasurement
QkPauliProductMeasurement inst;
// query the QkPauliProductMeasurement data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductMeasurement);
qk_circuit_inst_pauli_product_measurement(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_measurement_clear(&inst);一方、C側ですでにデータの消去が行われている場合は、この関数を呼び出してはなりません。
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkPauliProductMeasurement inst = {z, x, 4, true};
// since this data is allocated by C, we do not call `qk_pauli_product_measurement_clear(&inst)`安全
が有効な、NULLではないへのポインタ QkPauliProductMeasurementでない inst 場合、またはの内部データが QkPauliProductMeasurement 不整合な場合、動作は未定義となる。
パラメーター
- inst – クリアする
QkPauliProductMeasurement対象へのポインタ。
qk_circuit_library_quantum_volume
QkCircuit *qk_circuit_library_quantum_volume(uint32_t num_qubits, size_t depth, int64_t seed)
量子ボリュームモデル回路を生成する
モデル回路は、 [1].で導入した量子ボリューム指標を測定するために使用される回路のランダムなインスタンスである。 モデル回路は、ランダム二分割において対応する量子ビットのペア間に適用されるSU(4)のHaarランダム要素の層で構成される。
この関数はマルチスレッドであり、デフォルトではCPU数と同数のスレッドを持つスレッドプールを起動します。 スレッド数は、RAYON_NUM_THREADS 環境変数で調整できます。 たとえば、 RAYON_NUM_THREADS=4 を設定すると、スレッドプールが4スレッドに制限されます。
[1] A. クロスら ランダム化モデル回路を用いた量子コンピュータの検証、Phys. 改訂版 A 100、032328 (2019)。 arXiv:1811.12926
例
QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)パラメーター
- num_qubits – 生成される回路で使用する量子ビットの数。
- 深さ – 生成される回路のレイヤー数。
- seed – 出力回路で使用されるランダムなSU(4)行列を生成するために使用される乱数生成器(RNG)のシード値。 指定された数値が負の場合、シードはシステムエントロピーから取得されます。
戻り値
量子ボリューム回路へのポインタ。
qk_circuit_library_suzuki_trotter
QkCircuit *qk_circuit_library_suzuki_trotter(const QkObs *op, uint32_t order, uint32_t reps, double time, bool preserve_order, bool insert_barriers)
観測量から、高次スズキ・トロッター積公式を用いて回路を生成する。
スズキ・トロッターの公式は、リー・トロッター近似の誤差を改善する。 この実装では、演算子はパウリ演算子の和項として与えられている。 高次分解は再帰に基づいている。詳細は参考文献を参照のこと。 詳細については[、こちらをご覧ください]。
例
QkObs *obs = qk_obs_zero(1);
QkBitTerm op1_bits[1] = {QkBitTerm_X};
QkObsTerm term1 = {(QkComplex64){1.0, 0.0}, 1, op1_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term1);
QkBitTerm op2_bits[1] = {QkBitTerm_Y};
QkObsTerm term2 = {(QkComplex64){1.0, 0.0}, 1, op2_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term2);
QkCircuit *qc = qk_circuit_library_suzuki_trotter(obs, 2, 1, 0.1, true, false);
qk_obs_free(obs);
qk_circuit_free(qc);安全
「動作は未定義 op 」は、への有効な(NULLではない) QkObsポインタではありません。
参照
[1] : D. ベリー、G. アホカス、R. クリーヴ、およびB. サンダース、「疎なハミルトニアンをシミュレートするための効率的な量子アルゴリズム」(2006年)。 arXiv:quant-ph/0508139
[2] : N. ハタノとM. 鈴木、「高次指数積の公式の求め方」(2005年)。 arXiv:math-ph/0506007
パラメーター
- op – パウリ項の和を含む
QkObs。 - 順序 – 製品処方の順序。
- reps – タイムステップの数。
- 時間 – 進化の時間。
- preserve_order – 設定すると
false、演算子の項の順序を変更し、より浅い進化回路を生成できるようにします。 単一の項から観測量を合成する場合、これは関係ありません。 - insert_barriers – 項の展開の間に区切り文字を挿入するかどうか。
戻り値
生成された回路へのポインタ。