贝尔态,演示量子纠缠
1 概念
传统bit只能表示0或1,量子位可以同时为0和1的叠加,可以从概念上理解为矢量
两个经典状态是两个方向,100%为0或100%为1
测量行为产生一个二级制结果(0或1)改变量子位状态,量子位由叠加态变为经典状态
此后,相同的无干预测量产生相同的二进制结果
多个量子位可以纠缠
当测量一个被纠缠的量子位时,另一个状态也被更新
2 Q#运算
2.1 目标
准备两个特定量子态的量子位,使用Q#改变其状态并演示叠加和纠缠
演示量子位\运算和测量
2.2 代码
Bell.qs
namespace Quantum.Bell {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Canon;
// 参数q1表示一个量子位, 参数desired表示我们希望量子位所处的状态
operation Set(desired : Result, q1 : Qubit) : Unit {
// 使用M操作对量子位进行测量
// 量子位测量总是返回0或1
// 如果测量结果不是期望的结果,则使用X操作进行反转,0到1或1到0
if (desired != M(q1)) {
X(q1);
}
}
operation TestBellState(count : Int, initial : Result) : (Int, Int) {
mutable numOnes = 0;
using (qubit = Qubit()) {
for (test in 1..count) {
Set(initial, qubit);
let res = M(qubit);
// 计算1的次数
if (res == One) {
set numOnes += 1;
}
}
Set(Zero, qubit);
}
// 返回1的次数和0的次数
return (count-numOnes, numOnes);
}
}
host.py
import qsharp
from qsharp import Result
from Quantum.Bell import TestBellState
initials = (Result.Zero, Result.One)
for i in initials:
res = TestBellState.simulate(count=1000, initial=i)
(num_zeros, num_ones) = res
print(f'Init:{i: <4} 0s={num_zeros: <4} 1s={num_ones: <4}')
执行结果:
Init:0 0s=1000 1s=0
Init:1 0s=0 1s=1000
2.3说明
Q#中的变量总是不可变的,变量的值被绑定前不能改变
let关键字声明变量的绑定
可变的变量使用mutable 关键字声明
不可变变量可使用set语句改变值
变量类型由编译器推断,无需声明类型
using语句用于在一段代码中分配量子位
所有量子位被动态分配和释放
2.4 异常
如果在vscode中创建子文件夹存放Bell.qs和Host.py,会报异常:
ModuleNotFoundError: No module named 'Quantum'
3 叠加
使用Hadamard运算
如果一个量子位处于0或1的状态,H运算将使得量子位处于50%的测量为1,50%的测量为0的状态
修改上述Bell.qs
H(qubit);
let res = M(qubit);
执行结果:
Init:0 0s=524 1s=476
Init:1 0s=512 1s=488
4 纠缠
使第一个量子位处于叠加态,在测量第一个量子位之前,使用CNOT运算,如果第一个量子位是1则反转第二个量子位
代码
Bell.qs
namespace Quantum.Bell {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Canon;
operation Set(desired : Result, q1 : Qubit) : Unit {
if (desired != M(q1)) {
X(q1);
}
}
operation TestBellState(count : Int, initial : Result) : (Int, Int, Int) {
mutable numOnes = 0;
mutable agree = 0;
using ((q0, q1) = (Qubit(), Qubit())) {
for (test in 1..count) {
Set(initial, q0);
Set(Zero, q1);
// q0叠加
H(q0);
// 如果q0为1则反转q1
CNOT(q0, q1);
// 测量q0
let res = M(q0);
// 如果q1和q0的结果相同
if (M(q1) == res) {
set agree += 1;
}
// Count the number of ones we saw:
if (res == One) {
set numOnes += 1;
}
}
Set(Zero, q0);
Set(Zero, q1);
}
// Return number of times we saw a |0> and number of times we saw a |1>
return (count-numOnes, numOnes, agree);
}
}
Host.py
import qsharp
from qsharp import Result
from Quantum.Bell import TestBellState
initials = {Result.Zero, Result.One}
for i in initials:
res = TestBellState.simulate(count=1000, initial=i)
(num_zeros, num_ones, agree) = res
print(f'Init:{i: <4} 0s={num_zeros: <4} 1s={num_ones: <4} agree={agree: <4}')
执行结果:
Init:0 0s=480 1s=520 agree=1000
Init:1 0s=511 1s=489 agree=1000
网友评论