で量子コンピューティングの基礎を学びましょう! AWSAmazon Braket デジタル学習プランに登録し、一連の学習コースとデジタル評価を修了すると
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ハローパルス
ここでは、パルスを使って単純なベルペアを直接作成し、Rigettiこのパルスプログラムをデバイス上で実行する方法を学習します。ベルペアは、最初の量子ビットのアダマールゲートと、cnot
1番目と2番目の量子ビットの間にゲートが続く2量子ビットの回路です。パルスを使ってエンタングル状態を作り出すには、ハードウェアの種類とデバイスアーキテクチャに応じた特定のメカニズムが必要です。ゲートの作成にはネイティブのメカニズムは使用しません。cnot
代わりに、cz
ゲートをネイティブに有効にする特定の波形とフレームを使用します。この例では、単一量子ビットのネイティブゲートを使用してアダマールゲートを作成し、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-3Amazon 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")
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
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
なお、このシーケンスは、XYa
量子ビットに関連するフレームがないプログラムでのみ機能しb
、これらのフレームで発生する位相シフトを補正しないため、使用されることに注意してください。これは、rf
cz
とフレームのみを使用するこのシングルベルペアプログラムの場合です。詳細については、Caldwell らを参照してください
これで、パルスを使ったベルペアを作る準備ができました。
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 |
この Bell 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)])