量子記憶體管理

程式一律會以無量子位啟動,這表示您無法將類型的 Qubit 值當做進入點自變數傳遞。 這項限制是刻意的,因為的目的是 Q# 要表達程式及其完整原因。 相反地,程式會配置和釋放量子位或量子記憶體,就像一樣。 因此,Q# 會將量子電腦建立為量子位元堆積模型。

不支援量子記憶體的個別 配置釋放 語句, Q# 而是支援 區塊語句形式的量子記憶體配置,其中記憶體只能在該區塊語句的範圍內存取。 在目前範圍期間配置量子位時,可以隱含定義語句區塊,如 和 borrow 語句各節use中所述。 嘗試在語句終止之後存取配置的量子位會導致運行時間例外狀況。

Q# 有兩個 語句和 useborrow,可具現化量子位值、量子位的陣列,或其任何組合。 您只能在作業內使用這些語句。 他們會收集具現化的量子位值、將它們系結至 語句中指定的變數,然後執行語句區塊。 在區塊結尾,繫結變數會超出範圍,且不再被定義。

Q# 區分 清除已變更 量子位的配置。 清除量子位未排入,而且不會由計算的另一個部分使用。 已變更的量子位是狀態未知的量子位,甚至可以與量子處理器記憶體的其他部分糾纏。

Use 語句

語句會配置 use 清除量子位。

  • 此陳述式的組成為關鍵字 use 後接繫結和選擇性的陳述式區塊。
  • 如有陳述式區塊,則量子位元就只能在該區塊內使用。 否則,量子位元可一直用到目前範圍的結尾。
  • 繫結遵循 let 陳述式的相同模式:單一符號或一個 Tuple 符號,後接等號 =,以及單一 Tuple 或相符 Tuple 的「初始設定式」。

適用於單一量子位元的初始設定式表示為 Qubit(),若適用於量子位元陣列則表示為 Qubit[n];其中 nInt 運算式。 例如

use qubit = Qubit();
// ...

use (aux, register) = (Qubit(), Qubit[5]);
// ...

use qubit = Qubit() {
    // ...
}

use (aux, register) = (Qubit(), Qubit[5]) {
    // ...
}

量子位元保證在配置時為 |0⟩ 狀態。 它們會在範圍結尾發行,且必須在發行時處於 |0⟩ 狀態。 這項需求不會強制執行編譯程式,因為這需要符號評估,以快速耗用大量成本。 在模擬器上執行時,可以強制執行需求。 在量子處理器上,此需求不能在執行階段實施;未經測量的量子位元可透過 Unitary 轉換重設為 |0⟩。 無法這麼做會導致行為不正確。

use語句會從量子處理器的可用量子位堆積配置量子位,並將量子位傳回至堆積,且不會晚於量子位系結的範圍結尾。

借用語句

語句會將 borrow 已配置但目前未使用的量子位存取權授與。 這些量子位可以處於任意狀態,而且當借用語句終止時,必須再次處於相同的狀態。 某些量子演算法可以使用量子位,而不需依賴其確切狀態,而且不需要它們未與系統的其餘部分整合。 也就是說,它們暫時需要額外的量子位,但可以確保這些量子位完全傳回至其原始狀態,與原狀狀態無關。

如果有量子位正在使用,但子程式部分未觸控,則可以借用這些量子位供這類演算法使用,而不是配置額外的量子記憶體。 借用而不是配置可大幅減少演算法的整體量子記憶體需求,而且是一般空間時間取捨的量子範例。

borrow語句遵循先前use針對語句所描述的相同模式,且可用的初始化表達式相同。 例如

borrow qubit = Qubit();
// ...

borrow (aux, register) = (Qubit(), Qubit[5]);
// ...

borrow qubit = Qubit() {
    // ...
}

borrow (aux, register) = (Qubit(), Qubit[5]) {
    // ...
}

借用的量子位元狀態不明,且超出陳述式區塊結尾的範圍。 借用者會認可讓量子位處於與借用時相同的狀態;也就是說,其狀態在語句區塊的開頭和結尾必須是相同的。

語句會 borrow 擷取使用中量子位,保證不會由程式從量子位系結到最後一次使用該量子位為止使用。 如果沒有足夠的量子位可供借用,則量子位會從 配置並傳回至類似 語句的 use 堆積。

注意

在已變更量子位的已知使用案例中,是多控制 CNOT 閘道的實作,這些閘道需要非常少的量子位,以及遞增器的實作。 本文 提供 利用借用量子位的演算法範例。