Algoritma Shor
Untuk modul Qiskit in Classrooms ini, pelajar perlu mempunyai persekitaran Python yang berfungsi dengan pakej berikut dipasang:
qiskitv2.1.0 atau lebih baharuqiskit-ibm-runtimev0.40.1 atau lebih baharuqiskit-aerv0.17.0 atau lebih baharuqiskit.visualizationnumpypylatexenc
Untuk menyediakan dan memasang pakej di atas, lihat panduan Pasang Qiskit. Untuk menjalankan kerja pada komputer kuantum sebenar, pelajar perlu membuat akaun dengan IBM Quantum® dengan mengikuti langkah-langkah dalam panduan Sediakan akaun IBM Cloud anda.
Modul ini telah diuji dan menggunakan tiga saat masa QPU. Ini adalah anggaran sahaja. Penggunaan sebenar anda mungkin berbeza.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Pengenalan
Pada awal 1990-an, terdapat keseronokan yang semakin meningkat tentang potensi komputer kuantum untuk menyelesaikan masalah yang sukar bagi komputer klasik. Beberapa saintis komputer berbakat telah mereka bentuk algoritma yang menunjukkan kekuatan pengkomputeran kuantum untuk beberapa masalah khusus yang direka khas, tetapi tiada seorang pun yang menemui satu "killer app" pengkomputeran kuantum yang pasti akan merevolusikan bidang ini. Itu berlaku sehingga 1994, apabila Peter Shor menghasilkan apa yang kini dikenali sebagai algoritma Shor untuk memfaktorkan nombor besar.
Sudah lama diketahui pada masa itu bahawa mencari faktor perdana nombor besar adalah sangat sukar bagi komputer klasik. Malah, protokol keselamatan internet bergantung pada kesukaran ini. Shor menemui cara untuk mencari faktor-faktor ini dengan lebih cekap secara eksponen dengan memindahkan beberapa langkah yang lebih mencabar kepada komputer kuantum teoritikal pada masa depan.
Dalam modul ini, kita akan meneroka algoritma Shor. Pertama, kita akan memberikan sedikit konteks lebih lanjut tentang algoritma ini, memformalkan masalah yang diselesaikannya dan menerangkan relevansinya kepada keselamatan siber. Seterusnya, kita akan memberikan pengenalan tentang matematik modular dan cara menggunakannya pada masalah pemfaktoran, menunjukkan bagaimana pemfaktoran boleh diturunkan kepada masalah lain yang dipanggil "pencarian peringkat." Kita akan menunjukkan bagaimana Jelmaan Fourier Kuantum dan Anggaran Fasa Kuantum yang kita pelajari dalam modul sebelumnya memainkan peranan, dan cara menggunakannya untuk menyelesaikan masalah pencarian peringkat.
Akhir sekali, kita akan menjalankan algoritma Shor pada komputer kuantum sebenar! Ingatlah, bagaimanapun, algoritma ini hanya akan benar-benar berguna apabila kita mempunyai komputer kuantum yang besar dan tahan kesalahan, yang masih beberapa tahun lagi. Jadi, kita hanya akan memfaktorkan nombor kecil untuk menunjukkan cara algoritma ini berfungsi.
Masalah pemfaktoran
Matlamat masalah pemfaktoran adalah untuk mencari faktor perdana suatu nombor . Untuk sesetengah nombor , ini agak mudah. Contohnya, jika adalah genap, salah satu faktor perdananya ialah 2. Jika adalah kuasa perdana, bermaksud untuk suatu nombor perdana , adalah juga agak mudah untuk mencari : kita hanya menganggarkan punca bagi dan mencari perdana berdekatan yang mungkin .
Walau bagaimanapun, komputer klasik menghadapi kesukaran apabila adalah ganjil dan bukan kuasa perdana. Inilah kes yang ditangani algoritma Shor. Algoritma ini mencari dua faktor dan supaya . Ia boleh digunakan secara rekursif sehingga semua faktor adalah perdana. Dalam bahagian seterusnya kita akan melihat bagaimana masalah ini ditangani.
Relevansi kepada keselamatan siber
Banyak skim kriptografi telah dibina berdasarkan hakikat bahawa memfaktorkan nombor besar adalah sukar, termasuk satu yang biasa digunakan hari ini, dipanggil RSA. Dalam RSA, kunci awam dicipta dengan mendarabkan dua nombor perdana besar bersama untuk mendapatkan . Kemudian, sesiapa sahaja boleh menggunakan kunci awam ini untuk menyulitkan data. Tetapi hanya seseorang yang mempunyai kunci peribadi, dan , boleh menyahsulit data tersebut.
Jika mudah difaktorkan, maka sesiapa pun boleh menentukan apakah dan dan memecahkan penyulitan. Tetapi ia tidak begitu. Ini adalah masalah yang terkenal sukar. Malah, faktor perdana bagi nombor yang dipanggil RSA1024, yang mempunyai 1024 digit binari dan 309 digit perpuluhan, masih belum ditemui, walaupun hadiah $100,000 ditawarkan untuk pemfaktorannya sejak 1991.
Penyelesaian Shor
Pada 1994, Peter Shor menyedari bahawa komputer kuantum boleh memfaktorkan nombor besar dengan lebih cekap secara eksponen berbanding komputer klasik. Wawasannya bergantung pada hubungan antara masalah pemfaktoran ini dan aritmetik modular. Kita akan melalui pengenalan ringkas tentang aritmetik modular, kemudian kita akan melihat bagaimana kita boleh menggunakannya untuk memfaktorkan .
Aritmetik modular
Aritmetik modular adalah sistem pengiraan yang bersifat kitaran, bermaksud walaupun pengiraan bermula seperti biasa, dengan integer 0, 1, 2, dan seterusnya, pada suatu ketika, selepas tempoh , pengiraan bermula semula. Mari lihat cara ini berfungsi dengan contoh. Katakan tempoh kita adalah 5. Kemudian, semasa kita mengira, di mana kita biasanya mencapai 5, kita sebaliknya memulakan semula pada 0:
Ini kerana dalam dunia "modulo-5", 5 bersamaan dengan 0. Kita katakan . Malah, semua gandaan 5 akan bersamaan dengan .
Semak pemahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Gunakan aritmetik modular untuk menyelesaikan masalah berikut:
Katakan anda bertolak dalam perjalanan kereta api transcontinental yang panjang pada pukul 8 pagi. Perjalanan kereta api itu 60 jam lamanya. Pukul berapakah ketika anda tiba?
Jawapan:
Tempohnya ialah 24, kerana ada 24 jam dalam sehari. Jadi, masalah ini boleh ditulis dalam aritmetik modular sebagai:
Jadi, anda akan tiba di destinasi pada pukul 20:00, atau pukul 8 malam.
dan
Selalunya berguna untuk memperkenalkan dua set, dan . hanyalah set nombor yang wujud dalam dunia "modulo-". Contohnya, apabila kita mengira modulo-5, setnya ialah . Contoh lain: . Kita boleh melakukan penambahan dan pendaraban (modulo ) pada elemen dalam , dan hasil setiap operasi ini juga adalah elemen dalam , menjadikan objek matematik yang dipanggil gelanggang.
Terdapat subset khas yang amat menarik perhatian kita untuk algoritma Shor. Iaitu subset nombor dalam supaya pembahagi sepunya terbesar antara setiap elemen dan ialah 1, jadi setiap elemen adalah "ko-perdana" dengan . Jika kita mengambil set nombor ini bersama operasi pendaraban modular, maka ini membentuk objek matematik lain, yang dipanggil kumpulan. Kita menamakan kumpulan ini . Rupanya dengan (dan kumpulan terhingga secara umum), jika kita memilih mana-mana elemen , dan berulang kali mendarabkan dengan dirinya sendiri, kita akan sentiasa akhirnya mendapatkan nombor . Bilangan minimum kali seseorang perlu mendarabkan dengan dirinya sendiri untuk mendapatkan dipanggil peringkat bagi . Fakta ini akan sangat penting dalam perbincangan kita tentang cara memfaktorkan nombor di bawah.
Semak pemahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Apakah ?
Jawapan:
Kita mengecualikan nombor berikut:
Apakah peringkat bagi setiap elemen dalam ?
Jawapan:
Peringkat adalah nombor terendah supaya bagi setiap elemen .
Perhatikan bahawa, walaupun kita dapat mencari peringkat nombor dalam , ini BUKAN tugas yang mudah secara umum, untuk yang lebih besar. Inilah inti masalah pemfaktoran dan sebab kita memerlukan komputer kuantum. Kita akan melihat mengapa semasa kita mengerjakan baki notebook ini.
Gunakan aritmetik modular pada masalah pemfaktoran
Kunci untuk mencari faktor dan supaya bergantung pada mencari suatu integer lain supaya
dan
Bagaimana mencari membantu kita mencari faktor dan ? Mari lalui hujah itu sekarang. Sejak , bermaksud . Dalam erti kata lain, adalah gandaan . Jadi, untuk suatu integer ,
Kita boleh memfaktorkan untuk mendapatkan:
Daripada andaian awal kita, kita tahu bahawa , jadi tidak membahagi secara sekata ke dalam atau . Jadi, dua faktor , iaitu dan , masing-masing mesti membahagi ke dalam dan . Sama ada adalah faktor dan adalah faktor , atau sebaliknya. Oleh itu, jika kita mengira pembahagi sepunya terbesar (GCD) antara dan kedua-dua dan , itu akan memberi kita faktor dan . Mengira GCD antara dua nombor adalah tugas yang mudah secara klasik yang boleh dilakukan, contohnya, menggunakan algoritma Euclid.
Semak pemahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Mungkin sukar untuk memahami setiap langkah logik di atas, jadi cuba lakukan dengan contoh. Gunakan dan . Pertama, sahkan bahawa dan . Kemudian teruskan untuk mengesahkan setiap langkah. Akhir sekali, kira dan sahkan bahawa ia adalah faktor-faktor .
Jawapan:
, iaitu , jadi .
, yang tidak bersamaan dengan .
, yang tidak bersamaan dengan .
Sekarang, kita tahu bahawa untuk suatu integer . Ini disahkan apabila kita memasukkan dan : apabila .
Sekarang, kita perlu mengira dan .
Jadi, kita telah menemui faktor-faktor !
Algoritma
Kini setelah kita melihat bagaimana mencari suatu integer supaya membantu kita memfaktorkan , kita boleh melalui algoritma Shor. Ia pada asasnya merupakan cara mencari :
- Pilih integer rawak Pilih integer rawak supaya .
- Kira secara klasik.
- Jika , anda telah menemui faktor. Berhenti.
- Jika tidak, teruskan.
-
Cari peringkat bagi modulo Cari integer positif terkecil yang memenuhi .
-
Semak sama ada peringkatnya genap
- Jika adalah ganjil, kembali ke langkah 1 dan pilih baru.
- Jika adalah genap, teruskan ke langkah 4.
- Kira
- Semak bahawa dan .
- Jika , kembali ke langkah 1 dan pilih baru.
- Jika tidak, kira gcd untuk mengekstrak faktor:
Ini akan menjadi faktor bukan remeh bagi .
- Faktor secara rekursif jika perlu
- Jika dan/atau bukan perdana, gunakan algoritma ini secara rekursif untuk memfaktorkannya sepenuhnya.
- Apabila semua faktor adalah perdana, pemfaktoran selesai.
Berdasarkan prosedur ini, mungkin tidak jelas mengapa komputer kuantum diperlukan untuk menyelesaikan tugas ini. Ia perlu kerana langkah 2, mencari peringkat modulo , adalah masalah yang sangat sukar secara klasik. Kerumitannya berskala secara eksponen dalam nombor . Tetapi dengan komputer kuantum, kita hanya perlu menggunakan Anggaran Fasa Kuantum untuk menyelesaikannya. Langkah 4, mencari GCD dua integer, sebenarnya adalah sesuatu yang agak mudah dilakukan secara klasik. Jadi, satu-satunya langkah yang benar-benar memerlukan kuasa komputer kuantum adalah langkah pencarian peringkat. Kita katakan masalah pemfaktoran "diturunkan" kepada masalah pencarian peringkat.
Bahagian yang sukar: pencarian peringkat
Sekarang, kita akan melalui cara kita boleh menggunakan komputer kuantum dalam pencarian peringkat. Pertama, mari kita jelaskan apa yang kita maksudkan dengan "peringkat." Sudah tentu, saya sudah memberitahu anda apa maksud peringkat secara matematik: ia adalah integer bukan sifar pertama supaya Tetapi mari lihat sama ada kita boleh mendapatkan sedikit lebih intuisi untuk konsep ini.
Untuk yang cukup kecil, kita boleh menentukan peringkat hanya dengan mengira setiap kuasa , mengambil modulus bagi nombor itu, kemudian berhenti apabila kita menemui kuasa yang memenuhi . Itulah yang kita lakukan dengan contoh kita, , di atas. Mari lihat beberapa graf kuasa modular ini untuk beberapa nilai sampel dan :
Perasan sesuatu? Ini adalah fungsi berkala! Dan peringkat adalah sama dengan tempohnya! Jadi, pencarian peringkat bersamaan dengan pencarian tempoh.
Komputer kuantum sangat sesuai untuk mencari tempoh fungsi. Untuk ini, kita boleh menggunakan subrutin algoritma yang dipanggil Anggaran Fasa Kuantum. Kita membincangkan QPE dan hubungannya dengan Jelmaan Fourier Kuantum dalam modul sebelumnya. Untuk penyegaran terperinci, pergi ke modul QFT atau pelajaran John Watrous tentang Anggaran Fasa Kuantum dalam kursus Algoritma Kuantumnya. Kita akan melalui intipati prosedur sekarang:
Dalam Anggaran Fasa Kuantum (QPE), kita bermula dengan unitar dan eigenstate unitar tersebut . Kemudian, kita menggunakan QPE untuk menganggarkan nilai eigen yang bersesuaian, yang, kerana pengoperasinya adalah unitari, akan berbentuk . Jadi, mencari nilai eigen bersamaan dengan mencari nilai dalam fungsi berkala. litar kelihatan seperti ini:

di mana bilangan qubit kawalan (qubit teratas dalam rajah di atas) menentukan ketepatan anggaran.
Dalam algoritma Shor, kita menggunakan QPE pada pengoperasi unitari :
Di sini, merujuk kepada keadaan asas komputasi bagi daftar berbilang qubit, di mana nilai binari qubit sepadan dengan integer . Contohnya, jika dan , maka diwakili oleh keadaan asas empat qubit , kerana empat qubit diperlukan untuk mengekodkan nombor sehingga 15. (Jika konsep ini tidak dikenali, lihat modul Qiskit in classrooms pengantar untuk penyegaran tentang pengekodan binari keadaan kuantum.)
Sekarang, kita perlu mencari eigenstate bagi unitari ini. Jika kita bermula dalam keadaan , kita dapat melihat bahawa setiap penggunaan berturutan akan mendarabkan keadaan daftar kita dengan , dan selepas penggunaan kita akan tiba semula pada keadaan . Contohnya dengan dan :
Jadi superposisi keadaan dalam kitaran ini () dalam bentuk:
semuanya adalah eigenstate bagi . (Terdapat lebih banyak eigenstate daripada yang di atas sahaja. Tetapi kita hanya mengambil berat tentang yang berbentuk di atas.)
Semak pemahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Cari eigenstate bagi unitari yang sepadan dengan dan .
Jawapan:
Jadi, peringkat . Eigenstate yang kita minati akan menjadi superposisi saksama semua keadaan yang dilalui di atas, dengan pelbagai fasa:
Katakan kita dapat memulakan keadaan qubit kita ke dalam salah satu eigenstate ini (spoiler — kita tidak boleh. Atau, sekurang-kurangnya tidak dengan mudah. Kita akan menerangkan mengapa dan apa yang boleh kita lakukan sebagai gantinya tidak lama lagi). Kemudian kita boleh menggunakan QPE untuk menganggarkan nilai eigen yang sepadan, di mana . Kemudian, kita akan dapat menentukan peringkat dengan persamaan mudah:
Tetapi ingat, saya berkata bahawa QPE menganggar — ia tidak memberikan nilai tepat. Kita perlu anggaran yang cukup baik untuk membezakan antara dan . Lebih banyak qubit kawalan yang kita miliki, lebih baik anggarannya. Dalam soalan di akhir pelajaran, anda akan diminta untuk menentukan minimum yang diperlukan untuk memfaktorkan nombor .
Sekarang, kita perlu menyelesaikan satu masalah. Semua penjelasan di atas tentang cara mencari bermula dengan menyediakan eigenstate . Tetapi kita tidak tahu cara melakukannya tanpa sudah mengetahui apa itu . Logiknya bersifat bulat. Kita memerlukan cara untuk menganggar nilai eigen tanpa memulakan eigenstate.
Daripada bermula dengan eigenstate , kita boleh menyediakan keadaan awal ke dalam keadaan -qubit yang sepadan dengan dalam binari (iaitu, ). Walaupun keadaan ini sendiri jelas bukan eigenstate , ia adalah superposisi ke atas semua eigenstate :
Semak pemahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaiannya.
Sahkan bahawa bersamaan dengan superposisi ke atas eigenstate yang anda temui untuk dan dalam soalan semakan sebelumnya.
Jawapan:
Empat eigenstate itu ialah:
Jadi,
Bagaimana ini membolehkan kita mencari peringkat ? Oleh kerana keadaan permulaan adalah superposisi ke atas semua eigenstate dalam bentuk yang disenaraikan di atas, maka algoritma QPE secara serentak menganggar setiap yang sepadan dengan eigenstate ini. Jadi, pengukuran qubit kawalan pada akhirnya akan menghasilkan anggaran nilai di mana adalah salah satu nilai eigen yang dipilih secara rawak. Jika kita mengulangi litar ini beberapa kali dan mendapat beberapa sampel dengan nilai yang berbeza, kita akan cepat dapat menyimpulkan .
Laksanakan dalam Qiskit
Seperti yang kita sebut tadi, perkakasan kita belum mampu memfaktorkan nombor besar seperti RSA1024. Kita hanya akan memfaktorkan nombor kecil untuk menunjukkan cara algoritma ini berfungsi. Untuk demo ini, kita akan menggunakan versi ringkas kod yang dibentangkan dalam tutorial algoritma Shor. Jika mahu maklumat lanjut, sila lawati tutorial tersebut.
Kita akan menjalankan algoritma menggunakan rangka kerja piawai kita untuk menyelesaikan masalah kuantum, yang dipanggil rangka kerja corak Qiskit. Ini terdiri daripada empat langkah:
- Memetakan masalah kepada litar kuantum
- Mengoptimumkan litar untuk dijalankan pada perkakasan kuantum
- Melaksanakan litar pada komputer kuantum
- Memproses semula pengukuran
1. Peta
Jom kita faktorkan , dengan memilih sebagai integer ko-prima kita.
Pertama, kita perlu membina litar yang akan melaksanakan uniter pendaraban modular, . Ini sebenarnya bahagian paling rumit dalam keseluruhan pelaksanaan, dan boleh menjadi sangat mahal dari segi pengiraan bergantung kepada cara ia dilakukan. Untuk ini, kita akan sedikit 'menipu': Kita tahu bahawa kita bermula dalam keadaan , dan daripada soalan semak terdahulu,
Jadi, kita akan membina satu uniter yang melakukan operasi betul pada empat keadaan ini, tetapi membiarkan semua keadaan lain tidak berubah. Ini dianggap 'menipu' kerana kita menggunakan pengetahuan kita tentang peringkat untuk memudahkan uniter tersebut. Jika kita benar-benar cuba memfaktorkan nombor yang faktornya tidak diketahui, kita tidak boleh berbuat demikian.
Uji kefahaman anda
Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaian.
Dengan pengetahuan anda tentang cara operator mengubah keadaan di atas, bina operator tersebut daripada siri gate SWAP, yang menukar keadaan dua qubit. (Petunjuk: menulis setiap keadaan dalam binari akan membantu.)
Jawapan:
Jom kita tulis semula tindakan pada keadaan dalam binari:
Setiap tindakan ini boleh dicapai dengan SWAP mudah. dicapai dengan menukar keadaan qubit dan . dicapai dengan menukar keadaan qubit dan . Dan seterusnya. Jadi, kita boleh menguraikan matriks kepada siri gate SWAP berikut:
Ingat bahawa operator bertindak dari kanan ke kiri, jom kita semak bahawa ini mempunyai kesan yang kita inginkan pada setiap keadaan:
Kini kita boleh mengekodkan litar yang bersamaan dengan operator ini dalam Qiskit.
Pertama, kita import pakej yang diperlukan:
# Import necessary packages
import numpy as np
from fractions import Fraction
from math import floor, gcd, log
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.library import QFTGate
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization import plot_histogram
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
Kemudian, kita buat operator :
def M2mod15():
"""
M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
return U
# Get the M2 operator
M2 = M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M2, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)
Algoritma QPE menggunakan gate controlled-. Jadi, sekarang kita sudah ada litar , kita perlu menjadikannya litar controlled-:
def controlled_M2mod15():
"""
Controlled M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)
U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U
# Get the controlled-M2 operator
controlled_M2 = controlled_M2mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M2, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)
Kini kita ada gate controlled-. Tetapi untuk menjalankan algoritma Quantum Phase Estimation, kita memerlukan controlled-, controlled-, sehingga controlled-, di mana ialah bilangan qubit yang digunakan untuk menganggar fasa. Lebih banyak qubit, lebih tepat penganggaran fasa. Kita akan menggunakan qubit kawalan untuk prosedur penganggaran fasa kita. Jadi, kita perlukan:
di mana indeks , dengan , sepadan dengan qubit kawalan. Jom kita kira untuk setiap nilai :
def a2kmodN(a, k, N):
"""Compute a^{2^k} (mod N) by repeated squaring"""
for _ in range(k):
a = int(np.mod(a**2, N))
return a
k_list = range(8)
b_list = [a2kmodN(2, k, 15) for k in k_list]
print(b_list)
[2, 4, 1, 1, 1, 1, 1, 1]
Memandangkan untuk , semua operator yang sepadan ( ke atas) bersamaan dengan identiti. Jadi, kita hanya perlu membina satu lagi matriks, iaitu
Nota: Penyederhanaan ini hanya berfungsi di sini kerana peringkat ialah . Setelah (jadi ), setiap kuasa operator seterusnya adalah identiti. Secara umum, untuk nombor yang lebih besar atau pilihan yang berbeza, anda tidak boleh melangkau pembinaan kuasa yang lebih tinggi. Inilah salah satu sebab mengapa ini dianggap contoh mainan: nombor kecil membenarkan jalan pintas yang tidak akan berfungsi untuk kes yang lebih besar.
def M4mod15():
"""
M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
return U
# Get the M4 operator
M4 = M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M4, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)
Dan seperti sebelum ini, kita jadikannya operator controlled-:
def controlled_M4mod15():
"""
Controlled M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)
U.swap(1, 3)
U.swap(0, 2)
U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()
return c_U
# Get the controlled-M4 operator
controlled_M4 = controlled_M4mod15()
# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M4, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)
Sekarang, kita boleh menyatukan semuanya untuk mencari peringkat dengan litar kuantum, menggunakan penganggaran fasa:
# Order finding problem for N = 15 with a = 2
N = 15
a = 2
# Number of qubits
num_target = floor(log(N - 1, 2)) + 1 # for modular exponentiation operators
num_control = 2 * num_target # for enough precision of estimation
# List of M_b operators in order
k_list = range(num_control)
b_list = [a2kmodN(2, k, 15) for k in k_list]
# Initialize the circuit
control = QuantumRegister(num_control, name="C")
target = QuantumRegister(num_target, name="T")
output = ClassicalRegister(num_control, name="out")
circuit = QuantumCircuit(control, target, output)
# Initialize the target register to the state |1>
circuit.x(num_control)
# Add the Hadamard gates and controlled versions of the
# multiplication gates
for k, qubit in enumerate(control):
circuit.h(k)
b = b_list[k]
if b == 2:
circuit.compose(
M2mod15().control(), qubits=[qubit] + list(target), inplace=True
)
elif b == 4:
circuit.compose(
M4mod15().control(), qubits=[qubit] + list(target), inplace=True
)
else:
continue # M1 is the identity operator
# Apply the inverse QFT to the control register
circuit.compose(QFTGate(num_control).inverse(), qubits=control, inplace=True)
# Measure the control register
circuit.measure(control, output)
circuit.draw("mpl", fold=-1)
2. Optimumkan
Setelah memetakan litar kita, langkah seterusnya adalah mengoptimumkannya untuk dijalankan pada komputer kuantum tertentu. Pertama kita perlu memuatkan Backend.
service = QiskitRuntimeService()
backend = service.backend("ibm_marrakesh")
Jika anda tidak mempunyai masa yang tersedia pada akaun anda atau ingin menggunakan simulator atas sebab tertentu, anda boleh jalankan sel di bawah untuk menyediakan simulator yang akan meniru peranti kuantum yang kita pilih di atas:
pm = generate_preset_pass_manager(optimization_level=2, backend=backend)
transpiled_circuit = pm.run(circuit)
print(f"2q-depth: {transpiled_circuit.depth(lambda x: x.operation.num_qubits==2)}")
print(f"2q-size: {transpiled_circuit.size(lambda x: x.operation.num_qubits==2)}")
print(f"Operator counts: {transpiled_circuit.count_ops()}")
transpiled_circuit.draw(output="mpl", fold=-1, style="clifford", idle_wires=False)
2q-depth: 188
2q-size: 281
Operator counts: OrderedDict({'sx': 548, 'rz': 380, 'cz': 281, 'measure': 8, 'x': 6})

3. Laksanakan
# Sampler primitive to obtain the probability distribution
sampler = Sampler(backend)
# Turn on dynamical decoupling with sequence XpXm
sampler.options.dynamical_decoupling.enable = True
sampler.options.dynamical_decoupling.sequence_type = "XpXm"
# Enable gate twirling
sampler.options.twirling.enable_gates = True
pub = transpiled_circuit
job = sampler.run([pub], shots=1024)
result = job.result()[0]
counts = result.data["out"].get_counts()
plot_histogram(counts, figsize=(35, 5))

Kita dapat melihat empat puncak jelas pada 00000000, 01000000, 10000000, dan 11000000, dengan beberapa kiraan dalam rentetan bit lain disebabkan oleh hingar dalam komputer kuantum. Kita akan mengabaikannya dan hanya menyimpan empat yang dominan dengan menetapkan ambang batas: hanya kiraan melebihi ambang ini yang dianggap isyarat sebenar di atas hingar.
# Dictionary of bitstrings and their counts to keep
counts_keep = {}
# Threshold to filter
threshold = np.max(list(counts.values())) / 2
for key, value in counts.items():
if value > threshold:
counts_keep[key] = value
print(counts_keep)
4. Proses semula
Untuk algoritma Shor, sebahagian besar algoritma dilaksanakan secara klasik. Jadi, kita akan letak selebihnya dalam langkah "pemprosesan semula", selepas kita mendapat pengukuran dari komputer kuantum. Setiap pengukuran di atas boleh ditukar kepada integer, yang setelah dibahagi dengan , merupakan anggaran kita untuk , di mana adalah rawak setiap kali.
a = 2
N = 15
FACTOR_FOUND = False
num_attempt = 0
while not FACTOR_FOUND:
print(f"\nATTEMPT {num_attempt}:")
# Here, we get the bitstring by iterating over outcomes
# of a previous hardware run with multiple shots.
# Instead, we can also perform a single-shot measurement
# here in the loop.
bitstring = list(counts_keep.keys())[num_attempt]
num_attempt += 1
# Find the phase from measurement
decimal = int(bitstring, 2)
phase = decimal / (2**num_control) # phase = k / r
print(f"Phase: theta = {phase}")
# Guess the order from phase
frac = Fraction(phase).limit_denominator(N)
r = frac.denominator # order = r
print(f"Order of {a} modulo {N} estimated as: r = {r}")
if phase != 0:
# Guesses for factors are gcd(a^{r / 2} ± 1, 15)
if r % 2 == 0:
x = pow(a, r // 2, N) - 1
d = gcd(x, N)
if d > 1:
FACTOR_FOUND = True
print(f"*** Non-trivial factor found: {x} ***")
ATTEMPT 0:
Phase: theta = 0.0
Order of 2 modulo 15 estimated as: r = 1
ATTEMPT 1:
Phase: theta = 0.75
Order of 2 modulo 15 estimated as: r = 4
*** Non-trivial factor found: 3 ***
Kesimpulan
Setelah melalui modul ini, anda mungkin terpukau dengan kecemerlangan Peter Shor yang telah mencipta algoritma yang begitu bijak. Tapi semoga anda juga telah mencapai tahap pemahaman baru tentang kesederhanaan yang mengelirukan ini. Walaupun algoritma ini mungkin kelihatan sangat (atau menakutkan) kompleks, jika anda memecahkannya kepada setiap langkah logik dan melaluinya secara perlahan, anda juga akan dapat menjalankan algoritma Shor.
Walaupun kita masih jauh daripada menggunakan algoritma ini untuk memfaktorkan nombor seperti RSA1024, komputer kuantum kita semakin baik setiap hari, dan apabila ambang yang dipanggil toleransi kerosakan dicapai, algoritma seperti ini akan segera menyusul. Ini adalah masa yang menarik untuk belajar tentang pengkomputeran kuantum!
Masalah
Konsep kritikal:
- Sistem kriptografi moden bergantung pada kesukaran klasik untuk memfaktorkan integer besar.
- Aritmetik modular — termasuk struktur dan — menyediakan asas matematik untuk algoritma Shor.
- Masalah memfaktorkan integer boleh diturunkan kepada masalah mencari peringkat suatu nombor modulo .
- Pencarian peringkat kuantum menggunakan teknik penganggaran fasa kuantum untuk menentukan tempoh fungsi .
- Algoritma Shor terdiri daripada aliran kerja hibrid klasik-kuantum yang memilih asas, melakukan pencarian peringkat kuantum, kemudian mengira faktor secara klasik daripada hasilnya.
Benar/Salah:
- B/S Kecekapan algoritma Shor mengancam keselamatan penyulitan RSA.
- B/S Algoritma Shor boleh dilaksanakan dengan cekap pada mana-mana komputer kuantum masa kini.
- B/S Algoritma Shor menggunakan penganggaran fasa kuantum (QPE) sebagai subrutin utama.
- B/S Bahagian klasik algoritma Shor melibatkan pengiraan pembahagi sepunya terbesar (GCD).
- B/S Algoritma Shor hanya berfungsi untuk memfaktorkan nombor genap.
- B/S Satu jalankan algoritma Shor yang berjaya sentiasa menjamin faktor yang betul.
Jawapan pendek:
- Mengapa algoritma Shor dianggap ancaman masa depan yang berpotensi kepada penyulitan RSA?
- Mengapa mencari tempoh, atau peringkat, fungsi eksponen modular berguna untuk memfaktorkan nombor dalam algoritma Shor?
Soalan cabaran:
-
Berapa banyak qubit kawalan yang kita perlukan untuk nombor yang cuba kita faktorkan bagi mendapatkan ketepatan dalam QPE yang diperlukan untuk mencari nilai peringkat yang betul?
-
Mengikuti prosedur yang kita gariskan di sini untuk memfaktorkan 15, kini cuba faktorkan 21.