헬로 펄스 - Amazon Braket

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

헬로 펄스

여기서는 펄스로 직접 간단한 벨 페어를 구성하고 Rigetti 장치에서 이 펄스 프로그램을 실행하는 방법을 알아봅니다. 벨 페어는 첫 번째 큐비트의 하다마드 게이트와 첫 번째 큐비트와 두 번째 큐비트 사이의 cnot 게이트로 구성된 2큐비트 회로입니다. 펄스로 얽힌 상태를 만들려면 하드웨어 유형과 장치 아키텍처에 따라 달라지는 특정 메커니즘이 필요합니다. 기본 메커니즘을 사용하여 게이트를 만들지는 않겠습니다. cnot 대신 cz 게이트를 기본적으로 활성화하는 특정 파형과 프레임을 사용하겠습니다. 이 예제에서는 단일 큐비트 네이티브 게이트를 사용하여 Hadamard 게이트를 만들고 펄스를 사용하여 게이트를 rx 표현합니다. rz cz

먼저 필요한 라이브러리를 가져와 보겠습니다. 이제 Circuit 클래스 외에도 클래스도 가져와야 합니다. PulseSequence

from braket.aws import AwsDevice from braket.pulse import PulseSequence, ArbitraryWaveform, GaussianWaveform from braket.circuits import Circuit import braket.circuits.circuit as circuit

다음으로, 디바이스의 Amazon 리소스 이름 (ARN) 을 사용하여 새 Braket 디바이스를 인스턴스화합니다. Rigetti Aspen-M-3 디바이스의 레이아웃을 보려면 Amazon Braket 콘솔의 Rigetti Aspen-M-3 디바이스 페이지를 참조하십시오.

a=10 #specifies the control qubit b=113 #specifies the target qubit device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-3")

Hadamard 게이트는 Rigetti 디바이스의 기본 게이트가 아니므로 펄스와 함께 사용할 수 없습니다. 따라서 이를 및 네이티브 게이트의 시퀀스로 분해해야 합니다. rx rz

import numpy as np import matplotlib.pyplot as plt @circuit.subroutine(register=True) def rigetti_native_h(q0): return ( Circuit() .rz(q0, np.pi) .rx(q0, np.pi/2) .rz(q0, np.pi/2) .rx(q0, -np.pi/2) )

cz게이트의 경우 캘리브레이션 단계에서 하드웨어 공급업체가 미리 정한 파라미터 (진폭, 상승/하강 시간, 지속 시간) 가 포함된 임의 파형을 사용합니다. 이 파형은 에 적용됩니다. q10_q113_cz_frame 여기에 사용된 임의 파형의 최신 버전은 웹 사이트의 QCS를 참조하십시오. Rigetti QCS 계정을 만들어야 할 수도 있습니다.

a_b_cz_wfm = ArbitraryWaveform([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00017888439538396808, 0.00046751103636033026, 0.0011372942989106456, 0.002577059611929697, 0.005443941944632366, 0.010731922770068104, 0.01976701723583167, 0.03406712171899736, 0.05503285980691202, 0.08350670755829034, 0.11932853352131022, 0.16107456696238298, 0.20614055551722368, 0.2512065440720643, 0.292952577513137, 0.328774403476157, 0.3572482512275353, 0.3782139893154499, 0.3925140937986156, 0.40154918826437913, 0.4068371690898149, 0.4097040514225177, 0.41114381673553674, 0.411813599998087, 0.4121022266390633, 0.4122174383870584, 0.41226003881132406, 0.4122746298554775, 0.4122792591252675, 0.4122806196003006, 0.41228098995582513, 0.41228108334474756, 0.4122811051578895, 0.4122811098772742, 0.4122811108230642, 0.4122811109986316, 0.41228111102881937, 0.41228111103362725, 0.4122811110343365, 0.41228111103443343, 0.4122811110344457, 0.4122811110344471, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.41228111103444737, 0.4122811110344471, 0.4122811110344457, 0.41228111103443343, 0.4122811110343365, 0.41228111103362725, 0.41228111102881937, 0.4122811109986316, 0.4122811108230642, 0.4122811098772742, 0.4122811051578895, 0.41228108334474756, 0.41228098995582513, 0.4122806196003006, 0.4122792591252675, 0.4122746298554775, 0.41226003881132406, 0.4122174383870584, 0.4121022266390633, 0.411813599998087, 0.41114381673553674, 0.4097040514225176, 0.4068371690898149, 0.40154918826437913, 0.3925140937986155, 0.37821398931544986, 0.3572482512275351, 0.32877440347615655, 0.2929525775131368, 0.2512065440720641, 0.20614055551722307, 0.16107456696238268, 0.11932853352131002, 0.08350670755829034, 0.05503285980691184, 0.03406712171899729, 0.01976701723583167, 0.010731922770068058, 0.005443941944632366, 0.002577059611929697, 0.0011372942989106229, 0.00046751103636033026, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) a_b_cz_frame = device.frames[f'q{a}_q{b}_cz_frame'] dt = a_b_cz_frame.port.dt a_b_cz_wfm_duration = len(a_b_cz_wfm.amplitudes)*dt print('CZ pulse duration:', a_b_cz_wfm_duration*1e9, 'ns')

그러면 다음과 같은 결과가 반환됩니다.

CZ pulse duration: 124 ns

이제 방금 정의한 파형을 사용하여 cz 게이트를 구성할 수 있습니다. 제어 큐비트가 해당 상태에 있는 경우 cz 게이트는 대상 큐비트의 위상 플립으로 구성된다는 점을 기억하세요. |1>

phase_shift_a=1.1733407221086924 phase_shift_b=6.269846678712192 a_rf_frame = device.frames[f'q{a}_rf_frame'] b_rf_frame = device.frames[f'q{b}_rf_frame'] frames = [a_rf_frame, b_rf_frame, a_b_cz_frame] cz_pulse_sequence = ( PulseSequence() .barrier(frames) .play(a_b_cz_frame, a_b_cz_wfm) .delay(a_rf_frame, a_b_cz_wfm_duration) .shift_phase(a_rf_frame, phase_shift_a) .delay(b_rf_frame, a_b_cz_wfm_duration) .shift_phase(b_rf_frame, phase_shift_b) .barrier(frames) )

a_b_cz_wfm파형은 패스트 플럭스 포트에 연결된 프레임에서 재생됩니다. 그 역할은 큐비트 주파수를 이동시켜 큐비트-큐비트 상호 작용을 활성화하는 것입니다. 자세한 내용은 프레임 및 포트의 역할을 참조하십시오. 주파수가 변함에 따라 큐비트 프레임은 그대로 유지되는 단일 큐비트 프레임과 다른 속도로 회전합니다. 후자의 큐비트 rf 프레임은 디페이즈되고 있습니다. 이러한 위상 변화는 사전에 Ramsey 시퀀스를 통해 보정되었으며, 여기서는 및 (전체 기간) 를 통해 하드코딩된 정보로 제공됩니다. phase_shift_a phase_shift_b 프레임에 있는 지침을 사용하여 이러한 디페이징을 수정합니다. shift_phase rf 이 시퀀스는 a 큐비트와 관련된 XY 프레임이 없고 사용되는 프로그램에서만 작동한다는 점에 유의하십시오. 이러한 프레임에서 발생하는 위상 변이를 보상하지 않기 b 때문입니다. 이것은 rfcz 프레임만 사용하는 이 단일 벨 페어 프로그램의 경우입니다. 자세한 내용은 콜드웰 등을 참조하십시오. .

이제 펄스가 있는 벨 페어를 만들 준비가 되었습니다.

bell_circuit_pulse = ( Circuit() .rigetti_native_h(a) .rigetti_native_h(b) .pulse_gate([a, b], cz_pulse_sequence) .rigetti_native_h(b) ) print(bell_circuit_pulse)
T : | 0 | 1 | 2 | 3 |4 | 5 | 6 | 7 | 8 | q5 : -Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)-PG-------------------------------------- | q6 : -Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)-PG-Rz(3.14)-Rx(1.57)-Rz(1.57)-Rx(-1.57)- T : | 0 | 1 | 2 | 3 |4 | 5 | 6 | 7 | 8 |

이 벨 페어를 Rigetti 기기에서 실행해 봅시다. 이 코드 블록을 실행하면 요금이 부과된다는 점에 유의하세요. 이러한 비용에 대한 자세한 내용은 Amazon Braket 가격 책정 페이지를 참조하십시오. 샷 수를 늘리기 전에 소량의 샷을 사용하여 회로를 테스트하여 디바이스에서 회로를 실행할 수 있는지 확인하는 것이 좋습니다.

task = device.run(bell_pair_pulses, shots=100) counts = task.result().measurement_counts plt.bar(sorted(counts), [counts[k] for k in sorted(counts)])
서로 다른 4가지 이진 주 (00, 01, 10, 11) 의 인구 비율을 보여주는 막대형 차트로, 00과 11의 비율이 0.4 부근에서 가장 높고 01과 10의 비율이 가장 낮습니다.