Algoritma kuantum: Estimasi fase
Kento Ueda (15 May 2024)
Notebook ini membahas konsep dasar dan implementasi Quantum Fourier Transformation (QFT) dan Quantum Phase Estimation (QPE).
Unduh pdf dari kuliah aslinya. Perlu diperhatikan bahwa beberapa potongan kode mungkin sudah tidak berlaku karena ini adalah gambar statis.
Perkiraan waktu QPU untuk menjalankan eksperimen ini adalah 7 detik.
1. Pendahuluan
Quantum Fourier Transformation (QFT)
Quantum Fourier Transformation adalah padanan kuantum dari transformasi Fourier diskrit klasik. Ini adalah transformasi linear yang diterapkan pada keadaan kuantum, memetakan basis komputasional ke representasi basis Fourier-nya. QFT memainkan peran kunci dalam banyak algoritma kuantum, menawarkan metode efisien untuk mengekstrak informasi periodisitas dari keadaan kuantum. QFT dapat diimplementasikan dengan operasi menggunakan gate kuantum seperti Hadamard gate dan Control-Phase gate untuk qubit, memungkinkan percepatan eksponensial dibandingkan transformasi Fourier klasik.
- Aplikasi: Ini adalah bagian fundamental dalam algoritma kuantum seperti algoritma Shor untuk memfaktorkan bilangan bulat besar dan logaritma diskrit.
Quantum Phase Estimation (QPE)
Quantum Phase Estimation adalah algoritma kuantum yang digunakan untuk mengestimasi fase yang terkait dengan eigenvector dari operator uniter. Algoritma ini memberikan jembatan antara sifat matematis abstrak dari keadaan kuantum dan aplikasi komputasionalnya.
- Aplikasi: Algoritma ini dapat menyelesaikan masalah seperti menemukan nilai eigen dari matriks uniter dan mensimulasikan sistem kuantum.
Bersama-sama, QFT dan QPE membentuk tulang punggung dari banyak algoritma kuantum yang memecahkan masalah yang tidak mungkin diselesaikan oleh komputer klasik. Di akhir notebook ini, kamu akan mendapatkan pemahaman tentang bagaimana teknik-teknik ini diimplementasikan.
2. Dasar-dasar Quantum Fourier Transformation (QFT)
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.quantum_info import Statevector
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import Sampler
from numpy import pi
Dari analogi dengan transformasi Fourier diskrit, QFT bekerja pada keadaan kuantum untuk qubit dan memetakannya ke keadaan kuantum .
di mana .
Atau representasi matriks unitari:
2.1. Intuisi
Quantum Fourier transform (QFT) melakukan transformasi antara dua basis: basis komputasional (Z) dan basis Fourier. Tapi apa arti basis Fourier dalam konteks ini? Kamu mungkin ingat bahwa transformasi Fourier dari fungsi menggambarkan konvolusi ke fungsi sinusoidal dengan frekuensi . Secara sederhana: transformasi Fourier adalah fungsi yang menggambarkan seberapa banyak dari setiap frekuensi yang kita perlukan untuk membangun fungsi dari fungsi sinus (atau kosinus). Untuk lebih memahami apa yang dimaksud QFT dalam konteks ini, perhatikan gambar bertahap di bawah yang menunjukkan angka yang dikodekan dalam biner menggunakan empat qubit:
Dalam basis komputasional, kita menyimpan angka dalam biner menggunakan keadaan dan .
Perhatikan frekuensi perubahan qubit yang berbeda; qubit paling kiri berubah setiap kenaikan angka, qubit berikutnya setiap 2 kenaikan, yang ketiga setiap 4 kenaikan, dan seterusnya.
Jika kita menerapkan quantum Fourier transform pada keadaan-keadaan ini, kita memetakan
(Kita sering menandai keadaan dalam basis Fourier menggunakan tilde (~)).
Dalam basis Fourier, kita menyimpan angka menggunakan rotasi yang berbeda di sekitar sumbu Z:
IFRAME
Angka yang ingin kita simpan menentukan sudut rotasi setiap qubit di sekitar sumbu Z. Dalam keadaan , semua qubit berada dalam keadaan . Seperti yang terlihat pada contoh di atas, untuk mengkodekan keadaan pada 4 qubit, kita memutar qubit paling kiri sebesar putaran penuh ( radian). Qubit berikutnya diputar dua kali lipat ( radian, atau putaran penuh), sudut ini kemudian digandakan untuk qubit berikutnya, dan seterusnya.
Sekali lagi, perhatikan frekuensi perubahan setiap qubit. Qubit paling kiri (qubit 0) dalam kasus ini memiliki frekuensi terendah, dan yang paling kanan memiliki frekuensi tertinggi.
2.2 Contoh: QFT 1-qubit
Mari kita pertimbangkan kasus .
Matriks unitari dapat ditulis:
Operasi ini adalah hasil dari penerapan Hadamard gate ().
2.3 Representasi produk dari QFT
Mari kita generalisasi transformasi untuk , yang bekerja pada keadaan .
2.4 Contoh: Konstruksi Circuit QFT 3 qubit
Dari deskripsi di atas, mungkin belum jelas bagaimana membangun Circuit QFT. Untuk saat ini, cukup catat bahwa kita mengharapkan tiga qubit memiliki fase yang berevolusi dengan "kecepatan" yang berbeda. Memahami bagaimana tepatnya ini diterjemahkan ke dalam Circuit diserahkan sebagai latihan bagi pembaca. Ada beberapa diagram dan contoh dalam pdf kuliah. Sumber tambahan termasuk pelajaran ini dari kursus Fundamentals of quantum algorithms.
Kita akan mendemonstrasikan QFT hanya menggunakan simulator, sehingga kita tidak akan menggunakan kerangka kerja pola Qiskit sampai kita beralih ke estimasi fase kuantum.
# Prepare for 3 qubits circuit
qr = QuantumRegister(3)
cr = ClassicalRegister(3)
qc = QuantumCircuit(qr, cr)
qc.h(2)
qc.cp(pi / 2, 1, 2) # Controlled-phase gate from qubit 1 to qubit 2
qc.cp(pi / 4, 0, 2) # Controlled-phase gate from qubit 0 to qubit 2
qc.draw(output="mpl")
qc.h(1)
qc.cp(pi / 2, 0, 1) # Controlled-phase gate from qubit 0 to qubit 1
qc.draw(output="mpl")
qc.h(0)
qc.draw(output="mpl")
qc.swap(0, 2)
qc.draw(output="mpl")
Kita coba menerapkan QFT pada sebagai contoh.
Pertama, kita konfirmasi notasi biner dari bilangan bulat 5 dan buat Circuit yang mengkodekan keadaan 5:
bin(5)
'0b101'
qc = QuantumCircuit(3)
qc.x(0)
qc.x(2)
qc.draw(output="mpl")
Kita periksa keadaan kuantum menggunakan simulator Aer:
statevector = Statevector(qc)
plot_bloch_multivector(statevector)

Terakhir, kita tambahkan QFT dan lihat keadaan akhir qubit kita:
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 2)
qc.draw(output="mpl")
statevector = Statevector(qc)
plot_bloch_multivector(statevector)

Kita bisa melihat fungsi QFT kita bekerja dengan benar. Qubit 0 telah diputar sebesar putaran penuh, qubit 1 sebesar putaran penuh (setara dengan putaran penuh), dan qubit 2 sebesar putaran penuh (setara dengan putaran penuh).
2.5 Latihan: QFT
(1) Implementasikan QFT dengan 4 qubit.
##your code goes here##
(2) Terapkan QFT pada , simulasikan dan plot statevector menggunakan Bloch sphere.
##your code goes here##
Solusi latihan: QFT
(1)
qr = QuantumRegister(4)
cr = ClassicalRegister(4)
qc = QuantumCircuit(qr, cr)
qc.h(3)
qc.cp(pi / 2, 2, 3)
qc.cp(pi / 4, 1, 3)
qc.cp(pi / 8, 0, 3)
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 3)
qc.swap(1, 2)
qc.draw(output="mpl")
(2)
bin(14)
'0b1110'
qc = QuantumCircuit(4)
qc.x(1)
qc.x(2)
qc.x(3)
qc.draw("mpl")
qc.h(3)
qc.cp(pi / 2, 2, 3)
qc.cp(pi / 4, 1, 3)
qc.cp(pi / 8, 0, 3)
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 3)
qc.swap(1, 2)
qc.draw(output="mpl")
statevector = Statevector(qc)
plot_bloch_multivector(statevector)

3. Dasar-dasar Quantum Phase Estimation (QPE)
Diberikan operasi uniter , QPE mengestimasi dalam karena bersifat uniter, semua nilai eigennya memiliki norma 1.
3.1 Prosedur
1. Persiapan
berada dalam satu set register qubit. Satu set tambahan qubit membentuk register pencacah di mana kita akan menyimpan nilai :
2. Superposisi
Terapkan operasi Hadamard gate -bit pada register pencacah:
3. Operasi Controlled Unitary
Kita perlu memperkenalkan controlled unitary yang menerapkan operator uniter pada register target hanya jika bit kontrolnya adalah . Karena adalah operator uniter dengan eigenvector sedemikian sehingga , maka:
3.2 Contoh: T-gate QPE
Mari kita gunakan gate sebagai contoh QPE dan estimasi fasenya .
Kita harapkan menemukan:
di mana
Kita inisialisasi dari eigenvector gate dengan menerapkan gate :
qpe = QuantumCircuit(4, 3)
qpe.x(3)
qpe.draw(output="mpl")
Selanjutnya, kita terapkan Hadamard gate pada qubit pencacah:
for qubit in range(3):
qpe.h(qubit)
qpe.draw(output="mpl")
Kita lakukan operasi controlled unitary:
repetitions = 1
for counting_qubit in range(3):
for i in range(repetitions):
qpe.cp(pi / 4, counting_qubit, 3) # This is C-U
repetitions *= 2
qpe.draw(output="mpl")
Kita terapkan inverse quantum Fourier transformation untuk mengkonversi keadaan register pencacah, lalu ukur register pencacah:
from qiskit.circuit.library import QFT
# Apply inverse QFT
qpe.append(QFT(3, inverse=True), [0, 1, 2])
qpe.draw(output="mpl")
for n in range(3):
qpe.measure(n, n)
qpe.draw(output="mpl")
Kita bisa mensimulasikan menggunakan simulator Aer:
aer_sim = AerSimulator()
shots = 2048
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
t_qpe = pm.run(qpe)
sampler = Sampler(mode=aer_sim)
job = sampler.run([t_qpe], shots=shots)
result = job.result()
answer = result[0].data.c.get_counts()
plot_histogram(answer)
Kita melihat kita mendapatkan satu hasil (001) dengan kepastian, yang diterjemahkan ke desimal: 1. Kita sekarang perlu membagi hasil kita (1) dengan untuk mendapatkan :
Algoritma Shor memungkinkan kita memfaktorkan suatu bilangan dengan membangun Circuit dengan yang tidak diketahui dan mendapatkan .
3.3 Latihan
Estimasikan menggunakan 3 qubit untuk pencacahan dan sebuah qubit untuk eigenvector.
. Karena kita ingin mengimplementasikan , kita perlu menetapkan .
##your code goes here##
Solusi latihan:
# Create and set up circuit
qpe = QuantumCircuit(4, 3)
# Apply H-Gates to counting qubits:
for qubit in range(3):
qpe.h(qubit)
# Prepare our eigenstate |psi>:
qpe.x(3)
# Do the controlled-U operations:
angle = 2 * pi / 3
repetitions = 1
for counting_qubit in range(3):
for i in range(repetitions):
qpe.cp(angle, counting_qubit, 3)
repetitions *= 2
# Do the inverse QFT:
qpe.append(QFT(3, inverse=True), [0, 1, 2])
for n in range(3):
qpe.measure(n, n)
qpe.draw(output="mpl")
aer_sim = AerSimulator()
shots = 4096
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
t_qpe = pm.run(qpe)
sampler = Sampler(mode=aer_sim)
job = sampler.run([t_qpe], shots=shots)
result = job.result()
answer = result[0].data.c.get_counts()
plot_histogram(answer)
4. Eksekusi menggunakan Qiskit Runtime Sampler primitive
Kita akan menjalankan QPE menggunakan perangkat quantum nyata dan mengikuti 4 langkah pola Qiskit.
- Petakan masalah ke format quantum-native
- Optimalkan Circuit
- Jalankan Circuit target
- Proses hasil
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import Sampler
# Loading your IBM Quantum® account(s)
service = QiskitRuntimeService()
4.1 Langkah 1: Petakan masalah ke Circuit dan operator quantum
qpe = QuantumCircuit(4, 3)
qpe.x(3)
for qubit in range(3):
qpe.h(qubit)
repetitions = 1
for counting_qubit in range(3):
for i in range(repetitions):
qpe.cp(pi / 4, counting_qubit, 3) # This is C-U
repetitions *= 2
qpe.append(QFT(3, inverse=True), [0, 1, 2])
for n in range(3):
qpe.measure(n, n)
qpe.draw(output="mpl")
backend = service.least_busy(simulator=False, operational=True, min_num_qubits=4)
print(backend)
<IBMBackend('ibm_strasbourg')>
4.2 Langkah 2: Optimalkan untuk hardware target
# Transpile the circuit into basis gates executable on the hardware
pm = generate_preset_pass_manager(backend=backend, optimization_level=2)
qc_compiled = pm.run(qpe)
qc_compiled.draw("mpl", idle_wires=False)

4.3 Langkah 3: Jalankan di hardware target
real_sampler = Sampler(mode=backend)
job = real_sampler.run([qc_compiled], shots=1024)
job_id = job.job_id()
print("job id:", job_id)
job id: d13p4zb5z6q00087ag00
job = service.job(job_id) # Input your job-id between the quotations
job.status()
'DONE'
result_real = job.result()
print(result_real)
PrimitiveResult([SamplerPubResult(data=DataBin(c=BitArray(<shape=(), num_shots=1024, num_bits=3>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2025-06-09 22:39:00', stop='2025-06-09 22:39:00', size=1024>)])}, 'version': 2})
4.4 Langkah 4: Proses hasil
from qiskit.visualization import plot_histogram
plot_histogram(result_real[0].data.c.get_counts())
# See the version of Qiskit
import qiskit
qiskit.__version__
'2.0.2'