Manajemen Memori Kuantum

Program selalu dimulai tanpa qubit, yang berarti Anda tidak dapat meneruskan nilai tipe Qubit sebagai argumen titik masuk. Pembatasan ini disengaja karena tujuannya Q# adalah untuk mengekspresikan dan alasan tentang program secara keseluruhan. Sebagai gantinya, program mengalokasikan dan melepaskan qubit, atau memori kuantum, seperti yang terjadi. Dalam hal ini, Q# memodelkan komputer kuantum sebagai tumpukan qubit.

Daripada mendukung pernyataan alokasi dan rilis terpisah untuk memori kuantum, Q# mendukung alokasi memori kuantum dalam bentuk pernyataan blok, di mana memori hanya dapat diakses dalam cakupan pernyataan blok tersebut. Blok pernyataan dapat didefinisikan secara implisit saat mengalokasikan kubit selama durasi cakupan saat ini, seperti yang dijelaskan secara lebih rinci di bagian tentang use pernyataan dan borrow . Mencoba mengakses qubit yang dialokasikan setelah pernyataan mengakhiri menghasilkan pengecualian runtime.

Q# memiliki dua pernyataan, use dan borrow, yang membuat instans nilai kubit, array qubit, atau kombinasi apa pun darinya. Anda hanya dapat menggunakan pernyataan ini dalam operasi. Mereka mengumpulkan nilai kubit yang diinstansiasi, mengikatnya ke variabel yang ditentukan dalam pernyataan, lalu menjalankan blok pernyataan. Di akhir blok, variabel terikat keluar dari cakupan dan tidak lagi didefinisikan.

Q# membedakan antara alokasi qubit yang bersih dan kotor . Qubit bersih tidak tertahankan dan tidak digunakan oleh bagian lain dari komputasi. Qubit kotor adalah qubit yang keadaannya tidak diketahui dan bahkan dapat dijerat dengan bagian lain dari memori prosesor kuantum.

Pernyataan penggunaan

Qubit bersih dialokasikan oleh use pernyataan .

  • Pernyataan terdiri dari kata kunci use diikuti oleh blok pernyataan yang mengikat dan opsional.
  • Jika ada blok pernyataan, qubit hanya tersedia di dalam blok itu. Jika tidak, qubit tersedia hingga akhir cakupan saat ini.
  • Pengikatan mengikuti pola yang sama seperti pernyataan let: baik simbol tunggal atau tupel simbol, diikuti oleh tanda sama dengan =, dan tupel tunggal atau tupel inisialisasi yang cocok.

Inisialisasi tersedia untuk satu qubit, ditunjukkan sebagai Qubit(), atau array qubit, Qubit[n], di mana n adalah ekspresi Int. Contohnya,

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

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

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

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

Qubit dijamin berada dalam status |0⟩ pada saat alokasi. Mereka dirilis di akhir cakupan dan harus dalam status |0⟩ saat dirilis. Persyaratan ini tidak diberlakukan kompilator karena ini akan membutuhkan evaluasi simbolis yang dengan cepat menjadi mahal secara larangan. Saat berjalan pada simulator, persyaratan dapat diberlakukan runtime. Pada prosesor kuantum, persyaratan tidak dapat dijalankan waktu proses; qubit yang tidak terukur dapat direset ke |0⟩ melalui transformasi kesatuan. Gagal melakukannya menghasilkan perilaku yang salah.

Pernyataan ini use mengalokasikan kubit dari tumpukan qubit bebas prosesor kuantum dan mengembalikannya ke tumpukan tidak lebih lambat dari akhir cakupan di mana qubit terikat.

Pernyataan pinjam

Pernyataan ini borrow memberikan akses ke kubit yang sudah dialokasikan tetapi saat ini tidak digunakan. Qubit ini dapat berada dalam keadaan arbitrer dan harus berada dalam keadaan yang sama lagi ketika pernyataan pinjam berakhir. Beberapa algoritma kuantum dapat menggunakan qubit tanpa mengandalkan statusnya yang tepat, dan tanpa mengharuskan mereka tidak tertahankan dengan sisa sistem. Artinya, mereka membutuhkan qubit tambahan untuk sementara, tetapi mereka dapat memastikan bahwa qubit tersebut dikembalikan tepat ke keadaan semula, terlepas dari keadaan mana yang.

Jika ada qubit yang digunakan tetapi tidak disentuh selama bagian-bagian subroutine, qubit tersebut dapat dipinjam untuk digunakan oleh algoritma tersebut alih-alih mengalokasikan memori kuantum tambahan. Meminjam alih-alih mengalokasikan dapat secara signifikan mengurangi persyaratan memori kuantum keseluruhan algoritma dan merupakan contoh kuantum dari tradeoff ruang-waktu yang khas.

Pernyataan borrow mengikuti pola yang sama yang dijelaskan sebelumnya untuk use pernyataan , dengan inisialisasi yang sama tersedia. Contohnya,

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

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

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

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

Qubit yang dipinjam berada dalam status yang tidak diketahui dan keluar dari cakupan di akhir blok pernyataan. Peminjam berkomitmen untuk meninggalkan qubit dalam keadaan yang sama seperti ketika mereka dipinjam; artinya, keadaan mereka di awal dan akhir blok pernyataan diharapkan sama.

Pernyataan ini borrow mengambil qubit yang digunakan yang dijamin tidak akan digunakan oleh program sejak qubit terikat hingga penggunaan terakhir dari qubit tersebut. Jika tidak ada cukup qubit yang tersedia untuk dipinjam, maka qubit dialokasikan dari dan dikembalikan ke heap seperti use pernyataan.

Catatan

Di antara kasus penggunaan yang diketahui dari qubit kotor adalah implementasi gerbang CNOT multi-kontrol yang membutuhkan sangat sedikit kubit, dan implementasi inkrementer. Makalah tentang faktor dengan qubit memberikan contoh algoritma yang menggunakan qubit yang dipinjam.