简介:面向《量子计算和量子信息》十周年纪念版教材的非官方课后习题解答手册,由GitHub用户“goropikari”整理,适合正在学习量子计算与量子信息基础理论的学生和自学者。手册可用来核对教材各章习题,覆盖量子力学基础、量子噪声与量子操作、距离度量、熵与信息等核心内容,帮助读者理解关键概念并检验解题思路。资源包为单个PDF文件,共466KB,便于直接阅读或打印;目前已有1359人学习或下载,适合作为系统学习时的辅助参考资料。除习题解答外,作者还整理了一份勘误清单,指明教材第101页式(2.150)中的ρ应为ρ′、第408页式(9.49)系数需修正,第409页习题9.12与第411页习题9.16也存在表述问题;作者自认并非专业研究者,答案可能存在疏漏,建议读者自行验算。这种开放、审慎的整理方式,既能提示教材细节,也鼓励独立思考,是深入学习量子信息过程中实用的对照材料。
1. 从《量子计算和量子信息》教材到课后答案:这份题解能帮你对到什么程度
准备啃《量子计算和量子信息》的人,几乎都会遇到同一个问题:教材例题能看懂,课后的推导题一动手就卡。于是“量子计算 量子信息 课后答案”这类关键词就成了不少人收藏夹里的常客。这里要说的是其中流传较广的一份:由一位业余量子信息爱好者维护的非官方题解,覆盖从量子力学基础、量子噪声与量子操作、距离度量到熵与信息的完整推导链条。
这份题解能帮你对的不只是最终数字,而是推导步法:内积怎么展开、Gram-Schmidt 正交化怎么写、谱分解如何通过投影算子落地、迹距离的压缩性在什么条件下才成立。它自带一份勘误列表,仓库里放着源码和最新版,不是看完就扔的 PDF,是可以验证、可以提意见的活材料。适合三类人:自学教材的研究生、把量子信息当业余爱好的开发者,以及考前想快速过一遍推导但不想被答案带偏的人。
需要先说清边界:编写者反复强调自己是业余研究者,证明未必严密,尤其在数学推导上不要盲目信任。这份资源的正确用法,是把它当成“推导参照系”,而不是“标准答案”。
2. 量子力学基础章节:内积、Gram-Schmidt 与谱分解的三类推导
2.1 内积与归一化:先算对 ⟨w|v⟩ 再谈量子态
教材第 2 章最开始的一批习题,其实都在反复练同一件事:把抽象内积定义落到具体分量上。以习题 2.7 为例,给定两个实向量 |w⟩=(1,1)ᵀ、|v⟩=(1,-1)ᵀ,要求计算 ⟨w|v⟩,并把它们归一化。
按 bra-ket 展开,⟨w|v⟩ 等于对应分量乘积之和,这里得到 1×1+1×(−1)=0。归一化则要除以各自的模长,|w⟩ 的模长是 √2,|v⟩ 的模长也是 √2。这个习题的隐含考点是:在复数向量空间里,bra 向量对应的是一串共轭复数,而不仅是转置。只记“分量相乘再相加”的实数版本,到后面的习题 2.5、2.6 验证内积线性性时就会漏掉共轭。
可以用一段最小脚本验证:
import numpy as np w = np.array([1, 1], dtype=complex) v = np.array([1, -1], dtype=complex) inner = np.vdot(w, v) # vdot 会对第一个参数取共轭,符合 <w|v> norm_w = np.vdot(w, w) print(f"<w|v> = {inner}") print(f"<w|w> = {norm_w}") print(f"normalized |w> = {w / np.sqrt(norm_w)}")numpy.vdot与dot的关键区别在于:vdot自动对第一个参数做共轭,对应 bra 的共轭转置;numpy.dot不做共轭,直接相乘求和,用在复数向量上会得到错误内积。这里把向量显式声明为dtype=complex,是为了防止后面塞进复数分量时被截断成实数。
2.2 Gram-Schmidt 正交化:习题 2.8 的归纳法为什么关键
习题 2.8 要求证明 Gram-Schmidt 过程能得到一组正交归一基。它的证明思路是数学归纳:假设已构造出 {v₁,…,vₙ} 正交归一,构造 vₙ₊₁ 时,把原始向量 wₙ₊₁ 减去它在每个已有基向量上的投影分量,再归一化。
这里最容易看漏的一个细节是:投影用的是原始向量 wₙ₊₁,而不是正在被更新的中间向量。如果代码写成v -= np.vdot(base, v) * base,数学上也能推出正交结果,但推导结构和教材不一致,在浮点环境下还会把误差逐步放大。我在实际写脚本时,严格按教材结构保留“原始 w 的投影”这个操作。
import numpy as np def gram_schmidt(vectors): basis = [] for w in vectors: v = w.copy() for base in basis: v -= np.vdot(base, w) * base # 关键:投影用原始 w,不是更新后的 v v /= np.sqrt(np.vdot(v, v)) basis.append(v) return np.array(basis) vectors = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]], dtype=complex) orth = gram_schmidt(vectors) print("overlap matrix:\n", orth @ orth.conj().T)vectors是形状为 (N, dim) 的二维数组,每一行是一个待正交化向量;返回值的每一行是归一化后的正交基。orth @ orth.conj().T得到的是基向量两两内积矩阵,理想结果接近单位阵。需要补一个防御判断:如果某一步np.vdot(v, v)接近 0,说明原始向量组线性相关,继续归一化会除零,此时应该跳过或直接报错。
2.3 谱分解:习题 2.34 的平方根、对数和 Hermitian 处理
习题 2.34 给了一个具体的 Hermitian 矩阵 A=[[4,3],[3,4]],要求做谱分解,并计算 √A 和 log(A)。这类题是后面量子操作、密度矩阵函数的基础:任何一个正规算子如果能写成特征值乘投影算子的和,那么算子的任意函数都可以通过“特征值做标量函数、特征向量矩阵重建”来计算。
手动推一遍:A 的特征值是 1 和 7,对应归一化特征向量分别是 (1,-1)ᵀ/√2 和 (1,1)ᵀ/√2。谱分解写为 A=|λ₁⟩⟨λ₁|+7|λ₇⟩⟨λ₇|。对平方根,特征值 1 和 7 分别取 √1、√7;对自然对数,log(1)=0,所以 log(A) 只剩 7 log(7) 那一项。
import numpy as np A = np.array([[4, 3], [3, 4]], dtype=complex) eigvals, eigvecs = np.linalg.eigh(A) sqrt_A = eigvecs @ np.diag(np.sqrt(eigvals)) @ eigvecs.conj().T log_A = eigvecs @ np.diag(np.log(eigvals)) @ eigvecs.conj().T print("eigvals:", eigvals) print("sqrt(A):\n", sqrt_A) print("residual:\n", sqrt_A @ sqrt_A - A)numpy.linalg.eigh是专门给 Hermitian 矩阵用的特征分解函数,返回按升序排列的实特征值,以及一个酉矩阵形式的特征向量矩阵。eigvecs @ np.diag(标量函数结果) @ eigvecs.conj().T就是谱分解重建的通用写法。需要注意:如果矩阵不是 Hermitian,eigh的结论不适用,要用numpy.linalg.eig。矩阵规模较大时,eigh(A, UPLO='L')可以只读取下三角,减少一半内存带宽,但对 2×2 的小习题没有必要。
习题 2.17、2.21、2.23 其实都在为这个谱分解铺路:Hermitian 算子的特征值是实数、不同特征值对应的特征向量正交、投影算子特征值只能是 0 或 1。把这三条串起来,就能理解为什么谱分解能写成“特征值乘投影算子求和”这种干净形式。
3. 量子噪声与量子操作:迹距离不等式和教材勘误怎么核对
3.1 先立定义:迹距离与保真度的选用
量子噪声章节讨论的是通道对量子态的影响,常用的两个度量是迹距离和保真度。迹距离定义为 D(ρ,σ)=½Tr|ρ−σ|,其中 |·| 表示取算符奇异值之和,也就是迹范数;保真度在教材里定义为 F(ρ,σ)=(Tr√(ρ^{1/2}σρ^{1/2}))²。
两者的选用逻辑很直接:迹距离对应“在任意测量下区分两个态的最大概率差”,适合评估信道造成的误差;保真度更贴近态制备和量子纠错场景,描述目标态与实际态的重叠程度。注意保真度在不同文献里有开根号和不带平方两种写法,核对公式时先确认用的是哪套定义。
| 度量 | 定义要点 | 典型用途 | 常见坑 |
|---|---|---|---|
| 迹距离 | ½Tr | ρ−σ | ,对称 |
| 保真度 | (Tr√(ρ^{1/2}σρ^{1/2}))² | 态制备、纠错码 | 与开根号版本混用 |
3.2 习题 9.12:为什么“严格压缩”只在非平凡条件下成立
教材第 9 章的一个结论是量子操作 E 对迹距离不增:D(E(ρ),E(σ))≤D(ρ,σ)。习题 9.12 进一步讨论这是否是“严格压缩”,即 ρ≠σ 时是否一定有严格小于。
这里有个容易忽略的边界:如果 ρ=σ,那么 D(ρ,σ)=0,而迹距离非负,于是得到 0≤D(E(ρ),E(σ))≤0,只能推出 D(E(ρ),E(σ))=0。换句话说,当输入态完全相同时,输出态也完全相同,谈不上“压缩”。只有 ρ≠σ 且概率参数 p≠1 时,D(E(ρ),E(σ))<D(ρ,σ) 才成立。所以教科书里那些“严格压缩”的说法都要默认为“在非平凡输入下”。
3.3 用最小反例验证 9.16:转置与共轭转置的差别
教材习题 9.16 涉及一个很有用的恒等式:Tr(AᵀB)=⟨m|A⊗B|m⟩,其中 |m⟩=(|00⟩+|11⟩)/√2 是最大纠缠态。勘误指出教材把 Aᵀ 误写成了 A†。共轭转置与普通转置在实矩阵上没有区别,但一旦出现复数矩阵,符号就完全不同。
可以构造最简反例:取 A=[[i,0],[0,0]]、B=[[1,0],[0,0]]。计算 Tr(A†B)=−i,而 ⟨m|A⊗B|m⟩=i,两边不相等。原因在于 |m⟩ 所隐含的转置关系,(I⊗A)|m⟩=(Aᵀ⊗I)|m⟩,只在普通转置下成立,换成共轭转置就失效。
import numpy as np A = np.array([[1j, 0], [0, 0]], dtype=complex) B = np.array([[1, 0], [0, 0]], dtype=complex) m = np.zeros(4, dtype=complex) # |m> = (|00> + |11>)/sqrt(2) m[0] = 1 / np.sqrt(2) m[3] = 1 / np.sqrt(2) lhs = np.trace(A.conj().T @ B) rhs = m.conj() @ np.kron(A, B) @ m print("Tr(A^dagger B) =", lhs) print("<m|A⊗B|m> =", rhs)A.conj().T是共轭转置,np.kron(A, B)是张量积。m按 |00⟩、|01⟩、|10⟩、|11⟩ 的基展开,Bell 态只占据 0 和 3 两个分量。运行后两个结果一个是纯虚数负值,一个是纯虚数正值,直接暴露公式写错。
3.4 9.49 的因子 2:经典迹距离定义里的 ½ 去哪儿了
勘误的另一处是教材第 408 页式 (9.49)。原文写的是 Σᵢ pᵢD(ρᵢ,σᵢ)+D(pᵢ,qᵢ),推导到最后一步却出现了 Σ|pᵢ−qᵢ|,这比 D(pᵢ,qᵢ) 大了一倍。因为经典分布的迹距离 D(p,q)=½Σᵢ|pᵢ−qᵢ|,所以式子里必须是 2D(pᵢ,qᵢ) 才能与前面的 Σ|pᵢ−qᵢ| 相等。
这类因子 2 的错误在量子信息推导里非常典型,根子在于“迹距离自带 ½,而中间步骤经常只写奇异值之和”。我核对这类公式时,习惯先标出每一步的范数是奇异值求和还是完整迹距离,再检查系数。
4. 熵与信息:相对熵方向和勘误排查的常见翻车现场
4.1 Von Neumann 熵与相对熵:先分清方向再谈计算
熵与信息章节的核心工具包括 Von Neumann 熵 S(ρ)=−Tr(ρ log ρ),以及相对熵 S(ρ‖σ)=Tr(ρ(log ρ−log σ))。相对熵没有对称性,S(ρ‖σ)≠S(σ‖ρ),这是初学最容易踩的坑。教材第 515 页式 (11.67) 的勘误,就是要把 S(ρ′‖ρ) 改成 S(ρ‖ρ′),方向反了。
对一个简单的对角态做数值验证,能迅速建立直觉。取 ρ=diag(0.7,0.3)、σ=diag(0.5,0.5),两个方向的相对熵不同。计算时注意密度矩阵的本征值必须非负,如果 σ 的某个本征值为 0 而 ρ 在对应方向上有分量,相对熵会发散。
import numpy as np rho = np.array([0.7, 0.3]) sigma = np.array([0.5, 0.5]) S_rho_sigma = np.sum(rho * (np.log(rho) - np.log(sigma))) S_sigma_rho = np.sum(sigma * (np.log(sigma) - np.log(rho))) print("S(rho||sigma):", S_rho_sigma) print("S(sigma||rho):", S_sigma_rho)这里直接对一维数组做逐元素运算,是因为对角密度矩阵的相对熵可以退化为经典概率分布间的相对熵。如果 ρ 或 σ 不是对角的,就要先做谱分解。np.log遇到 0 会返回-inf,在写通用函数时必须先过滤掉接近 0 的分量,否则后续inf - inf会出现nan。
4.2 勘误排查第一步:看到公式先做维度与定义检查
拿到一份带勘误的题解,不要急着背结论,先建立一套自己的核对流程。我常用的顺序是:先看公式里每个符号在教材前文中的定义,确认是迹范数还是奇异值之和;再确认矩阵操作是转置还是共轭转置;然后检查不等号方向和边界条件,比如 ρ=σ 时是否退化;最后用最小维度的数值实例验证。
这套顺序对第 9 章的几处勘误几乎一查一个准。所有错误都集中在“定义没跟上”或“边界条件没考虑”。特别是式 (11.67) 这种只有两个符号互换的勘误,不回到定义去推,很难看出问题。
4.3 四个具体翻车现场
现象:教材式 (11.67) 里相对熵方向写反,S(ρ′‖ρ) 与 S(ρ‖ρ′) 不一致。 原因:相对熵本身不对称,教材笔误。 解决:用 4.1 节的对角矩阵脚本跑一遍两个方向,发现数值不等,确认按定义修正。
现象:式 (9.49) 中 D(pᵢ,qᵢ) 前少了因子 2。 原因:中间步骤得到的是 Σ|pᵢ−qᵢ|,要除以 2 才是经典迹距离。 解决:把 ½Σ|pᵢ−qᵢ| 当作一个整体替换,检查每个等号前后是否仍是同一个量。
现象:习题 9.12 声称量子操作是严格压缩。 原因:当 ρ=σ 时迹距离为零,上下界夹逼只能得到零,不存在严格小于。 解决:把结论修正为“非平凡输入且 p≠1 时严格压缩”。
现象:习题 9.16 把 Tr(AᵀB)=⟨m|A⊗B|m⟩ 写成 Tr(A†B)。 原因:共轭转置与普通转置在复数矩阵下不同。 解决:用反例 A=[[i,0],[0,0]]、B=[[1,0],[0,0]] 验证,两边一正一负,方向立刻暴露。
5. 进阶:用最小验证脚本对抗题解里的“黑匣子推导”
读题解最怕的不是答案错,而是推导过程看起来每一步都合理,最后结论却有问题。更麻烦的是勘误表之外的错误。与其逐行检查别人的推导,不如把习题结论写成可执行的最小验证脚本,让数值直接告诉你边界在哪。
针对第 3 章和第 4 章的题型,我一般会保留两组工具函数:一组验证谱分解重建误差,一组验证迹距离压缩性。谱分解重建误差用来确认 Hermitian 矩阵函数计算没有丢项;迹距离压缩性验证用来检查量子通道是否真的满足不增性质。
import numpy as np def trace_distance(rho, sigma): return np.linalg.norm(rho - sigma, ord=1) / 2 def check_contractive(channel, rho, sigma, tol=1e-10): dist_in = trace_distance(rho, sigma) dist_out = trace_distance(channel(rho), channel(sigma)) return dist_out <= dist_in + tol def depolarizing(rho, p=0.2): return (1 - p) * rho + p * np.eye(2) / 2 r = np.diag([0.9, 0.1]) s = np.diag([0.3, 0.7]) print("contractive:", check_contractive(depolarizing, r, s)) print("equal input case:", check_contractive(depolarizing, r, r))np.linalg.norm(rho - sigma, ord=1)返回矩阵的迹范数,也就是奇异值之和,除以 2 才是教材定义的迹距离。depolarizing里的参数 p 表示去极化概率,p=0 时通道不变,p=1 时输出完全混合态。把 ρ=σ 传入,程序会输出True,但此时dist_in=0、dist_out=0,说明通道既没有放大距离也没有严格缩小,这正好对应习题 9.12 的边界判断。
从那以后,我每次拿到一份新题解,都先跑一遍这种最小验证脚本再逐条读推导;尤其是像 9.16 那种转置共轭写错的题,脚本一秒钟就能让矛盾现形。不要迷信“有人维护所以一定对”,更不要迷信“勘误表之外没有错误”。推导是别人的,验证是自己的,希望帮到你。
本文还有配套的精品资源,点击获取