位相の設定

# はじめに
Qiskit Textbookの6-1で紹介されている$\pi$パルスは、ゲート$R_x(\pi)$を作用させていることに相当します。量子回路作成する際には位相を変更したいこともあるはずでこの記事ではパルスに対して位相を操作する方法を紹介したいと思います。

https://qiskit.org/textbook/ch-quantum-hardware/calibrating-qubits-pulse.html#Our-$\pi$-pulse!


まず、Qiskit Pulseを動かすために必要な記述をまとめておきます。


```python
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()`を使えば位相を変更したパルスを設定できます。

https://qiskit.org/documentation/locale/ja_JP/stubs/qiskit.pulse.builder.shift_phase.html

```python
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)
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78339/32f05b38-12ee-474a-6c9f-3d2a24e20038.png)

`draw()`でみてみると最初に位相をずらしていること（VZ($-\pi/2$)）が分かります。

ただこれだと、位相を変更したあとに、定義するパルスは全て位相が変わった状態になってしまいます。上記のScheduleの中で最初の一つのパルスだけ位相変更したいという場合は`phase_offset()`を利用すれば可能です。

https://qiskit.org/documentation/locale/ja_JP/stubs/qiskit.pulse.builder.phase_offset.html

```python
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)
```

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78339/b045fd2f-4ad6-3ad2-dcce-5c80d944f90a.png)

`draw()`を使ってみてみると最初のパルス実行後位相の設定がもとに戻っていることが分かります。パルスの色の濃淡でも位相が違うことを表現しています。

# まとめ

この記事では位相の設定の仕方を紹介しました。パルスに対して位相の設定ができると実験の幅が広がりますね。