はじめに
Qiskit Textbookの6-1で紹介されている$\pi$パルスは、ゲート$R_x(\pi)$を作用させていることに相当します。量子回路作成する際には位相を変更したいこともあるはずでこの記事ではパルスに対して位相を操作する方法を紹介したいと思います。
https://qiskit.org/textbook/ch-quantum-hardware/calibrating-qubits-pulse.html#Our-$\pi$-pulse!
まず、Qiskit Pulseを動かすために必要な記述をまとめておきます。
import numpy as np
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.visualization import *
from qiskit.circuit import Gate
from qiskit.circuit import Parameter
from qiskit import pulse
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
backend = provider.get_backend('ibmq_armonk')
backend_defaults = backend.defaults()
backend_config = backend.configuration()
位相の設定の仕方
shift_phase()
を使えば位相を変更したパルスを設定できます。
GHz = 1.0e9 # Gigahertz
MHz = 1.0e6 # Megahertz
us = 1.0e-6
qubit=0
frequency=4.97194*GHz
drive_sigma_sec=0.075*us
drive_duration_sec = drive_sigma_sec * 8
pi_amp=0.14
with pulse.build(backend) as ry_1:
pulse.set_frequency(frequency, pulse.drive_channel(qubit))
pulse.shift_phase(np.pi/2, pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=16 * int(pulse.seconds_to_samples(drive_duration_sec) / 16),
amp=pi_amp/2,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name="phase"), pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=16 * int(pulse.seconds_to_samples(drive_duration_sec) / 16),
amp=pi_amp/2,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name="phase"), pulse.drive_channel(qubit))
ry_1.draw(backend=backend)
draw()
でみてみると最初に位相をずらしていること(VZ($-\pi/2$))が分かります。
ただこれだと、位相を変更したあとに、定義するパルスは全て位相が変わった状態になってしまいます。上記のScheduleの中で最初の一つのパルスだけ位相変更したいという場合はphase_offset()
を利用すれば可能です。
with pulse.build(backend) as ry_2:
pulse.set_frequency(frequency, pulse.drive_channel(qubit))
with pulse.phase_offset(np.pi/2, pulse.drive_channel(qubit)):
pulse.play(pulse.Gaussian(duration=16 * int(pulse.seconds_to_samples(drive_duration_sec) / 16),
amp=pi_amp/2,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name="phase"), pulse.drive_channel(qubit))
pulse.play(pulse.Gaussian(duration=16 * int(pulse.seconds_to_samples(drive_duration_sec) / 16),
amp=pi_amp/2,
sigma=pulse.seconds_to_samples(drive_sigma_sec),
name="phase"), pulse.drive_channel(qubit))
ry_2.draw(backend=backend)
draw()
を使ってみてみると最初のパルス実行後位相の設定がもとに戻っていることが分かります。パルスの色の濃淡でも位相が違うことを表現しています。
まとめ
この記事では位相の設定の仕方を紹介しました。パルスに対して位相の設定ができると実験の幅が広がりますね。