Skip to main content
IBM Quantum Platform

회로 라이브러리

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

측정 결과에 마이너스 기호가 있는지 여부.


함수

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 NULLnum_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_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 – 용어 사이에 구분선을 삽입할지 여부.

리턴

생성된 회로에 대한 포인터.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.