小小比特,改变世界
比特,bit,大家对他太熟悉了,它是整个信息时代的根基,计算机所有的最底层操作都围绕比特而展开,信息的传输也以比特为载体。他是人类访问信息世界的使者,沟通着人类世界和赛博空间。
它改变了人类传递信息的方式,在古代,信息传递要靠飞鸽传书、烽火台、驿站,这些方式的信息传递效率太低了。比特概念的提出以及互联网的出现,让信息的传递有了质的飞跃,整个地球由此也如同一个村落,信息可以瞬间到达地球的每一个角落。
对于信息的处理加工也因比特的出现产生了翻天覆地的变化,一些复杂的计算,在古代是无法想象的,比特和计算机的出现,让一些复杂计算成为可能,使航空航天、工程技术领域有了长足的进步。
还有就是信息的存储,古代的信息存储在石头上、竹简上或纸上,尤其是石头和竹简,信息的存储效率很低,不但存储效率底,信息的获取效率也低。随着比特的出现以及芯片技术的不断迭代,使信息存储效率今非昔比,一本很厚的书,用几白兆就能存储,用手机就能通过阅读器阅读,好不方便。
经典比特给人类社会带来的改变已然如此巨大,那量子比特呢,在接下来的世纪里,肯定会给我们带来惊喜,比如量子通信,利用量子纠缠,通信的效率以及保密性会进一步提升。量子计算则会使对信息的处理再一次飞跃,量子存储也会有不一样的惊喜。
这里我想着重聊聊量子计算,结合量子比特的量子态叠加效应,可以设计出很多量子算法,在一些经典计算机无法解决或很难解决的问题上会出现所谓的量子霸权。上帝粒子和量子纠缠相配合,其固有的纠错能力也会使经典计算机的分布式计算迎来新的机遇和挑战。
个人认为,量子计算在某些问题上之所以优于经典计算,很大一部分在于量子态能够叠加。处理处于叠加态的量子比特时,可以同时考虑多种量子状态,配合算法的设计,从而可以加速运算。
下面我用一个小案例,来说明量子计算的优越性:Deutsch-Jozsa算法
量子比特
经典比特的物理量一般是电压,而量子比特的物理量可以是电子自旋,光的偏振等。我们以电子自旋为例进行说明:
H代表描述电子z轴自旋的波函数集合,H是一个虚拟向量空间:
H={自旋向上,自旋向下}
利用狄拉克符号,我们可以将它们表示为
|0〉=自旋向上,|1〉=自旋向下
|0〉 和 |1〉 被称为量子比特(qubit)。
在量子计算中,|0〉 和 |1〉 常作为量子比特的基态,一般量子比特处于这两种基态的叠加态。对|0〉进行测量只能坍缩得到0,对 |1〉进行测量只坍缩得到1,而对叠加态进行测量时,有一定概率坍缩到0,一定概率坍缩到1。
量子比特可以用矩阵表示:
逻辑门
逻辑门是用于改变比特状态的,对于经典计算机的逻辑门,有与、或、非、异或、同或等。与此对应,量子计算也有量子逻辑门,量子逻辑门作用于量子比特,可以用方阵表示,有一点很重要,量子逻辑门都是酉算子,这说明量子逻辑门实现的操作都是可逆的。这里列出几个常用的量子逻辑门。
1) X门
X门,全称Pauli X门,将他作用于|0〉 和 |1〉,我们会得到:
X门也被称为NOT 门。
2) Hadamard 门
将它作用于|0〉 和 |1〉,我们会得到:
Hadamard门用于产生叠加态,而且Hadamard 门是其自身的逆运算。
3) CNOT门
CNOT门需要作用在多个量子比特上面,它的效果如下
若第一个量子位的状态是|0〉,不做任何改变,若第一个量子位的状态是|1〉 则反转第二个量子位的状态:
Deutsch-Jozsa算法
Deutsch-Jozsa算法的问题描述是这样的(这里考虑两个输入的情况):
有一个函数f,我们不知道它的具体形式,只知道它的输入是0或1,输出也是0或1。我们定义两种类型:
1、对于所有输入,输出要么都是0,要么都是1,即,所有输出都相同,如果是这种情况,则 f 被称为是常数的(Constant)。
2、对于所有输入,输出结果中一半是0,一半是1,如果是这种情况,则 f 被称为是平衡的(Balanced)。
我们需要判断这个函数 f 是这两种类型的哪一类,如下图:
对于有两个输入的情况,经典算法需要2次函数调用,而量子算法只需要一次函数调用。
量子算法中具体的做法如下:
1、制备1个工作比特到∣0〉态,与1个辅助比特到∣1〉。
2、构造一个特殊的量子电路如下:
3、对工作比特进行测量。如果输出全部为0,则是函数 f 是常数的(Constant),反之则是平衡的(Balanced)。
代码
import numpy as np from qiskit import Aer from qiskit import QuantumCircuit, assemble, transpile from qiskit.visualization import plot_histogram from matplotlib import pyplot as plt # 模拟函数f的量子逻辑门 def dj_oracle(case): oracle_qc = QuantumCircuit(2) # balanced类型函数 if case == "balanced": oracle_qc.cx(0, 1) # constant类型函数 if case == "constant": output = np.random.randint(2) if output == 1: oracle_qc.x(1) # 将函数包装成逻辑门 oracle_gate = oracle_qc.to_gate() oracle_gate.name = "Oracle" return oracle_gate if __name__ == '__main__': # 量子电路,两个输入的量子比特,一个输出结果的经典比特 circuit = QuantumCircuit(2, 1) # 工作比特应用Hadamard门 circuit.h(0) # 辅助比特应用X门 circuit.x(1) # 辅助比特应用Hadamard门 circuit.h(1) # 加入模拟函数f的量子逻辑门 oracle_function = dj_oracle("balanced") # oracle_function = dj_oracle("constant") circuit.append(oracle_function, range(2)) # 工作比特应用Hadamard门 circuit.h(0) # 辅助比特应用Hadamard门 circuit.h(1) # 对工作比特进行测量 circuit.measure(0, 0) # 打印电路结构 print(circuit.draw()) # 运行量子电路 aer_sim = Aer.get_backend('aer_simulator') transpiled_dj_circuit = transpile(circuit, aer_sim) qobj = assemble(transpiled_dj_circuit) # 获取结果 results = aer_sim.run(qobj).result() answer = results.get_counts() # 绘图 plot_histogram(answer) plt.show()
程序运行结果如下:
电路图如下:
函数 f 是常数的(Constant):
函数 f 被是平衡的(Balanced):
作者这水平有限,有不足之处欢迎留言指正