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

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

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

nn 가 큐비트의 총 개수이고, 모든 i∈{0,1,...,n−2}i \in \{0, 1, ... , n - 2\} 에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀 있는 얽힘 상태.

열거자 QkEntanglementStrategy_ReverseLinear

nn 가 큐비트의 총 개수이고, 모든 i∈{n−2,n−3,...,1,0}i \in \{n-2, n-3, ... , 1, 0\} 에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀 있는 얽힘 상태.

열거자 QkEntanglementStrategy_Circular

선형 얽힘과 동일한 특성을 보이지만, 선형 부분 앞에 첫 번째와 마지막 큐비트 간의 추가적인 얽힘이 존재하는 얽힘.

열거자 QkEntanglementStrategy_Pairwise

한 층에는 ii 의 모든 짝수 값에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀 있는 얽힘이 존재하고, 두 번째 층에는 ii 의 모든 홀수 값에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀 있는 얽힘이 존재한다.

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

리턴

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

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