회로 라이브러리
Qiskit 회로 라이브러리에는 자주 사용되는 양자 회로를 구축하기 위한 함수와 고수준 구성 요소가 포함되어 있습니다.
데이터 유형
QkPauliProductRotation
struct QkPauliProductRotation
파울리 곱 회전 데이터의 시각화.
파울리 곱 회전은 n개의 len 큐비트에 대해 파울리 곱으로 정의된 축을 angle 중심으로 회전을 구현합니다. 여기서 파울리 벡터는 Z와 X 성분을 나타내는 두 개의 부울 배열로 구성된 ZX 형식으로 표현됩니다.
bool *z
Z 성분으로 구성된 길이-len 배열을 가리키는 포인터.
bool *x
X 개 요소로 구성된 length-차원len 배열을 가리키는 포인터.
size_t len
파울리 항의 개수.
QkParam *각도
회전 각도.
QkPauliProductMeasurement
struct QkPauliProductMeasurement
파울리 곱 측정 데이터의 시각화.
파울리 곱 측정(Pauli product measurement)은 정의된 파울리 곱의 고유공간으로의 투영을 구현한다. len 여기서 파울리 벡터는 Z와 X 성분을 나타내는 두 개의 부울 배열로 구성된 ZX 형식으로 표현되며, 마이너스 기호(- flip_outcome)를 포함할 수 있습니다.
bool *z
Z 성분으로 구성된 길이-len 배열을 가리키는 포인터.
bool *x
X 개 요소로 구성된 length-차원len 배열을 가리키는 포인터.
size_t len
파울리 항의 개수.
bool flip_outcome
측정 결과에 마이너스 기호가 있는지 여부.
QkNLocalSettings
struct QkNLocalSettings
n-로컬 변분 회로 생성을 위한 설정.
여기에는 얽힘 전략 (entanglement_strategy), 회전 및 얽힘 레이어의 반복 횟수 (reps), 매개변수가 있는 게이트에 대한 매개변수 접두사 (parameter_prefix), 각 레이어 후에 장벽을 추가할지 여부 (insert_barriers), 그리고 마지막 레이어를 건너뛸지 여부 (skip_final_rotation_layer)가 포함됩니다
데이터의 일관성을 유지하는 것은 사용자의 책임입니다. 아래의 ‘안전’ 섹션도 함께 참조하시기 바랍니다.
안전
parameter_prefix 문자열의 끝에 유효한 널 종결자가 포함된 메모리를 가리키는 포인터여야 합니다. 또한, 이 값은 널 종결자를 포함하여 그 이전의 바이트를 읽을 때도 유효해야 합니다.
QkEntanglementStrategy entanglement_strategy
생성된 회로에 적용될 얽힘 전략. 자세한 내용은 QkEntanglementStrategy의 내용을 참조하십시오.
size_t reps
회전 블록과 얽힘 블록이 반복되는 빈도를 지정합니다.
const char *parameter_prefix
생성된 기본 매개변수에 사용되는 접두사.
bool insert_barriers
만약 그렇다면 true, 각 층 사이에 장벽이 삽입된다. 인 경우 false, 장벽이 삽입되지 않습니다.
bool skip_final_rotation_layer
회로에 최종 회전 층이 추가되는지 여부.
QkEntanglementStrategy
enum QkEntanglementStrategy
n_local 얽힘 블록에 대해 가능한 모든 전략을 나타내는 열거형입니다.
값:
열거형 QkEntanglementStrategy_Full
각 큐비트가 다른 모든 큐비트와 얽혀 있는 얽힘 상태.
열거자 QkEntanglementStrategy_Linear
가 큐비트의 총 개수이고, 모든 에 대해 큐비트 가 큐비트 와 얽혀 있는 얽힘 상태.
열거자 QkEntanglementStrategy_ReverseLinear
가 큐비트의 총 개수이고, 모든 에 대해 큐비트 가 큐비트 와 얽혀 있는 얽힘 상태.
열거자 QkEntanglementStrategy_Circular
선형 얽힘과 동일한 특성을 보이지만, 선형 부분 앞에 첫 번째와 마지막 큐비트 간의 추가적인 얽힘이 존재하는 얽힘.
열거자 QkEntanglementStrategy_Pairwise
한 층에는 의 모든 짝수 값에 대해 큐비트 가 큐비트 와 얽혀 있는 얽힘이 존재하고, 두 번째 층에는 의 모든 홀수 값에 대해 큐비트 가 큐비트 와 얽혀 있는 얽힘이 존재한다.
열거자 QkEntanglementStrategy_Sca
얽힘: 이동-원형-교대. 이는 Sim 등(Sim et al.)이 제안한 회로 14를 일반화하고 수정된 버전입니다
이는 첫 번째 큐비트와 마지막 큐비트를 연결하는 “긴” 얽힘이 각 블록마다 하나씩 이동하는 원형 얽힘으로 구성됩니다.
또한 제어 큐비트와 대상 큐비트의 역할은 블록마다 바뀝니다(따라서 번갈아 가며).
함수
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** 는** 행 우선 순서(row-major order)로 배열된 최소 num_qubits * num_qubits 개의 연속된 int64_t 값을 가리키는 유효하고 null이 아닌 포인터여야 합니다. 가 가리키는 메모리는 올바르게 정렬되어 있어야 하며, 이 호출이 interactions 진행되는 동안 읽을 수 있어야 하고, 가변적 별칭이 없어야 합니다. 유효하지 않은 포인터나 용량이 너무 작은 버퍼를 전달하면 정의되지 않은 동작이 발생합니다.
매개변수
- num_qubits – 논리 큐비트 수 (
n).interactions행렬의 차원과 일치해야 합니다. - 상호작용 – 형식의 행 우선
n × n행렬을int64_t가리키는 포인터. 다음의 경우에만num_qubits == 0NULL일 수 있습니다. - check_input – 이 함수는 행렬이 대칭 행렬인지 확인하고
true, 그렇지 않은 경우 를NULL반환합니다. 이 경우false, 추가적인 유효성 검사는 수행되지 않습니다.
리턴
성공 시 새로 QkCircuit* 할당된 (호출자는 로 해제해야 qk_circuit_free 함), 또는 이고 interactions NULL 인 num_qubits > 0 경우 NULL, 혹은 이고 행렬이 check_input``true 대칭이 아닌 경우.
qk_circuit_library_random_iqp
QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)
무작위 순간 양자 다항식(IQP) 회로를 생성합니다.
이 코드는 내부적으로 임의의 대칭 정수 상호작용 행렬을 생성하고, 이를 사용하여 IQP 회로를 구축하며, 이는 Pythonqiskit.circuit.library.IQP 생성자와 유사합니다.
매개변수
- num_qubits – 큐비트 수.
- 시드 – 난수 생성기(RNG) 시드. 음수인 경우 OS에서 엔트로피를 가져오고, 그렇지 않은 경우 주어진 값을 결정론적 시드로 사용합니다.
리턴
새로 할당된 QkCircuit* (호출자는 로 해제해야 qk_circuit_free 함).
qk_circuit_library_n_local
QkCircuit *qk_circuit_library_n_local(uint32_t num_qubits, const QkGate *rotation_blocks, size_t rotation_blocks_size, const QkGate *entanglement_blocks, size_t entanglement_blocks_size, const QkNLocalSettings *settings)
n-로컬 변분 회로를 구성하라.
n-로컬 회로의 구조는 회전 층과 얽힘 층이 번갈아 배열된 형태입니다. 두 계층 모두에서, 매개변수화된 회로 블록은 정의된 방식으로 회로에 작용합니다. 회전 층에서는 블록들이 서로 겹쳐지도록 적용되는 반면, 얽힘 층에서는 해당 entanglement 전략에 따라 적용됩니다. 회로 블록의 크기는 임의로 설정할 수 있습니다(단, 회로 내 큐비트 수 이하이어야 합니다). 각 레이어는 번 reps 반복되며, 기본적으로 마지막 회전 레이어가 추가됩니다.
예를 들어, 2개의 큐비트에 대한 회전 블록과 QkEntanglementStrategy_Linear 얽힘을 이용한 4개의 큐비트에 대한 얽힘 블록을 결합하면 다음과 같은 회로가 만들어집니다.
┌──────┐ ░ ┌──────┐ ░ ┌──────┐
┤0 ├─░─┤0 ├──────────────── ... ─░─┤0 ├
│ Rot │ ░ │ │┌──────┐ ░ │ Rot │
┤1 ├─░─┤1 ├┤0 ├──────── ... ─░─┤1 ├
├──────┤ ░ │ Ent ││ │┌──────┐ ░ ├──────┤
┤0 ├─░─┤2 ├┤1 ├┤0 ├ ... ─░─┤0 ├
│ Rot │ ░ │ ││ Ent ││ │ ░ │ Rot │
┤1 ├─░─┤3 ├┤2 ├┤1 ├ ... ─░─┤1 ├
├──────┤ ░ └──────┘│ ││ Ent │ ░ ├──────┤
┤0 ├─░─────────┤3 ├┤2 ├ ... ─░─┤0 ├
│ Rot │ ░ └──────┘│ │ ░ │ Rot │
┤1 ├─░─────────────────┤3 ├ ... ─░─┤1 ├
└──────┘ ░ └──────┘ ░ └──────┘
| |
+---------------------------------+
repeated reps times얽힘:
얽힘은 얽힘 계층 내 게이트들의 연결 관계를 설명합니다. 예를 들어, 2큐비트 게이트의 경우, 얽힘에는 게이트가 작용해야 하는 큐비트 쌍이 포함됩니다. 예를 들어, [[ctrl0, target0], [ctrl1, target1], ...]. 사용 가능한 얽힘 전략에 대해 더 자세히 알아보려면 다음을 참조하십시오 QkEntanglementStrategy.
예
size_t num_qubits = 2;
QkGate rotation_blocks[1] = {QkGate_H};
QkGate entanglement_blocks[1] = {QkGate_CRX};
QkNLocalSettings settings = qk_circuit_library_n_local_settings_default();
settings.reps = 2;
// For this example we use QkEntanglementStrategy_Linear since
// the default is QkEntanglementStrategy_Full
settings.entanglement_strategy = QkEntanglementStrategy_Linear;
QkCircuit *qc = qk_circuit_library_n_local(num_qubits, rotation_blocks, 1,
entanglement_blocks, 1, &settings);
qk_circuit_free(qc);안전
- 가 의 연속된
rotation_blocks_size개 요소로 구성된 시퀀스를 가리키는 유효하고 null이 아닌 포인터가rotation_blocks아닌 경우, 동작은 정의되지 않습니다StandardGate. - 가 의 연속된
entanglement_blocks_size개 요소로 구성된 시퀀스를 가리키는 유효하고 null이 아닌 포인터가entanglement_blocks아닌 경우, 동작은 정의되지 않습니다StandardGate. - 가
settings유효하고 null이 아닌 포인터가 아닌 경우, 동작은 정의되지 않습니다.
매개변수
- num_qubits – 회로의 큐비트 수.
- rotation_blocks – 회전 레이어에 사용되는 블록들.
- rotation_blocks_size – 제공된 회전 블록 배열의 길이.
- entanglement_blocks – 얽힘 레이어에 사용되는 블록들.
- entanglement_blocks_size – 제공된 얽힘 블록 목록의 길이.
- 설정 – 생성된 회로에 적용될 설정을 가리키는 포인터입니다
QkNLocalSettings.NULL인 경우 기본 설정이 적용되며, 자세한 내용은 를QkNLocalSettings참조하십시오.
리턴
생성된 회로에 대한 포인터.
qk_circuit_library_n_local_settings_default
QkNLocalSettings qk_circuit_library_n_local_settings_default(void)
qk_circuit_library_n_local.에 대한 기본 옵션을 생성합니다.
리턴
기본 설정이 적용된 객체 QkNLocalSettings .
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 포인터가 아니거나, 의 내부 QkPauliProductRotation 데이터가 일관성이 없는 경우 동작이 inst 정의되지 않습니다.
매개변수
- 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 포인터가 아니거나, 의 내부 QkPauliProductMeasurement 데이터가 일관성이 없는 경우 동작이 inst 정의되지 않습니다.
매개변수
- 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)의 하아르 무작위 요소 층으로 구성된다.
이 함수는 멀티스레드 방식으로 동작하며, 기본적으로 CPU 개수와 동일한 스레드로 구성된 스레드 풀을 생성합니다. 스레드 수는 RAYON_NUM_THREADS 환경 변수로 조정할 수 있습니다. 예를 들어, RAYON\_NUM\_THREADS=4를 설정하면 스레드 풀을 4개 스레드로 제한합니다.
[1] A. 크로스 외 무작위 모델 회로를 이용한 양자 컴퓨터 검증, Phys. Rev. A 100, 032328 (2019). arXiv:1811.12926
예
QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)매개변수
- num_qubits – 생성된 회로에 사용할 큐비트 수.
- 깊이 – 생성된 회로의 레이어 수.
- 시드 – 출력 회로에서 사용되는 무작위 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)
관측량으로부터 고차 스즈키-트로터 곱 공식에 따라 회로를 생성하십시오.
스즈키-트로터 공식은 리-트로터 근사법의 오차를 개선한다. 이 구현에서는 연산자들이 파울리 연산자의 합성항으로 제공됩니다. 고차 분해는 재귀에 기초하며, 참고 문헌을 참조하십시오. 자세한 내용은 [1번을] 참조하세요.
예
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);안전
'Behavior is undefined'는 유효한 null이 op 아닌 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 – 용어 사이에 구분선을 삽입할지 여부.
리턴
생성된 회로에 대한 포인터.