用 Python 写个玩具级量子计算机 (1)

您所在的位置:网站首页 模拟量子程序怎么写 用 Python 写个玩具级量子计算机 (1)

用 Python 写个玩具级量子计算机 (1)

2024-06-04 14:12| 来源: 网络整理| 查看: 265

华中师范大学 hahakity

最近量子计算炒的很火,作为物理专业的学生,学了量子力学却不懂量子计算太可惜。这一节使用 Python 编程,构造一个玩具版本的量子计算机,辅助大家对量子力学和量子计算的理解,从而快速使用量子计算做些有意思的工作。

学习目标单量子位 (Qubit),多Qubit,叠加态 (superposition state), 纠缠态(entanglement)几个常见的量子门 (Gate) 及其作用单Qubit操作,多Qubit操作,态的直积,矩阵的直积预备知识线性代数,量子力学极简介绍

量子计算像一本武林秘籍,这本秘籍的心法是量子力学的多世界诠释。

量子位 Qubit

传统计算机使用比特 0 和 1 以及它们之间的逻辑操作 and,or,not,xor 等位运算构造加减乘除,并搭建整个经典计算机体系。

在量子计算机上,基本的存储单元是量子位,即 Qubit。只要搞明白了 Qubit,以及它们之间的逻辑操作,原则上就可以搭建量子计算机。所以本虚拟机仅实现这些基本功能。

Qubit 可以是任意两个本征态|0\rangle 和 |1 \rangle,或者是它们的线性叠加 |\Psi \rangle = \alpha |0 \rangle + \beta | 1 \rangle ,其中 \alpha, \beta 是复数。

用矩阵表示,一个 Qubit 有两个基向量,

|0\rangle = \begin{bmatrix} 1\\ 0 \end{bmatrix} , |1\rangle = \begin{bmatrix} 0 \\ 1 \end{bmatrix}

最简单可对应为自旋向上 \uparrow 与向下 \downarrow。与经典比特不同的是,一个量子比特可以是自旋 \uparrow 与 \downarrow 的叠加态,在一个世界里粒子自旋向上,另一个世界里自旋向下,就像薛定谔的猫态(既死又活态),

|\Psi \rangle = \alpha |0 \rangle + \beta | 1 \rangle = \alpha \begin{bmatrix} 1\\ 0 \end{bmatrix} + \beta \begin{bmatrix} 0\\ 1\end{bmatrix} = \begin{bmatrix} \alpha \\ \beta \end{bmatrix}

当然,波函数要满足幺正条件: \langle \Psi |\Psi \rangle = [\alpha^*, \beta^*] \begin{bmatrix} \alpha \\ \beta \end{bmatrix} = |\alpha|^2 + |\beta|^2 = 1 。

更多的比特可以通过直积 \otimes 生成,这个直积完成如下操作,

A \otimes B = \begin{bmatrix} A_{00} B & A_{01} B \\ A_{10}B & A_{11}B \end{bmatrix}

比如两量子比特,

|00\rangle = |0\rangle \otimes |0 \rangle = \begin{bmatrix} 1 \\ 0 \end{bmatrix} \otimes \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \end{bmatrix}

|01\rangle = |0\rangle \otimes |1 \rangle = \begin{bmatrix} 1 \\ 0 \end{bmatrix} \otimes \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \end{bmatrix}

|10\rangle = |1\rangle \otimes |0 \rangle = \begin{bmatrix} 0 \\ 1\end{bmatrix} \otimes \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 1 \\ 0 \end{bmatrix}

|11\rangle = |1\rangle \otimes |1 \rangle = \begin{bmatrix} 0 \\ 1\end{bmatrix} \otimes \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \end{bmatrix}

两个 Qubit 生成了4个基向量,每个基向量只有一位为1,其余位为0,称为 one-hot 表示。

一个一般的两 Qubit 态可以展开为,

|\Psi\rangle =\alpha_0 |00\rangle +\alpha_1 |01\rangle + \alpha_2 |10\rangle + \alpha_3 |11\rangle

我们先用 Python 构造单个 Qubit,然后通过直积构造 n 个 Qubit 的 2^n 维基向量。

构造基向量

在 jupyter notebook 开头,导入库 numpy,scipy 以及输出数学公式的 Markdown库。

下面这段程序还定义了自旋向上,自旋向下态以及它们的集合 bit。

import numpy as np from scipy.linalg import kron from IPython.display import Markdown as md spin_up = np.array([[1, 0]]).T spin_down = np.array([[0, 1]]).T # bit[0] = |0>, bit[1] = |1> bit = [spin_up, spin_down]

单个 Qubit 没什么可讲,我们来看一看两个或多个 Qubit 的基向量如何构造

下面定义一个函数,给定 Qubits 序列,返回它的 one hot 表示,

def basis(string='00010'): '''string: the qubits sequence''' res = np.array([[1]]) # 从最后一位开始往前数,做直积 for idx in string[::-1]: res = kron(bit[int(idx)], res) return np.matrix(res)

构造基向量 |10\rangle ,输入 basis('10').A1, 返回,

array([0, 0, 1, 0])

注意:直积操作 \otimes 用 scipy.linalg 中的 kron() 函数。

basis() 返回了 np.matrix 数据类型,它的 .A1 属性将矩阵转化为 1 维 numpy 数组。

两个Qubit,基向量是4维,3个Qubit是8维,10个Qubit基向量是1024维,在多体量子计算中,大家一般要计算超大矩阵的基态本征值,如果用 100 个 Qubit 进行 2^{100} 个态的多体量子系统计算,可远超经典计算机能够存储和处理的数据极限。自从费曼提出这个想法,大家就一直为量子计算机而疯魔。

这里我们随便试一下 20 个量子比特的基向量的维数,

len(basis('00100000001000011100'))

输出为:1048576

即原则上 20 个 Qubit 可以



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3