前面我們編寫了量子疊加程式,使用的操作是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