天天看點

第一個Q#程式:量子糾纏

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

繼續閱讀