Lewati ke konten utama

Algoritma Shor

Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:

  • qiskit v2.1.0 atau lebih baru
  • qiskit-ibm-runtime v0.40.1 atau lebih baru
  • qiskit-aer v0.17.0 atau lebih baru
  • qiskit.visualization
  • numpy
  • pylatexenc

Untuk mengatur dan menginstal paket-paket di atas, lihat panduan Instal Qiskit. Untuk menjalankan job di komputer kuantum sungguhan, siswa perlu membuat akun IBM Quantumยฎ dengan mengikuti langkah-langkah di panduan Siapkan akun IBM Cloud-mu.

Modul ini telah diuji dan menggunakan tiga detik waktu QPU. Ini hanya perkiraan. Penggunaan aktualmu bisa berbeda.

# 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'

Pengantarโ€‹

Di awal tahun 1990-an, ada kegembiraan yang berkembang seputar potensi komputer kuantum untuk memecahkan masalah yang sulit bagi komputer klasik. Beberapa ilmuwan komputer berbakat telah merancang algoritma yang menunjukkan kekuatan komputasi kuantum untuk beberapa masalah niche yang dibuat-buat, tapi belum ada yang menemukan satu "killer app" komputasi kuantum yang pasti akan merevolusi bidang ini. Itu berlangsung sampai tahun 1994, ketika Peter Shor menemukan apa yang sekarang disebut algoritma Shor untuk memfaktorkan bilangan besar.

Saat itu sudah diketahui bahwa menemukan faktor prima dari bilangan besar sangat sulit bagi komputer klasik. Bahkan, protokol keamanan internet mengandalkan kesulitan ini. Shor menemukan cara untuk menemukan faktor-faktor ini secara eksponensial lebih efisien dengan mengalihkan beberapa langkah yang lebih menantang ke komputer kuantum teoritis di masa depan.

Dalam modul ini, kita akan mengeksplorasi algoritma Shor. Pertama, kita akan memberikan sedikit lebih banyak konteks untuk algoritma ini, memformalkan masalah yang diselesaikannya dan menjelaskan relevansinya terhadap keamanan siber. Selanjutnya, kita akan memberikan pengantar tentang matematika modular dan cara menerapkannya pada masalah pemfaktoran, menunjukkan bagaimana pemfaktoran mereduksi ke masalah lain yang disebut "pencarian orde." Kita akan menunjukkan bagaimana Quantum Fourier Transform dan Quantum Phase Estimation yang telah kita pelajari di modul sebelumnya berperan, dan cara menggunakannya untuk memecahkan masalah pencarian orde.

Akhirnya, kita akan menjalankan algoritma Shor di komputer kuantum sungguhan! Tapi ingat, algoritma ini benar-benar hanya akan berguna ketika kita memiliki komputer kuantum yang besar dan toleran terhadap kesalahan, yang masih beberapa tahun lagi. Jadi, kita hanya akan memfaktorkan bilangan kecil untuk mendemonstrasikan cara kerja algoritma ini.

Masalah pemfaktoranโ€‹

Tujuan masalah pemfaktoran adalah menemukan faktor prima dari sebuah bilangan NN. Untuk beberapa bilangan NN, ini cukup mudah. Misalnya, jika NN genap, salah satu faktor primanya adalah 2. Jika NN adalah perpangkatan prima, artinya N=pkN=p^k untuk suatu bilangan prima pp, juga cukup mudah menemukan pp: kita hanya perlu mendekati akar ke-kthk^{\text{th}} dari NN dan mencari bilangan prima terdekat yang bisa menjadi pp.

Di mana komputer klasik kesulitan, yaitu ketika NN ganjil dan bukan perpangkatan prima. Inilah kasus yang ditangani algoritma Shor. Algoritma ini menemukan dua faktor pp dan qq sedemikian sehingga N=pqN=pq. Algoritma ini bisa diterapkan secara rekursif sampai semua faktor adalah prima. Di bagian berikutnya kita akan melihat bagaimana masalah ini ditangani.

Relevansi terhadap keamanan siberโ€‹

Banyak skema kriptografi dibangun berdasarkan fakta bahwa memfaktorkan bilangan besar itu sulit, termasuk salah satu yang umum digunakan saat ini, disebut RSA. Dalam RSA, kunci publik dibuat dengan mengalikan dua bilangan prima besar untuk mendapatkan N=pโ‹…qN = p\cdot q. Kemudian, siapa pun bisa menggunakan kunci publik ini untuk mengenkripsi data. Tapi hanya orang yang memiliki kunci privat, pp dan qq, yang bisa mendekripsi data itu.

Jika NN mudah difaktorkan, maka siapa pun akan bisa menentukan apa itu pp dan qq dan membobol enkripsinya. Tapi tidak seperti itu. Ini adalah masalah yang terkenal sulit. Bahkan, faktor prima dari sebuah bilangan yang disebut RSA1024, yang panjangnya 1024 digit biner dan 309 digit desimal, belum ditemukan sampai saat ini, meskipun hadiah sebesar $100.000 sudah ditawarkan untuk pemfaktorannya sejak tahun 1991.

Solusi Shorโ€‹

Pada tahun 1994, Peter Shor menyadari bahwa komputer kuantum bisa memfaktorkan bilangan besar secara eksponensial lebih efisien daripada komputer klasik. Wawasannya mengandalkan hubungan antara masalah pemfaktoran ini dan aritmatika modular. Kita akan membahas pengantar singkat tentang aritmatika modular, lalu kita akan melihat bagaimana kita bisa menggunakannya untuk memfaktorkan NN.

Aritmatika modularโ€‹

Aritmatika modular adalah sistem penghitungan yang bersifat siklik, artinya meski penghitungan dimulai dengan cara biasa, dengan bilangan bulat 0, 1, 2, dst., pada titik tertentu, setelah periode NN, penghitungan dimulai lagi dari awal. Mari kita lihat cara kerjanya dengan contoh. Katakanlah periode kita adalah 5. Kemudian, saat kita menghitung, di mana kita biasanya mencapai 5, kita malah mulai lagi dari 0:

0,1,2,3,4,0,1,2,3,4,0,1,2,...0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, ...

Ini karena dalam dunia "modulo-5", 5 setara dengan 0. Kita katakan bahwa 5โ€Šmodโ€Š5ย =05\bmod 5 \ = 0. Bahkan, semua kelipatan 5 akan setara dengan 0โ€Šmodโ€Š50\bmod 5.

Cek pemahamanโ€‹

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Gunakan aritmatika modular untuk menyelesaikan masalah berikut:

Kamu berangkat naik kereta lintas benua yang panjang pada pukul 8 pagi. Perjalanan kereta berlangsung 60 jam. Pukul berapa saat kamu tiba?

Jawaban:

Periodenya adalah 24, karena ada 24 jam dalam sehari. Jadi, masalah ini bisa ditulis dalam aritmatika modular sebagai:

(8+60)mod(24)=20(8+60)\text{mod}(24) = 20

Jadi, kamu akan tiba di tujuan pada pukul 20:00, atau 8 malam.

ZN\mathbb{Z}_N dan ZNโˆ—\mathbb{Z}_N^*โ€‹

Seringkali berguna untuk memperkenalkan dua himpunan, ZN\mathbb{Z}_N dan ZNโˆ—\mathbb{Z}_N^*. ZN\mathbb{Z}_N adalah himpunan bilangan yang ada di dunia "modulo-NN". Misalnya, saat kita menghitung modulo-5, himpunannya adalah Z5={0,1,2,3,4}\mathbb{Z}_5=\{0,1,2,3,4\}. Contoh lain: Z15={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}\mathbb{Z}_{15} = \{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\}. Kita bisa melakukan penjumlahan dan perkalian (modulo NN) pada elemen-elemen di ZN\mathbb{Z}_N, dan hasil setiap operasi ini juga merupakan elemen di ZN\mathbb{Z}_N, menjadikan ZN\mathbb{Z}_N sebuah objek matematika yang disebut ring.

Ada subset khusus dari ZN\mathbb{Z}_N yang sangat menarik bagi kita untuk algoritma Shor. Yaitu subset dari bilangan-bilangan di ZN\mathbb{Z}_N sedemikian sehingga pembagi persekutuan terbesar antara setiap elemen dan NN adalah 1, sehingga setiap elemen "ko-prima" dengan NN. Jika kita mengambil himpunan bilangan-bilangan ini bersama operasi perkalian modular, maka ini membentuk objek matematika lain, yang disebut grup. Kita sebut grup ini ZNโˆ—\mathbb{Z}_N^*. Ternyata dengan ZNโˆ—\mathbb{Z}_N^* (dan grup hingga pada umumnya), jika kita memilih elemen mana pun aโˆˆZNโˆ—a \in \mathbb{Z}_N^*, dan berulang kali mengalikan aa dengan dirinya sendiri, kita pada akhirnya selalu akan mendapatkan angka 11. Jumlah minimum kali seseorang harus mengalikan aa dengan dirinya sendiri untuk mendapatkan 11 disebut orde dari aa. Fakta ini akan sangat penting untuk pembahasan kita tentang cara memfaktorkan bilangan di bawah ini.

Cek pemahamanโ€‹

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Apa itu Z15โˆ—\mathbb{Z}_{15}^*?

Jawaban:

Z15โˆ—={1,2,4,7,8,11,13,14}\mathbb{Z}_{15}^* = \{1,2,4,7,8,11,13,14\}

Kita mengecualikan bilangan-bilangan berikut:

3:GCD(3,15)=35:GCD(5,15)=56:GCD(6,15)=39:GCD(9,15)=310:GCD(10,15)=512:GCD(12,15)=3\begin{aligned} 3: GCD(3,15)=3 \\ 5: GCD(5,15)=5 \\ 6: GCD(6,15)=3 \\ 9: GCD(9,15)=3 \\ 10: GCD(10,15)=5 \\ 12: GCD(12,15)=3 \\ \end{aligned}

Apa orde dari setiap elemen di Z15โˆ—\mathbb{Z}_{15}^*?

Jawaban:

Orde rr adalah bilangan terkecil sedemikian sehingga armod(15)=1a^r\text{mod}(15)=1 untuk setiap elemen aa.

11mod(15)=1,r=124mod(15)=1,r=442mod(15)=1,r=274mod(15)=1,r=484mod(15)=1,r=4112mod(15)=1,r=2134mod(15)=1,r=4142mod(15)=1,r=2\begin{aligned} 1^1\text{mod}(15) = 1, r=1 \\ 2^4\text{mod}(15) = 1, r=4 \\ 4^2\text{mod}(15) = 1, r=2 \\ 7^4\text{mod}(15) = 1, r=4 \\ 8^4\text{mod}(15) = 1, r=4 \\ 11^2\text{mod}(15) = 1, r=2 \\ 13^4\text{mod}(15) = 1, r=4 \\ 14^2\text{mod}(15) = 1, r=2 \\ \end{aligned}

Perhatikan bahwa, meski kita bisa menemukan orde dari bilangan-bilangan di Z15โˆ—\mathbb{Z}_{15}^*, ini BUKAN tugas yang mudah secara umum, untuk NN yang lebih besar. Ini adalah inti dari masalah pemfaktoran dan mengapa kita membutuhkan komputer kuantum. Kita akan melihat alasannya saat kita mengerjakan sisa notebook ini.

Terapkan aritmatika modular pada masalah pemfaktoranโ€‹

Kunci untuk menemukan faktor pp dan qq sedemikian sehingga N=pqN=pq bergantung pada penemuan bilangan bulat lain xx sedemikian sehingga

x2โ‰ก1โ€Šmodโ€ŠNx^2 \equiv 1 \bmod N dan xโ‰กฬธยฑ1โ€Šmodโ€ŠN.x \not\equiv \pm 1 \bmod N.

Bagaimana menemukan xx membantu kita menemukan faktor pp dan qq? Mari kita telusuri argumennya sekarang. Karena x2โ‰ก1โ€Šmodโ€ŠNx^2 \equiv 1 \bmod N, itu berarti x2โˆ’1โ‰ก0โ€Šmodโ€ŠNx^2 - 1 \equiv 0 \bmod N . Dengan kata lain, x2โˆ’1x^2 - 1 adalah kelipatan dari NN. Jadi, untuk suatu bilangan bulat ll,

x2โˆ’1=lNx^2 - 1 = l N

Kita bisa memfaktorkan x2โˆ’1x^2 - 1 untuk mendapatkan:

(x+1)(xโˆ’1)=lN(x+1)(x-1) = l N

Dari asumsi awal kita tahu bahwa xโ‰กฬธยฑ1โ€Šmodโ€ŠNx \not\equiv \pm 1 \bmod N, sehingga NN tidak habis membagi x+1x+1 maupun xโˆ’1x-1. Jadi, dua faktor dari NN, pp dan qq, masing-masing harus membagi xโˆ’1x-1 dan x+1x+1. Entah pp adalah faktor dari xโˆ’1x-1 dan qq adalah faktor dari x+1x+1, atau sebaliknya. Oleh karena itu, jika kita menghitung pembagi persekutuan terbesar (GCD) antara NN dan keduanya xโˆ’1x-1 serta x+1x+1, itu akan memberi kita faktor pp dan qq. Menghitung GCD antara dua bilangan adalah tugas yang mudah secara klasik yang bisa dilakukan, misalnya, menggunakan algoritma Euclid.

Cek pemahamanโ€‹

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Mungkin sulit untuk memahami setiap langkah logika di atas, jadi coba kerjakan dengan contoh. Gunakan N=15N=15 dan x=11x=11. Pertama, verifikasi bahwa x2โ‰ก1mod(N)x^2 \equiv 1 \text{mod}(N) dan xโ‰กฬธยฑ1โ€Šmodโ€ŠNx \not\equiv \pm 1 \bmod N. Kemudian lanjutkan untuk memverifikasi setiap langkah. Akhirnya, hitung GCD(11ยฑ1,15)\text{GCD}(11\pm1,15) dan verifikasi bahwa mereka adalah faktor dari 1515.

Jawaban:

112=12111^2 = 121, yang merupakan 15โˆ—8+115*8 + 1, sehingga 112โ€Šmodโ€Š15=111^2\bmod 15 = 1. โœ“\checkmark

11โˆ’1=10 11 - 1 = 10, yang tidak setara dengan 0โ€Šmodโ€Š150\bmod 15. โœ“\checkmark

11+1=12 11 + 1 = 12, yang tidak setara dengan 0โ€Šmodโ€Š150\bmod 15. โœ“\checkmark

Sekarang, kita tahu bahwa (x+1)(xโˆ’1)=lN(x+1)(x-1) = l N untuk suatu bilangan bulat ll. Ini diverifikasi saat kita memasukkan xx dan NN: (12)(10)=l15(12)(10) = l 15 ketika l=8l = 8. โœ“\checkmark

Sekarang, kita perlu menghitung GCD(12,15)\text{GCD}(12,15) dan GCD(10,15)\text{GCD}(10,15).

GCD(12,15)=3GCD(10,15)=5\begin{aligned} \text{GCD}(12,15) = 3 \\ \text{GCD}(10,15) = 5 \end{aligned}

Jadi, kita telah menemukan faktor-faktor dari 1515!

Algoritmaโ€‹

Sekarang kita sudah melihat bagaimana menemukan bilangan bulat xx sedemikian sehingga x2โ‰ก1โ€Šmodโ€ŠNx^2 \equiv 1\bmod N membantu kita memfaktorkan NN, kita bisa menelusuri algoritma Shor. Intinya berpusat pada menemukan xx:

  1. Pilih bilangan bulat acak Pilih bilangan bulat acak aa sedemikian sehingga 1<a<N1 < a < N.
  • Hitung GCD(a,N)\text{GCD}(a, N) secara klasik.
    • Jika GCD(a,N)>1\text{GCD}(a, N) > 1, kamu sudah menemukan faktornya. Berhenti.
    • Jika tidak, lanjutkan.
  1. Temukan orde rr dari aa modulo NN Temukan bilangan bulat positif terkecil rr yang memenuhi arโ‰ก1(modN)a^r \equiv 1 \pmod N.

  2. Periksa apakah orde itu genap

  • Jika rr ganjil, kembali ke langkah 1 dan pilih aa baru.
  • Jika rr genap, lanjutkan ke langkah 4.
  1. Hitung x=ar/2โ€Šmodโ€ŠNx = a^{r/2} \bmod N
  • Periksa bahwa xโ‰กฬธ1(modN)x \not\equiv 1 \pmod N dan xโ‰กฬธโˆ’1(modN)x \not\equiv -1 \pmod N.
    • Jika xโ‰กยฑ1(modN)x \equiv \pm 1 \pmod N, kembali ke langkah 1 dan pilih aa baru.
  • Jika tidak, hitung gcd untuk mengekstrak faktor-faktornya:
p=GCD(xโˆ’1,N),q=GCD(x+1,N)p = \text{GCD}(x-1, N), \quad q = \text{GCD}(x+1, N)

Ini akan menjadi faktor non-trivial dari NN.

  1. Faktorkan secara rekursif jika diperlukan
  • Jika pp dan/atau qq bukan prima, terapkan algoritma secara rekursif untuk memfaktorkannya sepenuhnya.
  • Setelah semua faktor adalah prima, pemfaktoran selesai.

Berdasarkan prosedur ini, mungkin tidak jelas mengapa komputer kuantum diperlukan untuk menyelesaikan tugas ini. Ini diperlukan karena langkah 2, menemukan orde aa modulo NN, secara klasik merupakan masalah yang sangat sulit. Kompleksitasnya bertambah secara eksponensial terhadap bilangan NN. Tapi dengan komputer kuantum, kita hanya perlu memanfaatkan Quantum Phase Estimation untuk menyelesaikannya. Langkah 4, menemukan GCD dari dua bilangan bulat, sebenarnya cukup mudah dilakukan secara klasik. Jadi, satu-satunya langkah yang benar-benar membutuhkan kekuatan komputer kuantum adalah langkah pencarian orde. Kita katakan bahwa masalah pemfaktoran "mereduksi" ke masalah pencarian orde.

Bagian yang sulit: pencarian ordeโ€‹

Sekarang, kita akan membahas bagaimana kita bisa menggunakan komputer kuantum dalam pencarian orde. Pertama, mari kita perjelas apa yang kita maksud dengan "orde." Tentu saja, aku sudah memberitahumu apa arti orde secara matematis: ini adalah bilangan bulat non-nol pertama rr sedemikian sehingga ar=1(modN).a^r = 1 \pmod N. Tapi mari kita lihat apakah kita bisa mendapatkan sedikit lebih banyak intuisi untuk konsep ini.

Untuk NN yang cukup kecil, kita bisa menentukan orde hanya dengan menghitung setiap perpangkatan dari aa, mengambil modulus NN dari bilangan itu, lalu berhenti saat kita menemukan pangkat rr yang memenuhi ar=1mod(N)a^r = 1 \text{mod}(N). Itulah yang kita lakukan dengan contoh kita, N=15N=15, di atas. Mari kita lihat beberapa grafik dari perpangkatan modular ini untuk beberapa nilai sampel dari aa dan NN:

Nilai a pangkat k modulo N versus pangkat k, dengan a=2 dan N=15. Kita melihat bahwa saat k bertambah, pola berulang muncul, menunjukkan bahwa a^k modulo N bersifat periodik dalam k.

Nilai a pangkat k modulo N versus pangkat k, dengan a=5 dan N=21. Kita melihat bahwa saat k bertambah, pola berulang muncul, menunjukkan bahwa a^k modulo N bersifat periodik dalam k.

Perhatikan sesuatu? Ini adalah fungsi periodik! Dan orde rr sama dengan periodenya! Jadi, pencarian orde setara dengan pencarian periode.

Komputer kuantum sangat cocok untuk menemukan periode dari fungsi. Untuk ini, kita bisa menggunakan subrutin algoritma yang disebut Quantum Phase Estimation. Kita membahas QPE dan hubungannya dengan Quantum Fourier Transform di modul sebelumnya. Untuk penyegaran yang lebih detail, kunjungi modul QFT atau pelajaran John Watrous tentang Quantum Phase Estimation di kursus Algoritma Kuantum miliknya. Kita akan menelusuri inti prosedurnya sekarang:

Dalam Quantum Phase Estimation (QPE), kita mulai dengan unitary UU dan eigenstate dari unitary tersebut โˆฃฯˆโŸฉ|\psi\rangle. Kemudian, kita menggunakan QPE untuk mendekati nilai eigennya yang sesuai, yang, karena operatornya adalah unitary, akan berbentuk e2ฯ€iฮธe^{2\pi i \theta}. Jadi, menemukan nilai eigen setara dengan menemukan nilai ฮธ\theta dalam fungsi periodik. Circuit-nya terlihat seperti ini:

Diagram Circuit dari prosedur Quantum phase estimation. m Qubit kontrol teratas disiapkan dalam superposisi dengan gate Hadamard, kemudian gate controlled-unitary diterapkan ke Qubit bagian bawah, yang berada dalam eigenstate dari unitary. Akhirnya, inverse quantum Fourier transform diterapkan ke Qubit teratas dan diukur.

di mana jumlah Qubit kontrol (mm Qubit teratas dalam gambar di atas) menentukan presisi perkiraan.

Dalam algoritma Shor, kita menggunakan QPE pada operator unitary MaM_a:

MaโˆฃyโŸฉโ‰กโˆฃaymodโ€‰โ€‰NโŸฉ. M_a|y\rangle \equiv |ay \mod N \rangle .

Di sini, โˆฃyโŸฉ|y\rangle menunjukkan computational basis state dari register multi-Qubit, di mana nilai biner dari Qubit-Qubit tersebut sesuai dengan bilangan bulat yy. Misalnya, jika N=15N=15 dan y=2y = 2, maka โˆฃyโŸฉ|y\rangle direpresentasikan oleh basis state empat-Qubit โˆฃ0010โŸฉ|0010\rangle, karena empat Qubit diperlukan untuk mengkodekan bilangan hingga 15. (Jika konsep ini belum familiar, lihat modul pengantar Qiskit in classrooms untuk penyegaran tentang pengkodean biner status kuantum.)

Sekarang, kita perlu mencari tahu eigenstate dari unitary ini. Jika kita mulai dalam keadaan โˆฃ1โŸฉ|1\rangle, kita bisa melihat bahwa setiap penerapan UU yang berturutan akan mengalikan keadaan register kita dengan a(modN)a \pmod N, dan setelah rr penerapan kita akan tiba di keadaan โˆฃ1โŸฉ|1\rangle lagi. Misalnya dengan a=3a = 3 dan N=35N = 35:

M3โˆฃ1โŸฉ=โˆฃ3โŸฉM32โˆฃ1โŸฉ=โˆฃ9โŸฉM33โˆฃ1โŸฉ=โˆฃ27โŸฉโ‹ฎM3(rโˆ’1)โˆฃ1โŸฉ=โˆฃ12โŸฉM3rโˆฃ1โŸฉ=โˆฃ1โŸฉ\begin{aligned} M_3|1\rangle &= |3\rangle & \\ M_3^2|1\rangle &= |9\rangle \\ M_3^3|1\rangle &= |27\rangle \\ & \vdots \\ M_3^{(r-1)}|1\rangle &= |12\rangle \\ M_3^r|1\rangle &= |1\rangle \end{aligned}

Jadi superposisi dari keadaan dalam siklus ini (โˆฃฯˆjโŸฉ|\psi_j\rangle) berbentuk:

โˆฃฯˆjโŸฉ=1rโˆ‘k=0rโˆ’1e2ฯ€ijkrโˆฃakโŸฉ|\psi_j\rangle = \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{\frac{2 \pi i j k}{r}} |a^k \rangle}

semuanya adalah eigenstate dari MaM_a. (Ada lebih banyak eigenstate selain ini. Tapi kita hanya peduli dengan yang berbentuk di atas.)

Cek pemahamanโ€‹

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Temukan eigenstate dari unitary yang sesuai dengan a=2a=2 dan N=15N = 15.

Jawaban:

M2โˆฃ1โŸฉ=โˆฃ2โŸฉM22โˆฃ1โŸฉ=โˆฃ4โŸฉM23โˆฃ1โŸฉ=โˆฃ8โŸฉM24โˆฃ1โŸฉ=โˆฃ1โŸฉ\begin{aligned} M_2|1\rangle &= |2\rangle & \\ M_2^2|1\rangle &= |4\rangle \\ M_2^3|1\rangle &= |8\rangle \\ M_2^4|1\rangle &= |1\rangle \\ \end{aligned}

Jadi, orde r=4r=4. Eigenstate yang kita minati akan berupa superposisi merata dari semua keadaan yang telah disiklus di atas, dengan berbagai fase:

โˆฃฯˆ0โŸฉ=12(โˆฃ1โŸฉ+โˆฃ2โŸฉ+โˆฃ4โŸฉ+โˆฃ8โŸฉ)โˆฃฯˆ1โŸฉ=12(e2ฯ€i04โˆฃ1โŸฉ+e2ฯ€i14โˆฃ2โŸฉ+e2ฯ€i24โˆฃ4โŸฉ+e2ฯ€i34โˆฃ8โŸฉ)=12(โˆฃ1โŸฉ+iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉโˆ’iโˆฃ8โŸฉ)โˆฃฯˆ2โŸฉ=12(e2ฯ€i04โˆฃ1โŸฉ+e2ฯ€i24โˆฃ2โŸฉ+e2ฯ€i44โˆฃ4โŸฉ+e2ฯ€i64โˆฃ8โŸฉ)=12(โˆฃ1โŸฉโˆ’โˆฃ2โŸฉ+โˆฃ4โŸฉโˆ’โˆฃ8โŸฉ)โˆฃฯˆ3โŸฉ=12(e2ฯ€i04โˆฃ1โŸฉ+e2ฯ€i34โˆฃ2โŸฉ+e2ฯ€i64โˆฃ4โŸฉ+e2ฯ€i94โˆฃ8โŸฉ)=12(โˆฃ1โŸฉโˆ’iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉ+iโˆฃ8โŸฉ)\begin{aligned} |\psi_0\rangle &= \frac{1}{2}(|1\rangle+|2\rangle+|4\rangle+|8\rangle) \\ |\psi_1\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{1}{4}}|2\rangle+e^{2 \pi i \frac{2}{4}}|4\rangle+e^{2 \pi i \frac{3}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle+i|2\rangle-|4\rangle-i|8\rangle) \\ |\psi_2\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{2}{4}}|2\rangle+e^{2 \pi i \frac{4}{4}}|4\rangle+e^{2 \pi i \frac{6}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle-|2\rangle+|4\rangle-|8\rangle) \\ |\psi_3\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{3}{4}}|2\rangle+e^{2 \pi i \frac{6}{4}}|4\rangle+e^{2 \pi i \frac{9}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ \end{aligned}

Katakanlah kita bisa menginisialisasi keadaan Qubit kita ke salah satu eigenstate ini (spoiler โ€” kita tidak bisa. Atau, setidaknya tidak mudah. Kita akan menjelaskan alasannya dan apa yang bisa kita lakukan sebagai gantinya sebentar lagi). Kemudian kita bisa menggunakan QPE untuk memperkirakan nilai eigen yang sesuai, ฯ‰j=e2ฯ€iฮธj\omega_j = e^{2 \pi i \theta_j} di mana ฮธj=jr\theta_j = \frac{j}{r}. Kemudian, kita akan bisa menentukan orde rr dengan persamaan sederhana:

r=jฮธj.r = \frac{j}{\theta_j}.

Tapi ingat, aku bilang bahwa QPE memperkirakan ฮธj\theta_j โ€” itu tidak memberi kita nilai yang tepat. Kita perlu perkiraan yang cukup baik untuk membedakan antara rr dan r+1r+1. Semakin banyak Qubit kontrol mm yang kita miliki, semakin baik perkiraannya. Dalam soal-soal di akhir pelajaran, kamu akan diminta untuk menentukan mm minimum yang diperlukan untuk memfaktorkan suatu bilangan NN.

Sekarang, kita harus menyelesaikan sebuah masalah. Semua penjelasan di atas tentang cara menemukan rr dimulai dengan menyiapkan eigenstate โˆฃฯˆjโŸฉ=1rโˆ‘k=0rโˆ’1e2ฯ€ijkrโˆฃakโŸฉ|\psi_j\rangle = \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{\frac{2 \pi i j k}{r}} |a^k \rangle}. Tapi kita tidak tahu cara melakukannya tanpa sudah mengetahui rr. Logikanya melingkar. Kita membutuhkan cara untuk memperkirakan nilai eigen tanpa menginisialisasi eigenstate.

Alih-alih memulai dengan eigenstate dari MaM_a, kita bisa menyiapkan keadaan awal ke keadaan nn-Qubit yang sesuai dengan โˆฃ1โŸฉ|1\rangle dalam biner (yaitu, โˆฃ000...01โŸฉ|000...01\rangle). Meskipun keadaan ini jelas bukan eigenstate dari MaM_a, ini adalah superposisi atas semua eigenstate โˆฃฯˆkโŸฉ|\psi_k\rangle:

โˆฃ1โŸฉ=1rโˆ‘k=0rโˆ’1โˆฃฯˆkโŸฉ|1\rangle = \frac{1}{\sqrt{r}} \sum\limits_{k=0}^{r-1}{|\psi_k\rangle}

Cek pemahamanโ€‹

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Verifikasi bahwa โˆฃ1โŸฉ|1\rangle setara dengan superposisi atas eigenstate yang kamu temukan untuk N=15N=15 dan a=2a=2 dalam pertanyaan cek sebelumnya.

Jawaban:

Empat eigenstate tersebut adalah:

โˆฃฯˆ0โŸฉ=12(โˆฃ1โŸฉ+โˆฃ2โŸฉ+โˆฃ4โŸฉ+โˆฃ8โŸฉ)โˆฃฯˆ1โŸฉ=12(โˆฃ1โŸฉ+iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉโˆ’iโˆฃ8โŸฉ)โˆฃฯˆ2โŸฉ=12(โˆฃ1โŸฉโˆ’โˆฃ2โŸฉ+โˆฃ4โŸฉโˆ’โˆฃ8โŸฉ)โˆฃฯˆ3โŸฉ=12(โˆฃ1โŸฉโˆ’iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉ+iโˆฃ8โŸฉ)\begin{aligned} |\psi_0\rangle &= \frac{1}{2}(|1\rangle+|2\rangle+|4\rangle+|8\rangle) \\ |\psi_1\rangle &= \frac{1}{2}(|1\rangle+i|2\rangle-|4\rangle-i|8\rangle) \\ |\psi_2\rangle &= \frac{1}{2}(|1\rangle-|2\rangle+|4\rangle-|8\rangle) \\ |\psi_3\rangle &= \frac{1}{2}(|1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ \end{aligned}

Jadi,

1rโˆ‘k=0rโˆ’1โˆฃฯˆkโŸฉ=12(โˆฃฯˆ0โŸฉ+โˆฃฯˆ1โŸฉ+โˆฃฯˆ2โŸฉ+โˆฃฯˆ3โŸฉ)=14(โˆฃ1โŸฉ+โˆฃ2โŸฉ+โˆฃ4โŸฉ+โˆฃ8โŸฉ+โˆฃ1โŸฉ+iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉโˆ’iโˆฃ8โŸฉ+โˆฃ1โŸฉโˆ’โˆฃ2โŸฉ+โˆฃ4โŸฉโˆ’โˆฃ8โŸฉ+โˆฃ1โŸฉโˆ’iโˆฃ2โŸฉโˆ’โˆฃ4โŸฉ+iโˆฃ8โŸฉ)=14(4โˆฃ1โŸฉ)=โˆฃ1โŸฉ\begin{aligned} \frac{1}{\sqrt{r}} \sum\limits_{k=0}^{r-1}{|\psi_k\rangle} &= \frac{1}{2}(|\psi_0\rangle + |\psi_1\rangle + |\psi_2\rangle + |\psi_3\rangle ) \\ &= \frac{1}{4}(|1\rangle+|2\rangle+|4\rangle+|8\rangle+|1\rangle+i|2\rangle-|4\rangle-i|8\rangle+|1\rangle-|2\rangle+|4\rangle-|8\rangle + |1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ &= \frac{1}{4}(4|1\rangle) = |1\rangle \end{aligned}

Bagaimana ini memungkinkan kita menemukan orde rr? Karena keadaan awal adalah superposisi atas semua eigenstate dari bentuk yang tercantum di atas, maka algoritma QPE secara bersamaan memperkirakan masing-masing ฮธk\theta_k yang sesuai dengan eigenstate-eigenstate ini. Jadi, pengukuran dari mm Qubit kontrol di akhir akan menghasilkan pendekatan nilai k/rk/r di mana kโˆˆ{0,1,2,...,rโˆ’1}k \in \{0,1,2,...,r-1\} adalah salah satu nilai eigen yang dipilih secara acak. Jika kita mengulangi Circuit ini beberapa kali dan mendapatkan beberapa sampel dengan nilai kk yang berbeda, kita akan segera bisa menentukan rr.

Implementasi di Qiskitโ€‹

Seperti yang kita sebutkan sebelumnya, hardware kita belum sampai pada titik di mana kita bisa memfaktorkan bilangan besar seperti RSA1024. Kita hanya akan memfaktorkan bilangan kecil untuk mendemonstrasikan cara kerja algoritma ini. Untuk demo ini, kita akan menggunakan versi yang disederhanakan dari kode yang disajikan dalam tutorial algoritma Shor. Jika kamu ingin lebih banyak detail, silakan kunjungi tutorial tersebut.

Kita akan menjalankan algoritma menggunakan framework standar kita untuk memecahkan masalah kuantum, yang disebut framework Qiskit patterns. Ini terdiri dari empat langkah:

  1. Pemetaan masalahmu ke Circuit kuantum
  2. Optimalkan Circuit untuk dijalankan di hardware kuantum
  3. Jalankan Circuit-mu di komputer kuantum
  4. Pasca-proses pengukuran

1. Petaโ€‹

Mari kita faktorkan N=15N=15, memilih a=2a=2 sebagai bilangan bulat ko-prima kita.

Pertama, kita perlu membangun Circuit yang akan mengimplementasikan unitary perkalian modular, MaM_a. Ini sebenarnya bagian yang paling rumit dari seluruh implementasi, dan bisa sangat mahal secara komputasi, tergantung cara melakukannya. Untuk ini, kita akan sedikit curang: Kita tahu bahwa kita mulai dalam keadaan โˆฃ1โŸฉ|1\rangle, dan dari pertanyaan cek sebelumnya,

M2โˆฃ1โŸฉ=โˆฃ2โŸฉM2โˆฃ2โŸฉ=โˆฃ4โŸฉM2โˆฃ4โŸฉ=โˆฃ8โŸฉM2โˆฃ8โŸฉ=โˆฃ1โŸฉ\begin{aligned} M_2|1\rangle &= |2\rangle & \\ M_2|2\rangle &= |4\rangle \\ M_2|4\rangle &= |8\rangle \\ M_2|8\rangle &= |1\rangle \\ \end{aligned}

Jadi, kita akan membangun unitary yang melakukan operasi yang benar pada empat keadaan ini, tapi membiarkan semua keadaan lain apa adanya. Ini curang karena kita menggunakan pengetahuan kita tentang orde 2โ€Šmodโ€Š152\bmod 15 untuk menyederhanakan unitary. Jika kita benar-benar mencoba memfaktorkan suatu bilangan yang faktor-faktornya tidak diketahui oleh kita, kita tidak akan bisa melakukan ini.

Cek pemahamanmuโ€‹

Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Dengan pengetahuanmu tentang bagaimana operator M2M_2 mentransformasi state-state di atas, bangun operator tersebut dari serangkaian gate SWAP, yang menukar state dua qubit. (Petunjuk: menulis setiap state โˆฃiโŸฉ|i\rangle dalam biner akan membantu.)

Jawaban:

Mari kita tulis ulang aksi M2M_2 pada state-state dalam biner:

M2โˆฃ0001โŸฉ=โˆฃ0010โŸฉM2โˆฃ0010โŸฉ=โˆฃ0100โŸฉM2โˆฃ0100โŸฉ=โˆฃ1000โŸฉM2โˆฃ1000โŸฉ=โˆฃ0001โŸฉ\begin{aligned} M_2|0001\rangle &= |0010\rangle \\ M_2|0010\rangle &= |0100\rangle \\ M_2|0100\rangle &= |1000\rangle \\ M_2|1000\rangle &= |0001\rangle \\ \end{aligned}

Setiap aksi ini bisa dicapai dengan SWAP sederhana. M2โˆฃ0001โŸฉM_2|0001\rangle dicapai dengan menukar state Qubit 00 dan 11. M2โˆฃ0010โŸฉM_2|0010\rangle dicapai dengan menukar state Qubit 11 dan 22. Dan seterusnya. Jadi, kita bisa mengurai matriks M2M_2 menjadi serangkaian gate SWAP berikut:

M2=SWAP(0,1)SWAP(1,2)SWAP(2,3)M_2 = SWAP(0,1)SWAP(1,2)SWAP(2,3)

Ingat bahwa operator bekerja dari kanan ke kiri, mari kita periksa bahwa ini memiliki efek yang kita inginkan pada setiap state:

M2โˆฃ0001โŸฉ=SWAP(0,1)SWAP(1,2)SWAP(2,3)โˆฃ0001โŸฉ=SWAP(0,1)SWAP(1,2)โˆฃ0001โŸฉ=SWAP(0,1)โˆฃ0001โŸฉ=โˆฃ0010โŸฉโœ“M2โˆฃ0010โŸฉ=SWAP(0,1)SWAP(1,2)SWAP(2,3)โˆฃ0010โŸฉ=SWAP(0,1)SWAP(1,2)โˆฃ0010โŸฉ=SWAP(0,1)โˆฃ0100โŸฉ=โˆฃ0100โŸฉโœ“M2โˆฃ0100โŸฉ=SWAP(0,1)SWAP(1,2)SWAP(2,3)โˆฃ0100โŸฉ=SWAP(0,1)SWAP(1,2)โˆฃ1000โŸฉ=SWAP(0,1)โˆฃ1000โŸฉ=โˆฃ1000โŸฉโœ“M2โˆฃ1000โŸฉ=SWAP(0,1)SWAP(1,2)SWAP(2,3)โˆฃ1000โŸฉ=SWAP(0,1)SWAP(1,2)โˆฃ0100โŸฉ=SWAP(0,1)โˆฃ0010โŸฉ=โˆฃ0001โŸฉโœ“\begin{aligned} M_2|0001\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0001\rangle \\ &= SWAP(0,1)SWAP(1,2)|0001\rangle \\ &= SWAP(0,1)|0001\rangle \\ &=|0010\rangle \checkmark \\ M_2|0010\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0010\rangle \\ &= SWAP(0,1)SWAP(1,2)|0010\rangle \\ &= SWAP(0,1)|0100\rangle \\ &=|0100\rangle \checkmark \\ M_2|0100\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0100\rangle \\ &= SWAP(0,1)SWAP(1,2)|1000\rangle \\ &= SWAP(0,1)|1000\rangle \\ &=|1000\rangle \checkmark \\ M_2|1000\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|1000\rangle \\ &= SWAP(0,1)SWAP(1,2)|0100\rangle \\ &= SWAP(0,1)|0010\rangle \\ &=|0001\rangle \checkmark \\ \end{aligned}

Sekarang kita bisa membuat kode Circuit yang setara dengan operator ini di Qiskit.

Pertama, kita impor paket-paket 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 M2M_2:

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)

Output of the previous code cell

Algoritma QPE menggunakan gate controlled-UU. Jadi, sekarang kita punya Circuit M2M_2, kita perlu membuatnya menjadi Circuit controlled-M2M_2:

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)

Output of the previous code cell

Sekarang kita punya gate controlled-UU. Tapi untuk menjalankan algoritma Quantum Phase Estimation, kita perlu controlled-U2U^2, controlled-U4U^4, hingga controlled-U2mโˆ’1U^{2^{m-1}}, di mana mm adalah jumlah Qubit yang digunakan untuk memperkirakan fase. Semakin banyak Qubit, semakin presisi estimasi fase. Kita akan menggunakan m=8m=8 Qubit kontrol untuk prosedur estimasi fase kita. Jadi, kita perlu:

Ma2kโˆฃyโŸฉโ‰กโˆฃa2kyโ€Šmodโ€ŠNโŸฉM_{a^{2^k}}|y\rangle \equiv |a^{2^k} y \bmod N \rangle

di mana indeks kk, dengan 0โ‰คkโ‰คmโˆ’1=70 \le k \le m-1 = 7, bersesuaian dengan Qubit kontrol. Sekarang mari kita hitung a2kโ€Šmodโ€ŠNa^{2^k}\bmod N untuk setiap nilai kk:

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]

Karena a2kโ€Šmodโ€ŠN=1a^{2^k} \bmod N = 1 untuk kโ‰ฅ2k \ge 2, semua operator yang bersesuaian (M8M_8 ke atas) ekuivalen dengan identitas. Jadi, kita hanya perlu membuat satu matriks lagi, M4.M_4.

Catatan: Penyederhanaan ini hanya berlaku di sini karena orde 2โ€Šmodโ€Š152 \bmod 15 adalah 44. Begitu k=2k=2 (sehingga 2k=42^k = 4), setiap pangkat operator berikutnya adalah identitas. Secara umum, untuk bilangan NN yang lebih besar atau pilihan aa yang berbeda, kamu tidak bisa melewati konstruksi pangkat-pangkat yang lebih tinggi. Inilah salah satu alasan mengapa ini dianggap sebagai contoh mainan: angka-angka kecil memungkinkan jalan pintas yang tidak akan berhasil untuk kasus 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)

Output of the previous code cell

Dan seperti sebelumnya, kita membuatnya menjadi operator controlled-M4M_4:

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)

Output of the previous code cell

Sekarang, kita bisa menyatukan semuanya untuk menemukan orde 2โ€Šmodโ€Š152\bmod 15 dengan Circuit kuantum, menggunakan estimasi fase:

# 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)

Output of the previous code cell

2. Optimizeโ€‹

Sekarang kita sudah memetakan Circuit kita, langkah berikutnya adalah mengoptimalkannya untuk dijalankan pada komputer kuantum tertentu. Pertama kita perlu memuat Backend.

service = QiskitRuntimeService()

backend = service.backend("ibm_marrakesh")

Jika kamu tidak punya waktu yang tersedia di akunmu atau ingin menggunakan simulator karena alasan apapun, kamu bisa menjalankan sel di bawah ini untuk menyiapkan simulator yang akan meniru perangkat 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})

Output of the previous code cell

3. Executeโ€‹

# 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))

Output of the previous code cell

Kita melihat empat puncak yang jelas di 00000000, 01000000, 10000000, dan 11000000, dengan beberapa hitungan pada bitstring lain akibat noise di komputer kuantum. Kita akan mengabaikan ini dan hanya menyimpan empat yang dominan dengan menerapkan ambang batas: hanya hitungan di atas ambang batas ini yang dianggap sebagai sinyal nyata di atas noise.

# 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. Post-processโ€‹

Untuk algoritma Shor, sebagian besar algoritma dijalankan secara klasik. Jadi, kita akan menempatkan sisanya di langkah "post-processing", setelah kita mendapatkan pengukuran dari komputer kuantum. Setiap pengukuran di atas dapat dikonversi menjadi bilangan bulat, yang, setelah dibagi dengan 2m2^m, adalah perkiraan kita untuk kr\frac{k}{r}, di mana kk adalah acak 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 mempelajari modul ini, kamu mungkin merasa kagum dengan kecerdasan Peter Shor yang menemukan algoritma yang begitu cerdik. Tapi semoga kamu juga telah mencapai pemahaman baru tentang kesederhanaannya yang menipu. Meskipun algoritma ini mungkin tampak sangat (atau mengintimidasi) kompleks, jika kamu uraikan menjadi setiap langkah logika dan menelusurinya perlahan, kamu pun akan bisa menjalankan algoritma Shor.

Meskipun kita masih jauh dari menggunakan algoritma ini untuk memfaktorkan angka seperti RSA1024, komputer kuantum kita terus berkembang setiap hari, dan begitu ambang batas yang disebut toleransi kesalahan tercapai, algoritma-algoritma seperti inilah yang akan segera menyusul. Ini adalah waktu yang menarik untuk belajar tentang komputasi kuantum!

Soal-soalโ€‹

Konsep kritis:โ€‹

  • Sistem kriptografi modern mengandalkan sulitnya pemfaktoran bilangan bulat besar secara klasik.
  • Aritmetika modular โ€” termasuk struktur ZN\mathbb{Z}_N dan ZNโˆ—\mathbb{Z}_N^* โ€” memberikan fondasi matematis untuk algoritma Shor.
  • Masalah pemfaktoran bilangan bulat NN bisa direduksi menjadi masalah menemukan orde suatu bilangan modulo NN.
  • Pencarian orde kuantum menggunakan teknik estimasi fase kuantum untuk menentukan periode fungsi axmodโ€‰โ€‰Na^x \mod N.
  • Algoritma Shor terdiri dari alur kerja hibrida klasikโ€“kuantum yang memilih basis, melakukan pencarian orde kuantum, kemudian secara klasik menghitung faktor-faktor dari hasilnya.

Benar/Salah:โ€‹

  1. B/S Efisiensi algoritma Shor mengancam keamanan enkripsi RSA.
  2. B/S Algoritma Shor bisa dijalankan secara efisien pada komputer kuantum modern manapun.
  3. B/S Algoritma Shor menggunakan estimasi fase kuantum (QPE) sebagai subrutin kunci.
  4. B/S Bagian klasik dari algoritma Shor melibatkan perhitungan faktor persekutuan terbesar (FPB).
  5. B/S Algoritma Shor hanya bekerja untuk memfaktorkan bilangan genap.
  6. B/S Satu kali menjalankan algoritma Shor dengan sukses selalu menjamin faktor yang benar.

Jawaban singkat:โ€‹

  1. Mengapa algoritma Shor dianggap sebagai ancaman masa depan yang potensial terhadap enkripsi RSA?
  2. Mengapa menemukan periode, atau orde, dari fungsi eksponensial modular membantu pemfaktoran bilangan dalam algoritma Shor?

Soal tantangan:โ€‹

  1. Berapa banyak Qubit kontrol mm yang kita butuhkan untuk bilangan NN yang ingin kita faktorkan guna memperoleh presisi dalam QPE yang diperlukan untuk menemukan nilai orde rr yang benar?

  2. Mengikuti prosedur yang kita uraikan di sini untuk memfaktorkan 15, sekarang coba faktorkan 21.

Source: IBM Quantum docs โ€” updated 17 Apr 2026
English version on doQumentation โ€” updated 7 Mei 2026
This translation based on the English version of approx. 27 Mar 2026