Transformasi Fourier Kuantum
Untuk modul Qiskit in Classrooms ini, mahasiswa harus memiliki lingkungan Python yang berjalan dengan paket-paket berikut terinstal:
qiskitv2.1.0 atau lebih baruqiskit-ibm-runtimev0.40.1 atau lebih baruqiskit-aerv0.17.0 atau lebih baruqiskit.visualizationnumpypylatexenc
Untuk menyiapkan dan menginstal paket-paket di atas, lihat panduan Install Qiskit. Agar bisa menjalankan job di komputer kuantum nyata, mahasiswa perlu membuat akun di IBM Quantum® dengan mengikuti langkah-langkah di panduan Set up your IBM Cloud account.
Modul ini telah diuji dan menggunakan 13 detik waktu QPU. Ini adalah estimasi dengan itikad baik; penggunaan aktualmu mungkin berbeda.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer 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'
Pendahuluan
Transformasi Fourier adalah alat yang sangat umum digunakan dalam matematika, fisika, pemrosesan sinyal, kompresi data, dan banyak bidang lainnya. Versi kuantum dari transformasi Fourier, yang tepat dinamai transformasi Fourier kuantum, menjadi dasar dari beberapa algoritma kuantum yang paling penting.
Hari ini, setelah mengingat kembali transformasi Fourier klasik, kita akan membahas cara mengimplementasikan transformasi Fourier kuantum di komputer kuantum. Kemudian, kita akan mendiskusikan salah satu aplikasi transformasi Fourier kuantum pada algoritma yang disebut algoritma estimasi fase. Estimasi fase kuantum adalah subrutin dalam algoritma faktorisasi terkenal milik Shor, yang terkadang disebut sebagai "mahkota permata" komputasi kuantum. Modul ini mengarah ke modul lain yang membahas algoritma Shor secara mendalam, tapi juga dirancang untuk bisa berdiri sendiri. Transformasi Fourier kuantum adalah algoritma yang menarik dan berguna dengan sendirinya!
Transformasi Fourier klasik
Sebelum kita masuk ke transformasi Fourier kuantum, mari kita ingat dulu versi klasiknya. Transformasi Fourier adalah metode untuk berpindah dari satu "basis" ke basis lainnya. Kamu bisa menganggap dua basis sebagai perspektif berbeda dari masalah yang sama — keduanya adalah cara yang valid untuk mengekspresikan sebuah fungsi, tapi salah satunya mungkin lebih informatif, tergantung pada masalah yang dihadapi. Beberapa contoh pasangan basis yang dihubungkan oleh transformasi Fourier adalah posisi dan momentum, serta waktu dan frekuensi.
Mari kita lihat contoh bagaimana transformasi Fourier bisa membantu kita mengetahui nada apa yang dimainkan sebuah instrumen berdasarkan bentuk gelombang audionya. Biasanya, kita melihat bentuk gelombang yang direpresentasikan dalam basis waktu — yaitu, amplitudo gelombang diekspresikan sebagai fungsi dari waktu.

Kita bisa melakukan transformasi Fourier pada bentuk gelombang ini untuk berpindah dari basis waktu ke basis frekuensi:

Dalam basis frekuensi, kita bisa dengan mudah melihat puncak yang jelas sekitar 260 Hz. Itu adalah C tengah!
Sekarang, mungkin kamu bisa menentukan bahwa nada C tengah sedang dimainkan tanpa menggunakan transformasi Fourier, tapi bagaimana jika beberapa nada dimainkan sekaligus? Maka bentuk gelombangnya menjadi lebih rumit ketika kita memplotnya dalam basis waktu:

Tapi spektrum frekuensi dengan jelas mengidentifikasi tiga puncak:

Ini adalah akord C-mayor, memainkan nada C, E, dan G.
Analisis Fourier semacam ini bisa membantu kita mengekstrak komponen frekuensi dari sinyal yang rumit sekalipun.
Transformasi Fourier diskrit
Transformasi Fourier berguna untuk berbagai aplikasi pemrosesan sinyal. Tapi dalam sebagian besar aplikasi dunia nyata ini (termasuk contoh musik yang kita gunakan di atas), kita ingin mentransformasi sekumpulan diskrit dari titik data — bukan fungsi kontinu. Dalam hal ini, kita menggunakan transformasi Fourier diskrit. Transformasi Fourier diskrit (DFT) bekerja pada vektor dan memetakannya ke vektor menurut rumus:
di mana kita ambil . (Perhatikan bahwa ada konvensi lain yang memiliki tanda minus dalam eksponensial, jadi hati-hati ketika kamu menemukan DFT di tempat lain.) Ingat bahwa adalah fungsi periodik, dengan periode . Jadi, dengan mengalikan fungsi ini, transformasi Fourier pada dasarnya adalah cara untuk memecah fungsi (diskrit) menjadi kombinasi linier dari fungsi-fungsi periodik penyusunnya, masing-masing dengan periode .
Transformasi Fourier kuantum
Jadi sekarang, kita telah melihat bagaimana transformasi Fourier digunakan untuk merepresentasikan sebuah fungsi sebagai kombinasi linier dari sekumpulan "fungsi basis" baru. Transformasi basis juga secara rutin dilakukan pada keadaan qubit. Misalnya, keadaan sebuah qubit tunggal bisa diekspresikan dalam basis komputasi , dengan keadaan basis dan , atau dalam basis yaitu dengan keadaan basis dan . Keduanya sama-sama valid, tapi salah satunya mungkin lebih alami dari yang lain, tergantung jenis masalah yang coba kamu selesaikan.
Keadaan qubit juga bisa diekspresikan dalam basis Fourier di mana sebuah keadaan diekspresikan dalam bentuk kombinasi linier dari keadaan basis Fourier , bukan keadaan basis komputasi biasa . Untuk melakukan ini, kamu perlu menerapkan transformasi Fourier kuantum (QFT):
dengan seperti di atas, dan adalah jumlah keadaan basis dalam sistem kuantummu. Perhatikan bahwa, karena kita sekarang bekerja dengan qubit, qubit memberikan keadaan basis, sehingga . Di sini, keadaan basis ditulis sebagai satu angka di mana berkisar dari hingga , tapi kamu mungkin lebih sering melihat keadaan basis diekspresikan sebagai , , , ..., , di mana setiap digit biner merepresentasikan keadaan qubit 0 hingga , dari kanan ke kiri. Ada cara mudah untuk mengkonversi keadaan biner ini menjadi satu angka: cukup perlakukan mereka seperti bilangan biner! Jadi, , , , , dan seterusnya, sampai .
Bangun intuisi untuk keadaan basis Fourier
Jadi, kita baru saja membahas apa itu keadaan basis komputasi dan bagaimana urutan mereka: keadaan-keadaan itu adalah sekumpulan keadaan di mana setiap qubit berada dalam atau , dan kita mengurutkan mereka dari keadaan di mana semua qubit adalah , , ke keadaan di mana semuanya adalah , .
Tapi bagaimana kita bisa memahami keadaan basis Fourier? Semua keadaan basis Fourier adalah superposisi yang setara dari semua keadaan basis komputasi, tapi setiap keadaan berbeda satu sama lain dalam periodisitas fase komponennya. Untuk memahami ini lebih konkret, mari kita lihat empat keadaan basis Fourier dari sistem dua qubit. Keadaan Fourier terendah adalah keadaan yang fasenya tidak bervariasi sama sekali:
Kita bisa memvisualisasikan keadaan ini dengan memplot amplitudo kompleks dari masing-masing suku. Garis merah memandu mata untuk menunjukkan bagaimana fase amplitudo ini berputar mengelilingi bidang kompleks sebagai fungsi dari keadaan basis komputasi. Untuk , fasenya tetap konstan:

Keadaan basis Fourier berikutnya adalah keadaan yang fase komponennya berputar dari hingga tepat satu kali:
Dan kita bisa melihat putaran ini dalam plot amplitudo kompleks versus keadaan basis komputasi:

Jadi, setiap keadaan memiliki fase yang radian lebih tinggi dari keadaan sebelumnya ketika diurutkan dengan cara standar, karena dalam contoh ini kita memiliki empat keadaan basis (). Keadaan basis berikutnya berputar dari 0 hingga dua kali:

Terakhir, komponen Fourier tertinggi adalah yang memiliki variasi fase tercepat. Untuk contoh kita dengan dua qubit, itu adalah keadaan yang fasenya berputar dari 0 hingga tiga kali:

Secara umum, untuk keadaan qubit, akan ada keadaan basis Fourier, yang frekuensi variasi fasenya berkisar dari konstan, untuk , hingga bervariasi cepat untuk , menyelesaikan putaran mengelilingi di atas superposisi keadaan. Jadi, ketika kita mengambil QFT dari sebuah keadaan kuantum, kita pada dasarnya melakukan analisis dasar yang sama yang kita lakukan untuk gelombang musik di bagian Pendahuluan. Kita menentukan komponen frekuensi Fourier yang berkontribusi dalam menciptakan keadaan kuantum yang menarik.
Coba beberapa contoh QFT
Mari kita terus membangun intuisi untuk transformasi Fourier kuantum dengan membuat sebuah keadaan dalam basis komputasi, lalu melihat apa yang terjadi ketika kita menerapkan QFT padanya. Untuk saat ini, kita akan memperlakukan QFT sebagai kotak hitam yang kita terapkan menggunakan QFTGate dari pustaka Circuit Qiskit. Nanti, kita akan mengintip ke dalamnya untuk melihat bagaimana ia diimplementasikan.
Kita mulai dengan memuat paket yang diperlukan dan memilih perangkat untuk menjalankan Circuit kita:
import numpy as np
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.circuit.library import QFTGate
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
service = QiskitRuntimeService()
# Use the least busy backend
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.backend("ibm_pinguino2")
print(backend.name)
ibm_pinguino2
Jika kamu tidak memiliki 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:
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
from qiskit.providers.fake_provider import GenericBackendV2
backend_gen = GenericBackendV2(num_qubits=18)
sampler_gen = BackendSamplerV2(backend=backend_gen)
Keadaan basis komputasi tunggal
Pertama, mari kita coba mentransformasi sebuah keadaan basis komputasi tunggal. Kita mulai dengan membuat keadaan komputasi acak:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# flip state of random qubits to put in a random single computational basis state
for i in range(1, qubits):
if np.random.randint(0, 2):
qc.x(i)
# make a copy of the above circuit. (to be used when we apply the QFT in next part)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
Sekarang, mari kita lakukan transformasi Fourier pada keadaan ini dengan QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
Seperti yang kamu lihat, kita mengukur populasi dari setiap keadaan menjadi lebih kurang sama, dengan mempertimbangkan beberapa noise eksperimental dan statistik. Jadi, jika kamu mengambil QFT dari sebuah keadaan basis komputasi tunggal, hasilnya adalah superposisi yang setara dari semua keadaan. Jika kamu familiar dengan transformasi Fourier, ini mungkin tidak mengejutkanmu. Satu prinsip dasar yang bisa membantu kita membangun koneksi intuitif antara sebuah fungsi dan transformasi Fouriernya adalah bahwa lebar sebuah fungsi berbanding terbalik dengan lebar transformasi Fouriernya. Jadi, sesuatu yang sangat terlokalisasi dalam waktu, misalnya, seperti pulsa yang sangat pendek, akan memerlukan rentang frekuensi yang luas untuk menghasilkan pulsa itu. Sinyal itu akan sangat lebar dalam ruang Fourier.
Fakta ini sebenarnya berkaitan dengan ketidakpastian kuantum! Prinsip ketidakpastian Heisenberg biasanya dinyatakan sebagai . Jadi jika ketidakpastian dalam () kecil, ketidakpastian dalam momentum () harus besar, dan sebaliknya. Ternyata, berpindah dari basis posisi ke basis momentum dilakukan melalui transformasi Fourier.
Catatan: Ingatlah, kita mengukur populasi dalam setiap keadaan basis, jadi kita kehilangan informasi tentang fase relatif antara berbagai bagian superposisi. Jadi, meskipun QFT dari setiap keadaan basis komputasi tunggal akan menghasilkan sebaran yang sama merata dalam populasi di semua keadaan basis, fase-nya belum tentu sama.
Dua keadaan basis komputasi
Sekarang, mari kita lihat apa yang terjadi ketika kita menyiapkan superposisi dari keadaan basis komputasi. Menurutmu, seperti apa hasil transformasi Fourier dalam kasus ini?
Mari kita pilih superposisi:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# To make this state, we just need to apply a Hadamard to the last qubit
qc.h(qubits - 1)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# First, let's go through steps 2-4 for the first circuit, qc
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
Sekarang, mari kita lakukan transformasi Fourier pada keadaan ini dengan QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
Ini mungkin sedikit lebih mengejutkan. Terlihat bahwa QFT dari keadaan adalah superposisi dari semua keadaan basis genap. Tapi jika kita kembali ke visualisasi kita tentang setiap keadaan basis , dan bagaimana fase setiap komponen berputar mengelilingi sebanyak kali, maka alasan kita mendapatkan hasil ini mungkin menjadi jelas.
Uji pemahamanmu
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Menggunakan petunjuk di atas, jelaskan mengapa hasil yang kita dapatkan untuk QFT dari sudah diperkirakan.
Jawaban:
Keadaan awal memiliki fase relatif 0 (atau kelipatan bilangan bulat dari ) antara dua bagian superposisi. Jadi, kita tahu keadaan ini memiliki komponen Fourier yang fasenya juga cocok dengan cara itu: keadaan yang memiliki pergeseran fase 0 antara suku |0000> dan suku |1000>. Setiap keadaan basis Fourier tersusun dari suku-suku yang fasenya terakumulasi pada laju , artinya, ketika diurutkan dengan cara biasa, setiap suku dalam superposisi memiliki fase lebih besar dari suku sebelumnya. Jadi, pada titik tengah , kita ingin fase menjadi kelipatan bilangan bulat dari . Ini terjadi ketika genap.
Superposisi keadaan komputasi seperti apa yang akan berkorespondensi dengan QFT yang memiliki puncak pada setiap bilangan biner ganjil?
Jawaban:
Jika kamu mengambil QFT dari keadaan , maka kamu akan melihat puncak pada setiap keadaan bernomor biner ganjil.
Uraikan algoritma QFT
Sekarang setelah kita punya intuisi yang lebih baik tentang hubungan antara state qubit dalam basis komputasi dan basis Fourier, mari kita gali algoritma QFT itu sendiri. Dengan kata lain, gate apa saja yang sebenarnya kita implementasikan di komputer kuantum untuk mencapai transformasi ini?
Mari kita mulai dari yang kecil, dengan satu qubit saja. Jadi, kita punya dua state basis. QFT mengubah state basis komputasi dan menjadi state basis Fourier dan :
Cek pemahamanmu
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Gunakan persamaan QFT di bagian sebelumnya untuk memverifikasi dua state basis Fourier di atas.
Jawaban:
Formula QFT umum adalah:
Untuk satu qubit (), , dan . Jadi, kita punya
Perhatikan kedua persamaan itu. Mungkin kamu sudah tahu gate kuantum yang bisa digunakan untuk mengimplementasikan transformasi ini. Artinya, ada gate yang mengubah state basis komputasi dan menjadi state basis Fourier dan masing-masing. Itu adalah Hadamard gate! Ini menjadi lebih jelas kalau kita perkenalkan representasi matriks dari operasi QFT:
Kalau kamu belum familiar dengan notasi ini untuk mengekspresikan operator kuantum, tidak apa-apa! Ini adalah cara untuk merepresentasikan matriks , di mana dan mengindeks kolom dan baris matriks, dari sampai , dan adalah nilai entri tertentu tersebut. Jadi, entri di kolom ke-0 dan baris ke-2, misalnya, hanyalah .
Dalam representasi ini, setiap state basis komputasi dikaitkan dengan salah satu vektor basis:
Kalau kamu ingin mempelajari representasi ini lebih dalam, lihat pelajaran John Watrous tentang multiple systems di kursus Basics of quantum information.
Mari kita coba membuat matriks untuk QFT. Menggunakan formula di atas, kita temukan bahwa
\text\{QFT\}_4 = \frac\{1\}\{2\} \begin\{pmatrix\} 1 & 1 & 1 & 1 \\ 1 & i & -1 & -i \\ 1 & -1 & 1 & -1 \\ 1 & -i & -1 & i \\ \end\{pmatrix\}
Untuk mengimplementasikan matriks ini di komputer kuantum, kita perlu mencari tahu kombinasi gate apa yang diterapkan ke qubit mana yang akan menghasilkan transformasi uniter yang cocok dengan matriks di atas. Kita sudah tahu salah satu gate yang diperlukan: Hadamard. Gate lain yang kita butuhkan adalah controlled-phase gate, yang menerapkan fase relatif ke state qubit target, selama qubit kontrol berada dalam state . Dalam bentuk matriks ini terlihat seperti:
\text\{CP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & e^\{i\alpha\} \\ \end\{pmatrix\}
Karena hanya state yang berubah, sebenarnya tidak masalah qubit mana yang dianggap "kontrol" dan mana yang "target." Hasilnya akan sama dalam kedua kasus.
Terakhir, kita juga butuh beberapa SWAP gate. SWAP gate menukar state dua qubit. Bentuknya seperti ini:
\text\{SWAP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end\{pmatrix\}
Prosedur untuk membuat Circuit QFT pada qubit bersifat iteratif — kamu pertama-tama menerapkan QFT ke qubit hingga , lalu menambahkan beberapa gate antara qubit dan qubit lainnya. Tapi untuk menerapkan QFT, kamu pertama-tama perlu menerapkan QFT ke qubit 2 hingga , lalu menambahkan beberapa gate antara qubit 1 dan qubit yang tersisa hingga . Ini seperti boneka Rusia bersarang: setiap boneka menambahkan faktor dua dalam dimensi Circuit QFT, dengan boneka terkecil di tengah-tengah, yaitu QFT, atau Hadamard gate.
Untuk memasukkan satu boneka ke dalam boneka berikutnya yang lebih besar, sehingga meningkatkan dimensi QFT sebesar faktor dua, kamu selalu mengikuti prosedur yang sama:
- Pertama, terapkan QFT ke qubit paling bawah. Ini adalah "boneka kecil" dari set boneka Rusia bersarang yang akan segera kamu masukkan ke dalam boneka yang lebih besar.
- Gunakan qubit berikutnya di atas sebagai kontrol, dan terapkan controlled phase gate ke masing-masing dari qubit bawah, dengan fase ke state basis standar dari masing-masing qubit yang tersisa.
- Lakukan Hadamard pada qubit paling atas yang sama yang digunakan sebagai kontrol dalam phase gate.
- Gunakan SWAP gate untuk mengatur ulang urutan qubit sehingga bit paling tidak signifikan (atas) menjadi bit paling signifikan (bawah), dan semua yang lain bergeser ke atas satu langkah.
Kita sudah menggunakan fungsi QFTGate dari Qiskit circuit library, tapi sekarang mari kita lihat isi beberapa QFT gate ini untuk memverifikasi prosedur di atas. Kita bisa melakukan ini dengan decompose().
qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")
Jadi, semoga dari empat QFT pertama kamu mulai bisa melihat bagaimana masing-masing bersarang di dalam yang berikutnya yang lebih besar. Kamu mungkin menyadari, bahwa beberapa phase gate tidak persis seperti yang ditentukan dalam prosedur yang kita uraikan di atas, dan SWAP tidak muncul setelah setiap subrutin, melainkan hanya di akhir QFT penuh. Ini menghemat gate yang tidak perlu, yang akan membuat Circuit lebih lama dan lebih rentan terhadap kesalahan. Alih-alih mengimplementasikan SWAP setelah setiap boneka bersarang, Circuit melacak di mana setiap state qubit seharusnya berada dan menyesuaikan qubit yang diterapkan phase gate-nya sesuai dengan itu. Kemudian, sekumpulan SWAP terakhir di bagian akhir menempatkan semuanya di tempat yang tepat.
Terapkan QFT: Phase estimation
Mari kita lihat bagaimana QFT bisa digunakan untuk memecahkan masalah yang berguna dalam komputasi kuantum. Menghitung inverse quantum Fourier transform adalah langkah yang diperlukan dalam algoritma yang dikenal sebagai Quantum Phase Estimation (QPE), yang sendirinya merupakan subrutin dalam banyak algoritma lain, termasuk "mahkota permata" algoritma kuantum, algoritma faktorisasi Shor.
Tujuan QPE adalah memperkirakan nilai eigen dari operator uniter. Operator uniter ada di mana-mana dalam komputasi kuantum, dan seringkali, menemukan nilai eigen dari vektor eigen yang terkait adalah langkah yang diperlukan dalam algoritma yang lebih besar. Tergantung pada masalahnya, nilai eigen bisa merepresentasikan energi dari Hamiltonian dalam masalah tipe simulasi, bisa membantu kita menemukan faktor prima dari sebuah angka dalam algoritma Shor, atau bisa mengandung informasi penting lainnya. QPE adalah salah satu subrutin yang paling penting dan banyak digunakan dalam komputasi kuantum.
Jadi, apa hubungannya dengan quantum Fourier transform? Nah, seperti yang mungkin kamu ingat, setiap nilai eigen dari operator uniter memiliki magnitude . Jadi kita bisa menulis setiap nilai eigen sebagai bilangan kompleks dengan magnitude satu:
di mana adalah bilangan real antara 0 dan 1. Kalau kamu ingin informasi lebih lanjut tentang matriks uniter, lihat pelajaran John Watrous tentang subjek tersebut dalam Basics of quantum information.
Perhatikan bahwa bersifat periodik dalam . Ini sudah mungkin mengingatkanmu bahwa QFT bisa terlibat, karena kita telah melihat betapa bergunanya QFT untuk menganalisis fungsi periodik. Di bawah ini, kita akan menelusuri algoritma dan melihat dengan tepat bagaimana QFT berperan.
Cara kerja QPE
Pertama, kita akan mulai dengan algoritma QPE paling sederhana, yang secara kasar memperkirakan fase ke satu digit biner presisi. Dengan kata lain, algoritma ini bisa membedakan antara dan , tapi tidak bisa lebih baik dari itu. Berikut diagram Circuit-nya:

Qubit disiapkan dalam state , di mana qubit berada dalam state dan qubit yang tersisa berada dalam state , yang merupakan eigenstate dari . Setelah Hadamard pertama, state qubit menjadi:
Gate berikutnya adalah "controlled-" gate. Ini menerapkan operasi uniter ke qubit bawah yang berada dalam state