前面我们编写了量子叠加程序,使用的操作是H。
现在我们对这个程序稍作变更,让它具有量子纠缠能力。
量子纠缠需要两个量子比特,所以我们在using中使用2:
using (qubits = Qubit[2])
我们把第二个量子初始化为Zero:
Set (initial, qubits[0]); Set (Zero, qubits[1]);
量子纠缠使用的操作是CNOT:
H(qubits[0]); CNOT(qubits[0],qubits[1]); let res = M (qubits[0]);
最后,在释放量子比特前依然要记得重置它:
Set(Zero, qubits[0]); Set(Zero, qubits[1]);
现在可以运行程序了。
遗憾的是,虽然我们使用了CNOT操作,凡是并没有把结果展示出来。
所以我们继续对BellTest做修改,增加一个agree变量,变量的定义使用mutable,否则用let:
mutable numOnes = 0; mutable agree = 0; using (qubits = Qubit[2]) { ... }
如果两个量子状态一致,就给agree记录:
if (M (qubits[1]) == res) { set agree = agree + 1; }
并返回结果。完整的body如下
body { mutable numOnes = 0; mutable agree = 0; using(qubits = Qubit[2]) { for (test in 1..count) { Set(initial, qubits[0]); Set(Zero, qubits[1]); H(qubits[0]); CNOT(qubits[0], qubits[1]); let res = M(qubits[0]); if(M(qubits[1]) == res) { set agree = agree + 1; } if (res == One) { set numOnes = numOnes + 1; } } Set(Zero, qubits[0]); Set(Zero, qubits[1]); } return (count - numOnes, numOnes, agree); }
我们修改的操作签名(增加了一个返回变量)现在去相应的修改驱动类:
var (numZeros, numOnes, agree) = res; System.Console.WriteLine( $"Init:{initial,-4} 0s={numZeros,-4} 1s={numOnes,-4} agree={agree,-4}");
现在运行程序,可以看到输出是
Init:Zero 0s=499 1s=501 agree=1000 Init:One 0s=490 1s=510 agree=1000