布洛赫球

下载Notebook下载样例代码查看源文件

单比特量子态

与经典比特不一样的是,量子比特可以同时处于计算基矢 \(\left|0\right>\) 态和 \(\left|1\right>\)态上,通常表示为:

\[\left|\psi\right> = a\left|0\right> + b\left|1\right>\]

这里,\(a\)\(b\)是复数。由于量子态的归一性条件 \(\left<\psi\middle|\psi\right> = 1\),因此,我们有:

\[\left|a\right|^2 + \left|b\right|^2 = 1\]

对于二维希尔伯特空间,我们可以将计算基矢做如下的映射,

\[\begin{split}\left|0\right> = \begin{pmatrix} 1 \\ 0 \end{pmatrix}, \left|1\right> = \begin{pmatrix} 0 \\ 1 \end{pmatrix}\end{split}\]

因此,任意单比特量子态可表述为:

\[\begin{split}\left|\psi\right> = \begin{pmatrix} a \\ b \end{pmatrix}\end{split}\]

在一般情况,我们并不关心全局相位,因此,我们可以假设 \(a=\cos\left(\theta/2\right), b=e^{i\phi}\sin\left(\theta/2\right)\)

\[\left|\psi\right> = \cos\left(\theta/2\right) \left|0\right> + e^{i\phi}\sin\left(\theta/2\right)\left|1\right>\]

这里,我们不妨在单位球中来表示该任意量子态,如下图,将 \(\theta\)\(\phi\) 分别取为仰角和方位角。

bloch-sphere

下面,我们将展示怎么在MindSpore Quantum中展示一个单比特量子态,并且以动画的形式展示单比特量子态的演化。

导入相关模块

[9]:
from mindquantum.core.circuit import Circuit
from mindquantum.core.gates import RX, RZ
from mindquantum.io.display import BlochScene

为了在Jupyter Notebook中动态展示量子态,我们需要运行如下指令:

[10]:
%matplotlib ipympl

搭建量子线路

由上面bloch球可知,我们可以通过旋转门 RX 来控制仰角 \(\theta\),通过 RZ 来控制方位角 \(\phi\)。因此,我们可以搭建如下量子线路:

[11]:
circ = Circuit()               # 搭建制备任意单比特量子态的线路
circ += RX('theta').on(0)      # 通过RX门控制仰角
circ += RZ('phi').on(0)        # 通过RZ门控制方位角
circ.svg()
[11]:
../_images/beginner_bloch_sphere_5_0.svg

这里我们不妨取 \(\theta=\pi/4, \phi=\pi/4\),并计算出该位置的量子态。

[12]:
import numpy as np

state1 = circ.get_qs(pr={'theta': np.pi/4, 'phi': np.pi/4})
print(state1)
[0.85355339-0.35355339j 0.14644661-0.35355339j]

展示量子态

在MindSpore Quantum中,BlochScene 是用来展示布洛赫球的模块,我们可以在 BlochScene 中添加任意多的单比特量子态,并且还可以动画展示单比特量子态的演化。

[13]:
scene = BlochScene()                       # 创建布洛赫绘图场景
fig, ax = scene.create_scene()             # 初始化场景
state_obj1 = scene.add_state(ax, state1)   # 往场景中添加一个量子态

此外,我们还可以以深色模式来展示布洛赫球,如下。

[14]:
scene = BlochScene('dark')                       # 创建布洛赫绘图场景
fig, ax = scene.create_scene()                   # 初始化场景
state_obj1 = scene.add_state(ax, state1)         # 往场景中添加一个量子态

展示量子态演化

当该量子态是一个含时演化的量子态时,我们还可以在布洛赫场景中创建动画。这里我们不妨假设仰角 \(\theta\) 和方位角 \(\phi\) 是含时的,我们求出所有时间内的量子态。

[20]:
t = np.linspace(0, 10, 500)
all_theta = 4 * np.sin(2 * t)
all_phi = 5 * np.cos(3 * t)
states = []
for theta, phi in zip(all_theta, all_phi):
    states.append(circ.get_qs(pr={'theta': theta, 'phi': phi}))
states = np.array(states)

下面,我们创建一个深色的布洛赫场景,并用所演化出来的量子态的第一个量子态来初始化场景。

[22]:
scene = BlochScene('dark')                          # 创建布洛赫绘图场景
fig, ax = scene.create_scene()                      # 初始化场景
state_obj = scene.add_state(ax, states[0])          # 往场景中添加一个量子态

为了能够动态展示量子态的演化,我们从布洛赫场景中创建一个动画对象。

[23]:
anim = scene.animation(fig, ax, state_obj, states)

bloch-sphere-anim

由此,我们可以看到单比特的量子态在布洛赫球中已经动起来了。

[1]:
from mindquantum.utils.show_info import InfoTable

InfoTable('mindquantum', 'scipy', 'numpy')
[1]:
Software Version
mindquantum0.9.11
scipy1.10.1
numpy1.24.4
System Info
Python3.8.17
OSLinux x86_64
Memory16.62 GB
CPU Max Thread16
DateTue Jan 2 14:41:09 2024