想象一下,你打开笔记本电脑,然后编写遵循量子物理定律的代码。这听起来像科幻小说中的情节,对吧?
当我第一次听说量子计算的时候,也是这么想的。我以为量子计算机是藏在秘密实验室里的机器,还想象到那些穿着白大褂的研究人员正在操作价值数百万美元的设备。
但后来我发现了一个令人惊讶的事实:你完全可以在普通的笔记本电脑上使用Python来编写并运行你的第一个量子程序。
不需要任何量子计算机,也不需要物理学学位或高等数学知识。
只需要Python就可以了。
在这个教程中,你将学习如何使用Python和Qiskit来构建你的第一个量子电路。
通过这个教程,你会了解什么是量子电路、量子比特是如何工作的,以及如何创建量子计算中最著名的实验之一——贝尔态实验。
让我们开始吧。
目录
什么是量子计算?
大多数软件开发人员都是使用普通计算机进行工作的,就像你使用的笔记本电脑、智能手机或游戏机一样。
这些设备都是通过比特来处理信息的。一个比特一次只能表示一个值:0 或 1,没有其他中间状态。
而量子计算机则使用不同的原理。它们使用的是量子比特。在未被测量的情况下,一个量子比特可以同时处于0和1这两种状态之中。
如果这听起来很奇怪,也不要担心——初次接触时,所有人都会觉得这样不可思议。
想象一下硬币:当硬币平放在桌子上时,它要么是正面,要么是反面。普通计算机中的比特也是这样工作的。但现在,请想象让这个硬币旋转起来,在旋转的过程中,它的正反两面会同时呈现出来。量子比特的工作原理恰恰就是这样的。
这个解释可能并不完美,但对于初学者来说已经足够用了。
正是这种特性使得量子计算机能够在解决某些类型的问题时,采用与普通计算机不同的方法。
为什么Python开发者应该关注量子计算?
你可能会想:“我是一名Python开发者,为什么要学习量子计算呢?”
这是个很好的问题。
事实上,量子计算目前还处于发展的早期阶段,但几年前人工智能也是如此。那些早早开始学习相关技术的开发者往往能够获得优势。
由于Python语言简单易学,非常适合初学者使用,因此它已经成为了量子编程中最受欢迎的语言之一。许多重要的量子计算平台都提供了Python相关的开发库,例如:
在这些选项中,Qiskit是开始学习的最佳选择。在本教程中,你也将使用这个工具。
如果你已经了解变量、函数以及Python的基本语法,那么你现在就可以开始学习了。
什么是量子电路?
如果你曾经开发过Web应用程序,那么你应该对工作流程比较熟悉吧。
举个例子:
用户点击按钮
↓
数据被验证
↓
请求被发送
↓
返回响应结果
量子电路的工作原理也与此类似。只不过,它处理的是量子比特,而不是用户输入的信息。
简单来说,量子电路就是一系列针对量子比特制定的指令序列。
下面是一个简化的流程图:
创建量子比特
↓
应用量子门操作
↓
测量结果
↓
显示输出结果
从本质上讲,量子电路的核心过程就是对量子比特进行初始化、执行相应的操作,然后测量最终的结果。
像Python开发者一样解释量子门
如果你曾经编写过Python代码,那么你肯定多次修改过变量的值。
例如:
light = False
light = not light
print(light)
输出结果为:
True
not运算符用于改变变量的值。它会将False变为True。
量子计算机也需要类似的方法来改变数值。不过,它们并不使用像not这样的运算符,而是采用所谓的量子门来实现这一功能。
可以把量子门想象成特殊的指令,用来告诉量子比特该执行什么操作。
就像Python语言中也有各种运算符一样:
-
not -
+ -
- -
*
量子计算中也存在类似的“运算符”:
-
X门
-
H门
-
CX门
让我们逐一了解这些量子门的功能吧。
X门:量子版的电灯开关
想象一下你房间里的电灯开关。
当开关处于关闭状态时,它的状态是OFF;按下开关后,它会变成ON;再按一次,它又会回到OFF状态。
这个开关会在“开”和“关”这两种状态之间不断切换,而X门的功能也正是如此。
经典示例
0 → 1
1 → 0
量子示例
qc.x(0)
这意味着:对量子比特0应用X门操作。
如果原本量子比特0>表示的是0,那么经过X门操作后,它就会变成1;反之亦然。
可以把X门理解为量子版本的电灯开关,或者Python语言中的not运算符。
H门:旋转硬币的魔术
现在事情变得有趣了。想象我把一枚硬币放在桌子上,它要么是正面,要么是反面,对吧?
普通计算机也是这样工作的——一个比特要么表示0,要么表示1。
但是现在假设我把这枚硬币抛出去让它旋转。在它旋转的过程中,你能确定它在某一时刻一定是正面吗?
不能。
那它能是反面吗?
也不能。
因为硬币还没有落下来,它处于一种两种结果都可能发生的特殊状态中。
这就是理解H门功能的最简单方式。
示例
qc.h(0)
这条指令告诉Qiskit,让量子比特0进入叠加态。
用通俗的话来说,就是这个量子比特不再被固定为只有0或1这两种状态了;当我们对其进行测量时,它有可能变成其中任意一种状态。可以把这想象成一枚正在旋转的硬币,它的落点还尚未确定。
H门之前:
0
H门之后:
0和1都是可能的结果
这个原理正是量子计算机如此强大的原因之一。
与一次只探索一种可能性不同,量子计算机能够同时处理多种可能性。
CX门:让两个量子比特协同工作
CX门也被称为CNOT门(受控非门),它与X门和H门的不同之处在于,它是作用于两个量子比特而非一个。
为了理解它的运作原理,我们来看一个简单的现实生活中的例子。
想象你和你的朋友正在玩一个游戏。在游戏开始之前,你们约定了一条规则:
如果你举手,你的朋友就必须立即改变自己的动作:如果他们当时在站着,就坐下;如果他们在坐着,就站起来。
但如果你没有举手,你的朋友就不会做出任何反应,会保持原来的状态不变。
注意一点:你朋友的行动完全取决于你的决定,他们并不能自行选择。
这与CX门的工作原理非常相似。
下面我们来看看如何在Qiskit中使用CX门:
qc.cx(0, 1)
这条指令告诉Qiskit:“使用量子比特0来控制量子比特1的变化。”
在这种情况下:
量子比特0 → 控制量子比特
量子比特1 → 目标量子比特
控制量子比特负责发出指令,而目标量子比特则会根据这些指令做出相应的反应。
幕后发生的事情:
如果控制量子比特的值是0,那么目标量子比特不会发生任何变化,会保持原来的状态。
如果控制量子比特的值是1,那么目标量子比特的状态就会发生改变:0会变成1,1会变成0。
可以把控制量子比特想象成经理,而目标量子比特则像是接受经理指令的员工。员工不会随意行动,只有当经理发出指令时,他们才会做出相应的反应。
单独来看,CX门就已经非常有用了。
但当我们把它与Hadamard门结合使用时,就会产生惊人的效果——这两个量子比特会以一种被称为“纠缠”的特殊方式连接在一起。关于这个概念,你将在本教程的后面部分学到更多内容。现在,是时候用Python来实践你所学的知识了。
如何搭建你的Python开发环境
接下来就是有趣的部分了。让我们先准备好你的电脑。在继续之前,请确保你的本地计算机上已经安装了Python。对于本教程来说,建议使用3.12.8或3.13.8版本的Python,这两个版本与你将要安装的所有依赖库都能很好地兼容。
3.12.8
步骤1:创建一个新的项目文件夹
创建一个名为 quantum-python 的文件夹,然后在 VS Code 中打开它。
步骤 2:创建虚拟环境
在终端中(这里我使用的是 Git Bash),运行以下命令:
python -m venv .venv
然后激活该虚拟环境。在 Windows 上使用 Git Bash 时,运行:
source .venv/Scripts/activate
而在 MacOS/Linux 上,则运行:
source .venv/bin/activate
步骤 3:安装 Qiskit
运行以下命令:
pip install qiskit qiskit-aer matplotlib
这样就可以安装以下软件:
-
Qiskit
-
量子模拟器
-
图表可视化工具
步骤 4:验证安装结果
创建一个名为 test.py 的文件,然后在其中添加以下代码:
import qiskit
print(qiskit.__version__)
运行该文件:
python test.py
如果看到了版本号,那就说明安装成功了。
恭喜!你正式进入了量子编程的世界。
构建你的第一个量子电路
创建一个名为 bell_state.py 的新文件,这个文件将包含你的第一个量子程序。
首先需要导入 Qiskit,添加以下代码:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
这段代码导入了 QuantumCircuit 类。
这意味着什么呢?QuantumCircuit(2, 2) 表示创建了 2 个量子比特和 2 个经典比特。
这些经典比特会用来存储测量后的最终结果。
让我们打印一下这个量子电路的结构:
print(qc)
输出结果如下:
q_0:
q_1:
c:
目前什么都不会发生,因为这个电路还是空的。不过你马上就会改变这一状况。
创建叠加态
让我们添加第一个量子门:qc.h(0)。
这条命令会对量子比特 0 应用哈达玛门。
修改后的代码如下:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.h(0)
print(qc)
输出结果如下:
───
q_0: ┤ H ├
───
q_1: ─────
c: 2/═════
哈达玛门使得量子比特 0 处于叠加态,这就是量子行为的开始。
你正式创建了你的第一个量子状态。
使用 CNOT 门创建纠缠态
到目前为止,我们只操作过单个量子比特。现在让我们尝试一些更有趣的操作吧。
你可以让两个量子比特协同工作。这种现象被称为纠缠。
如果你经常浏览科技相关的Twitter账号,或者观看YouTube上的科学视频,你可能听说过人们把“纠缠”称为“远距离的幽灵般的作用”。
别担心这个听起来很复杂的名称,只需要关注代码本身就可以了。
在你的哈达玛门下方添加这一行代码:qc.cx(0, 1)。
现在你的程序应该看起来像这样:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
print(qc)
输出结果如下:
───
q_0: ┤ H ├─■──
─── ─┴─
q_1: ────┤ X ├
───
c: 2/══════════
但究竟发生了什么呢?
当我们应用哈达玛门时,第一个量子比特进入了叠加态。随后CNOT门将第二个量子比特与第一个量子比特连接在了一起。现在这两个量子比特就像一个相互连接的系统一样运作,而不再是被视为两个独立的信息单元。它们实际上共享着同一个量子状态。
想象一下两颗完全同步的骰子:每次你掷它们时,它们总是会显示出相同的数字。
这听起来似乎不可能,对吧?因为在普通的经典计算中,这是无法实现的。
但量子力学遵循的是不同的规则。
测量量子比特
目前我们的量子比特处于量子态,但计算机无法直接显示这种量子态。
我们需要对它们进行测量。测量过程会将量子信息转化为经典信息。
添加以下这一行代码:qc.measure([0, 1], [0, 1])。
现在你的代码变成了:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
print(qc)
这一行代码的作用是什么?
它的含义是:
-
测量量子比特
0 -
将测量结果存储在经典位
0中
以及
-
测量量子比特
1 -
将测量结果存储在经典位
1中
至此,我们的电路就已经完成了。接下来我们需要执行它。
在量子模拟器上运行电路
这里有个很棒的地方:你并不需要一台真正的量子计算机,你的笔记本电脑就可以用来模拟量子计算过程。
在你的电路代码下方添加一个新的部分:
from qiskit_aer import AerSimulator
simulator = AerSimulator()
result = simulator.run(
qc,
shots=1024
).result()
counts = result.get_counts()
print(counts)
让我们来详细分析一下这个过程。
你安装的AerSimulator是什么?
AerSimulator是Qiskit提供的本地量子模拟器。
它不会将你的程序发送到真正的量子计算机上,而是直接在你的电脑上运行这些代码。
这对于学习和实验来说非常理想,而且它是完全免费的。
什么是“shots”?
请注意这一行代码:shots=1024。
“Shot”指的是量子电路的一次执行。由于量子结果的产生具有随机性,因此仅进行一次执行是不足以获得准确结果的。
通过执行1,024次实验,我们才能观察到整体规律。
可以把这想象成抛硬币的过程:一次抛掷无法揭示任何信息,但进行一千次抛掷后就能得出概率分布。
你的完整贝尔态程序
此时,你的文件应该看起来像这样:
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
result = simulator.run(
qc,
shots=1024
).result()
counts = result.get_counts()
print(counts)
保存文件后,运行以下命令:python bell_state.py。
你应该会看到类似这样的结果:
{
'00': 504,
'11': 520
}
你的数值可能会略有不同,这是正常的。关键是要确保你看到了00和11这两个结果。
如果你看到了01或10,那就说明纠缠现象没有发生。
对于Windows用户来说:一个常见的Qiskit Aer错误
如果你在使用Windows系统,在导入AerSimulator时可能会遇到以下错误:
ImportError: DLL load failed while importing controller_wrappers:
The specified module could not be found.
通常这种情况并不是由于你的代码有问题造成的,而是因为你的系统中没有安装Microsoft Visual C++ Redistributable 2015–2022 (x64)。
要解决这个问题,请按照以下步骤操作:
-
从微软官方网站下载并安装Microsoft Visual C++ Redistributable 2015–2022 (x64)
-
重启你的电脑。
-
重新打开终端,然后再次运行你的程序。
一旦安装完成了,AerSimulator就应该能够正常导入了,此时你就可以继续学习后续的内容了。
初学者常犯的其他错误
如果你的代码没有立即运行成功,也不要慌张——每个人在编程过程中都会遇到错误。
常见的错误包括:
找不到模块
ModuleNotFoundError
解决方法:运行pip install qiskit即可。
使用了错误的虚拟环境
在运行脚本之前,请确保你的虚拟环境已经激活。
模拟器未安装
请运行pip install qiskit-aer来安装所需的模拟器。
缩进错误
请记住,Python非常重视代码中的空格排列。请仔细检查你的缩进格式。
用直方图可视化结果
开发者们都非常喜欢视觉化的反馈信息。图表能够帮助人们更容易地理解量子现象。你可以自己创建一个这样的图表。
添加以下代码:
from qiskitvisualization import plot_histogram
import matplotlib.pyplot as plt
plot_histogram(counts)
plt.show()
现在,你的bell_state.py文件应该会变成这样:
# 导入所需的库
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskitvisualization import plot_histogram
import matplotlib.pyplot as plt
# 创建一个包含2个量子比特和2个经典比特的量子电路
qc = QuantumCircuit(2, 2)
# 使用Hadamard门和CNOT门生成贝尔态(纠缠态)
qc.h(0)
qc.cx(0, 1)
# 将所有量子比特的值测量为对应的经典比特值
qc.measure([0, 1], [0, 1])
# 初始化Aer模拟器,并执行该量子电路1024次
simulator = AerSimulator()
result = simulator.run(
qc,
shots=1024
).result()
# 收集测量结果
counts = result.get_counts()
# 打印原始的计数数据,并绘制直方图
print(counts)
plot_histogram(counts)
plt.show()
再次运行你的程序,就会看到一个直方图出现了。
它的样子大概会像这样:

如果你想要获取整个项目文件夹,可以从Github下载。
理解刚才发生了什么
让我们暂停一下,因为刚刚发生了一件非常了不起的事情。
-
你没有使用量子计算机,而是仅用笔记本电脑和Python就实现了纠缠态的生成。
-
第一个量子比特进入了叠加态。
-
第二个量子比特也与它产生了纠缠关系。
当进行测量时,这两个量子比特的值要么都是0,要么都是1。虽然结果是随机的,但它们的值总是保持一致。这才是最关键的地方。
什么是贝尔态?
贝尔态是量子计算领域中最著名的例子之一。初学者通常会从学习这个实验开始了解量子计算。
为什么呢?因为贝尔态能够很好地说明两个重要的量子概念:
-
叠加态
-
纠缠态
如果没有贝尔态,许多量子算法就无法实现,因为:
-
量子通信系统离不开贝尔态。
-
量子密码学也需要依赖贝尔态。
-
未来的量子网络同样需要贝尔态来支撑。
贝尔态基本上可以说是量子计算领域的“Hello World”示例——每位量子计算开发者迟早都会接触到它。
为什么贝尔态如此重要
乍一看,这个实验看起来很简单:只需要两个量子比特、两个门以及几行Python代码而已。但实际上,它所蕴含的理念却非常深远。
贝尔态的作用远不止于展示量子纠缠现象。研究人员常常利用它们作为基准实验,来验证量子硬件是否能够可靠地生成和测量纠缠态的量子比特。
例如,在超导量子处理器上执行贝尔态电路,可以用来评估这种硬件在运行更复杂的量子算法之前,准备纠缠态的准确程度。
此外,贝尔态在量子通信中也发挥着重要作用,同时也是构建更大规模量子算法的基础构件。
可以把它们想象成编程中的函数——单个函数可能看起来很简单,但复杂的程序往往是由成千上万个这样的函数组合而成的。
同样的道理也适用于量子计算领域:庞大的量子系统实际上都是由一些更基本的量子操作构成的。
量子纠缠在现实世界中的应用
初学者经常会问这样一个问题:“我什么时候才能真正用到这些知识呢?”
这确实是个值得探讨的问题。
下面是一些具体的应用实例。
量子密码学
传统加密技术依赖数学难题来实现安全性,而量子密码学则基于物理定律运作;任何试图截获数据的尝试都会改变量子态,从而使得窃听行为立刻被察觉。
量子通信网络
致力于开发量子互联网技术的研究人员正在充分利用量子纠缠现象,来实现远距离之间的量子设备连接。
药物发现
未来,量子计算机或许能够比传统计算机更精确地模拟分子结构。这一技术有望帮助研究人员发现新药物、改进现有材料,并深入理解化学反应的机制。
金融建模
许多大型金融机构正在探索如何运用量子算法来:
-
优化投资组合
-
进行风险分析
-
模拟市场走势
尽管这一领域仍在发展阶段,但其潜力却是巨大的。
适合初学者的实验
学习量子计算的最佳方式,其实与程序员学习编程的方式是一样的:
-
先试着拆解相关系统,了解其内部结构。
-
然后进行实际实验。
-
修改代码,观察变化结果。
-
反复重复这个过程,直到理解其中的原理。
-
X门
-
Y门
-
Z门
-
S门
-
T门
-
GHZ态
-
量子隐形传态
-
德意志算法
-
格罗弗算法
-
肖尔算法
-
量子傅里叶变换
-
什么是量子计算
-
量子比特与普通比特的区别
-
量子门的作用
-
如何安装Qiskit
-
如何创建贝尔态
-
如何模拟量子电路
-
如何可视化实验结果
-
为什么纠缠现象如此重要
让我们来尝试一些简单的实验吧。
实验1:移除哈达玛门
删除代码:qc.h(0),然后重新运行电路。会看到什么变化呢?
观察一下输出结果。你认为为什么会这样呢?
实验2:增加实验次数
需要做的修改是将shots=1024改为shots=100000。
再次运行模拟实验。你会发现结果变得更加均衡了。这就是概率论在起作用。
实验3:添加X门
在CNOT门之前插入qc.x(1)这一指令。
然后运行这个量子电路。
在观察新的输出结果分布时,可以在运行代码之前尝试预测一下结果会是什么。
实验4:创建三个量子比特
需要做的修改是将QuantumCircuit(2, 2)改为QuantumCircuit(3, 3)。
你能否尝试构建一个规模更大的纠缠系统呢?不妨亲自实验一下吧。
接下来你应该学习什么?
你现在已经成功构建了自己的第一个量子电路,这是一个非常重要的里程碑。
通过IBM Quantum Platform,你可以继续探索以下这些内容:
构建更复杂的量子电路
你可以尝试以下内容:
探索真实的量子硬件
IBM允许开发者在实际的量子计算机上运行量子电路。这是现代编程领域中最令人兴奋的体验之一。
学习量子算法
当你对量子电路有了足够的了解之后,可以进一步探索以下内容:
最后的思考
几年前,人们还认为量子计算是一项遥不可及的技术,似乎只适合物理学家和研究人员来研究。
但如今情况已经发生了变化。只要你懂Python,你就已经具备了进入量子计算领域的条件。
通过这个教程,你学习了以下内容:
最重要的是,你已经编写了自己的第一个量子程序。每一位量子开发者都是从这里开始学习的。
一次构建一个量子电路,进行一次实验,每次都带着好奇心去探索新的问题。
现在,打开你的编辑器,修改代码吧。尝试不同的操作,试试新的量子门,亲自去探索这个神奇的量子世界吧。