相信通过前面几节课的学习,大家已经多多少少对量子计算这门课感到了浓厚的兴趣。前面我们讲到了|0>态,讲到了|1>态,这些都属于基态,但是我们今天要学习的是几种更为复杂的状态,其中包含特别有意思的贝尔态。
目录
一、纯态和混合态介绍
1、介绍
量子计算的书是这样定义混合态和纯态的:“具有精确已知状态的量子系统称为纯态(pure state)。在这种情况下,密度算子就是ρ = ∣> <
∣ ,我们也把密度算子称为密度矩阵,此情况下以100%的概率处在∣
> 态。
比如说就是一个纯态,它能拆解为|0><0|,同理
也是,因为能拆解为|1><1|。
如果不能用向量的形式描述量子态,是借助密度矩阵的形式描述的,那么这个量子态就是混合态,系统就是处于混合态(mixed state),称为是在ρ的系综里不同纯态的混合。”
总结一下上面这段话,就是对于纯态它可以借助矢量和密度算子两种形式进行描述;但是对于混合态,是只能借助密度矩阵的形式进行描述的。
2、判定方法
通常会使用tr()[矩阵对角线之和]与1的关系,来判定它是不是纯态。如果tr(
)=1,表明它是一个纯态,如果tr(
)<1表明这是一个混合态。
3、量子门与密度矩阵
我们做一个题目,立马就会了:
Ted使用一个量子线路对自己手中的初态∣0〉进行演化,但她的量子线路有些故障,有1/4的概率什么都不做,1/4的概率作用X门,1/2的概率作用H门。则她所获得的末态对应的密度矩阵应该是
【解析】:由题意知道,Ted的态有四分之一的概率在|0>态,由四分之一的概率在|1>态,还有二分之一的概率在|+>态。根据概率矩阵的定义ρ=,求得密度矩阵为
。
二、贝尔态
1、直积态与纠缠态
我们来看看它们的定义。
直积态:复合系统的量子态|a>可以表示为若干个孤立子系统|a1>、|a2>、|a3>……|an>的直积形式,这些子系统相互独立,不存在纠缠,即|a>=|a1>|a2>|a3>……|an>,则此符合量子态称之为直积态。
纠缠态:若一个量子系统不能写成若干个子系统的直积形式,则称此量子态为纠缠态。
看不懂的话,还是让小编举个例子吧!
例如:|01>就是直积态,很明显,因为这就是|0>
|1>,而我们接下来要学习的贝尔态都不是直积态,并且我们通过对贝尔态的学习可以发现:纠缠态和纯态并不对立。
2、介绍
贝尔态是一个极其复杂的状态,也被称为EPR态或者EPR对。它是用首次提出这些奇怪性质的学者贝尔,以及Einstein(没错,就是爱因斯坦)、Podolsky、Rosen的名字命名的。
好的,现在热烈欢迎,四位嘉宾登场!有请,潘周聃。(帅气扭头)
,
,
不难发现,以上四种量子态均不能写作 ∣ϕ>= (a∣0>+b∣1>)⊗(c∣0> +d∣1>) ,不过还是希望大家头铁的去试一试,看看是不是果真如此。
那么,它是纯态吗?相信很多读者听名字,纠觉得纯态和纠缠态势不两立,水火不容。刚好用这个例子,来证明,这两种状态均可存在于一体。
证明方法:请算出概率矩阵的平方,判断这个新得到的矩阵,对角线之和是不是等于1。
3、构造方法
①假设输入为|0>与|0>,首先高位量子比特经过Hadamard Gate,(高位量子比特作为控制比特,低位量子比特作为目标比特),则可以得到。
②假设输入为|0>与|1>,首先在pyqpanda中低位量子比特要从|0>变为|1>需要经过一个X门,并且高位量子比特需要经过Hadamard Gate,(高位量子比特作为控制比特,低位量子比特作为目标比特),则可以得到。
假设输入为|1>与|0>,首先在pyqpanda中高位量子比特要从|0>变为|1>需要经过一个X门,并且高位量子比特还需要经过Hadamard Gate,(高位量子比特作为控制比特,低位量子比特作为目标比特),则可以得到。
④假设输入为|1>与|1>,首先在pyqpanda中高位量子比特与低位量子比特要从|0>变为|1>需要经过一个X门高位量子比特还要经过Hadamard Gate,(高位量子比特作为控制比特,低位量子比特作为目标比特),则可以得到。
三、实践:构造bell态
题目:请用“3、构造方法”里的思路,构造出四种贝尔态。要求输入字符串表示是哪一种贝尔态,返回值为量子状态。
from pyqpanda import *
import numpy as np
#输入字符串,返回状态列表
def question1(input: str) -> list:
def getFirstNum(input: str) -> int:
return int(input[0])
# 获取输入字符的第一个数字
def getSecondNum(input: str) -> int:
return int(input[1])
# 获取输入字符的第二个数字
num1 = getFirstNum(input)
num2 = getSecondNum(input)
qvm = CPUQVM()
qvm.init_qvm()
qubits = qvm.qAlloc_many(2)
cbits = qvm.cAlloc_many(2)
cbits[1].set_val(num2)
cbits[0].set_val(num1)
# 构造量子程序prog
prog = QProg()
# 构造量子程序的各个条件分支
progstart = QProg()
progend = QProg()
# 当输入00与01时,不需要插入X门
# 当输入10与11时,需要将0态转变为1态,即加一个X门
progstart.insert(X(qubits[1]))
# 如果输入00或者10,则第二条线路输入0态,否则执行X门操作,将其变为1态
progend.insert(X(qubits[0]))
# qif1执行对第一条线路的改造,qif2执行对第二条线路的改造
qif1 = create_if_prog(cbits[0], progstart)
qif2 = create_if_prog(cbits[1], progend)
prog.insert(qif1)
prog.insert(qif2)
prog.insert(H(qubits[1]))
prog.insert(CNOT(qubits[1], qubits[0]))
# 用prob_run_list测概率
result2 = qvm.prob_run_list(prog, qubits, -1)
#使用get_qstate()函数返回列表
result = qvm.get_qstate()
# 返回此概率列表
return result
print("本题的结果为:")
print("当输入为00时,结果为", question1("00"))
print("当输入为01时,结果为", question1("01"))
print("当输入为10时,结果为", question1("10"))
print("当输入为11时,结果为", question1("11"))
输出的结果为:
结果正确!
那么,如果您感觉小编写的文章对您有帮助,请点个赞与收藏再走好嘛?谢谢大家!