Langkau ke kandungan utama

Jelmaan Fourier kuantum

Untuk modul Qiskit in Classrooms ini, pelajar perlu mempunyai persekitaran Python yang berfungsi dengan pakej-pakej berikut dipasang:

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

Untuk menyediakan dan memasang pakej-pakej di atas, lihat panduan Pasang Qiskit. Untuk menjalankan kerja pada komputer kuantum sebenar, pelajar perlu menyediakan akaun dengan IBM Quantum® dengan mengikuti langkah-langkah dalam panduan Sediakan akaun IBM Cloud anda.

Modul ini telah diuji dan menggunakan 13 saat masa QPU. Ini adalah anggaran semaksimum mungkin; penggunaan sebenar anda mungkin berbeza.

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

Pengenalan

Jelmaan Fourier ialah alat yang sangat meluas digunakan dalam matematik, fizik, pemprosesan isyarat, pemampatan data, dan banyak bidang lain. Versi kuantum jelmaan Fourier, yang tepat dinamakan jelmaan Fourier kuantum, menjadi asas kepada beberapa algoritma kuantum yang paling penting.

Hari ini, selepas mengimbas kembali jelmaan Fourier klasik, kita akan bincang bagaimana kita melaksanakan jelmaan Fourier kuantum pada komputer kuantum. Kemudian, kita akan bincang salah satu aplikasi jelmaan Fourier kuantum kepada algoritma yang dipanggil algoritma anggaran fasa. Anggaran fasa kuantum adalah subrutin dalam algoritma pemfaktoran Shor yang terkenal, yang kadangkala dirujuk sebagai "permata mahkota" pengkomputeran kuantum. Modul ini membina ke arah modul lain tentang algoritma Shor, tetapi ia juga dimaksudkan untuk berdiri sendiri. Jelmaan Fourier kuantum ialah algoritma yang menakjubkan dan berguna dengan sendirinya!

Jelmaan Fourier klasik

Sebelum kita terjun ke jelmaan Fourier kuantum, mari kita imbas kembali versi klasiknya. Jelmaan Fourier ialah kaedah mengubah dari satu yang dipanggil "asas" ke asas yang lain. Anda boleh fikir dua asas sebagai perspektif berbeza untuk masalah yang sama — keduanya adalah cara yang sah untuk menyatakan sesuatu fungsi, tetapi salah satunya mungkin lebih menerangkan bergantung pada masalah yang ada. Beberapa contoh pasangan asas yang dihubungkan oleh jelmaan Fourier ialah kedudukan dan momentum, serta masa dan frekuensi.

Mari lihat contoh bagaimana jelmaan Fourier boleh membantu kita mengetahui nota yang dimainkan oleh sebuah alat muzik berdasarkan bentuk gelombang audionya. Biasanya, kita melihat bentuk gelombang diwakili dalam asas masa — iaitu, amplitud gelombang dinyatakan sebagai fungsi masa.

Single sinusoidal signal plotted as a function of time.

Kita boleh jelmakan bentuk gelombang ini untuk bergerak dari asas masa ke asas frekuensi:

Frequency spectrum of the audio waveform. One clear sharp peak at 260 Hz.

Dalam asas frekuensi, kita mudah nampak puncak yang jelas pada kira-kira 260 Hz. Itu adalah C tengah!

Mungkin anda boleh tentukan bahawa C tengah sedang dimainkan tanpa menggunakan jelmaan Fourier, tetapi bagaimana jika beberapa nota dimainkan serentak? Maka bentuk gelombang menjadi lebih rumit apabila kita plot dalam asas masa:

Displacement versus time graph of multiple sine waves at once, creating a more complicated periodic pattern.

Tetapi spektrum frekuensi jelas mengenal pasti tiga puncak:

Frequency spectrum of the above audio waveform. Three peaks at approximately 260 Hz, 330 Hz, and 392 Hz. The last peak is very weak, but visible.

Ini ialah akor C-major, memainkan nota C, E, dan G.

Jenis analisis Fourier ini boleh membantu kita mengekstrak komponen frekuensi bagi mana-mana isyarat yang rumit.

Jelmaan Fourier diskret

Jelmaan Fourier berguna untuk pelbagai aplikasi pemprosesan isyarat. Tetapi dalam kebanyakan aplikasi dunia sebenar ini (termasuk contoh muzik yang kita gunakan di atas), kita ingin mengubah set data diskret sebanyak NN titik — bukan fungsi berterusan. Dalam kes ini, kita menggunakan jelmaan Fourier diskret. Jelmaan Fourier diskret (DFT) bertindak ke atas vektor (x0,...,xN1)(x_0, ..., x_{N-1}) dan memetakannya ke vektor (y0,...,yN1)(y_0, ..., y_{N-1}) mengikut formula:

yk=1Nj=0N1xjωNjky_k = \frac{1}{\sqrt{N}}\sum_{j=0}^{N-1}x_j\omega_N^{jk}

di mana kita ambil ωNjk=e2πijkN\omega_N^{jk} = e^{2\pi i \frac{jk}{N}}. (Perhatikan bahawa terdapat konvensyen lain yang mempunyai tanda negatif dalam eksponen, jadi berhati-hati apabila anda melihat DFT di luar sana.) Ingat bahawa e2πijkNe^{2\pi i \frac{jk}{N}} ialah fungsi berkala, dengan tempoh Nk\frac{N}{k}. Jadi, dengan mendarab dengan fungsi ini, jelmaan Fourier pada dasarnya adalah cara untuk memecahkan fungsi (diskret) {xj}\{x_{j}\} kepada kombinasi linear fungsi-fungsi berkala yang membentuknya, masing-masing dengan tempoh Nk\frac{N}{k}.

Jelmaan Fourier kuantum

Jadi kini, kita telah melihat bagaimana jelmaan Fourier digunakan untuk mewakili fungsi sebagai kombinasi linear set baharu yang dipanggil "fungsi asas." Transformasi asas juga kerap dilakukan ke atas keadaan Qubit. Sebagai contoh, keadaan satu Qubit ψ|\psi\rangle boleh dinyatakan dalam asas komputasi ψ=c00+c11|\psi\rangle = c_0 |0\rangle + c_1 |1\rangle, dengan keadaan asas 0|0\rangle dan 1|1\rangle, atau dalam asas XX ψ=c+++c|\psi\rangle = c_+ |+\rangle + c_- |-\rangle dengan keadaan asas +=12(0+1)|+\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) dan =12(01)|-\rangle = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle). Kedua-duanya sama sah, tetapi salah satunya mungkin lebih semula jadi bergantung pada jenis masalah yang cuba anda selesaikan.

Keadaan Qubit juga boleh dinyatakan dalam asas Fourier di mana keadaan dinyatakan dalam sebutan kombinasi linear keadaan asas Fourier ϕy|\phi_y\rangle, bukannya keadaan asas komputasi biasa, x|x\rangle. Untuk melakukan ini, anda perlu menerapkan jelmaan Fourier kuantum (QFT):

ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

dengan ωNyx=e2πiyxN\omega_N^{yx} = e^{\frac{2\pi i y x}{N}} seperti di atas, dan NN ialah bilangan keadaan asas dalam sistem kuantum anda. Perhatikan bahawa, memandangkan kita kini bekerja dengan Qubit, mm Qubit memberi anda 2m2^m keadaan asas, jadi N=2mN=2^m. Di sini, keadaan asas ditulis sebagai satu nombor x|x\rangle di mana xx berkisar dari 00 hingga N1N-1, tetapi anda mungkin lebih kerap melihat keadaan asas dinyatakan sebagai 00...00|00...00\rangle, 00...01|00...01\rangle, 00...11|00...11\rangle, ..., 11...11|11...11\rangle, di mana setiap digit binari mewakili keadaan Qubit 0 hingga m1m-1, dari kanan ke kiri. Terdapat cara mudah untuk menukar keadaan binari ini kepada satu nombor: layani sahaja ia seperti nombor binari! Jadi, 00...00=0|00...00\rangle = |0\rangle, 00...01=1|00...01\rangle = |1\rangle, 00...10=2|00...10\rangle = |2\rangle, 00...11=3|00...11\rangle = |3\rangle, dan seterusnya, sehinggalah 11...11=2m1=N1|11...11\rangle = |2^m -1\rangle = |N-1\rangle.

Bina intuisi untuk keadaan asas Fourier

Jadi, kita baru sahaja bincangkan apakah keadaan asas komputasi dan bagaimana ia dipesan: ia adalah set keadaan di mana setiap Qubit sama ada berada dalam 00 atau 11, dan kita pesan dari keadaan di mana semua Qubit adalah 00, 00...00|00...00\rangle, hingga keadaan di mana semuanya 11, 11...11|11...11\rangle.

Tetapi bagaimana kita memahami keadaan asas Fourier? Semua keadaan asas Fourier adalah superposisi sama rata bagi semua keadaan asas komputasi, tetapi setiap keadaan berbeza dari yang lain dalam kekerapan fasa komponen-komponennya. Untuk memahami ini dengan lebih konkret, mari lihat empat keadaan asas Fourier bagi sistem dua Qubit. Keadaan Fourier terendah adalah satu yang fasanya tidak berubah sama sekali:

ϕ0=12(00+01+10+11)|\phi_0\rangle = \frac{1}{2} (|00\rangle + |01\rangle + |10\rangle + |11\rangle)

Kita boleh gambarkan keadaan ini dengan memplot amplitud kompleks bagi setiap sebutan. Garis merah membimbing pandangan untuk menunjukkan bagaimana fasa amplitud ini berlegar-legar di satah kompleks sebagai fungsi keadaan asas komputasi. Untuk ϕ0|\phi_0\rangle, fasa kekal malar:

Bar graph of the complex amplitude (x-y plane) for each computational basis state (z-axis) for phi_0. They are all real, and so the bars all point to +1 on the x-axis

Keadaan asas Fourier seterusnya ialah satu yang fasa komponennya berlegar dari 00 hingga 2π2\pi hanya sekali:

ϕ1=12(00+eiπ/201+eiπ10+e3iπ/211)=12(00+i0110i11)|\phi_1\rangle = \frac{1}{2} (|00\rangle + e^{i\pi/2}|01\rangle + e^{i\pi}|10\rangle + e^{3i\pi/2}|11\rangle) = \frac{1}{2}(|00\rangle + i|01\rangle - |10\rangle - i|11\rangle)

Dan kita boleh lihat perlegaraan ini dalam plot amplitud kompleks berbanding keadaan asas komputasi:

Bar graph of the complex amplitude (x-y plane) for each computational basis state (z-axis) for phi_1. The red line shows how the complex phase accumulates such that it winds around 2\pi once as you step through all of the computational basis states.

Jadi, setiap keadaan mempunyai fasa yang 2π/42\pi/4 radian lebih tinggi daripada keadaan sebelumnya apabila dipesan dengan cara standard, kerana dalam contoh ini kita mempunyai empat keadaan asas (N=4N=4). Keadaan asas seterusnya berlegar dari 0 hingga 2π2\pi dua kali:

ϕ2=12(00+eiπ01+e2iπ10+e3iπ11)=12(0001+1011)|\phi_2\rangle = \frac{1}{2} (|00\rangle + e^{i\pi}|01\rangle + e^{2i\pi}|10\rangle + e^{3i\pi}|11\rangle) = \frac{1}{2} (|00\rangle - |01\rangle + |10\rangle - |11\rangle)

Bar graph of the complex amplitude (x-y plane) for each computational basis state (z-axis) for phi_2. The red line shows how the complex phase accumulates such that it winds around 2\pi twice as you step through all of the computational basis states.

Akhir sekali, komponen Fourier tertinggi ialah yang fasanya paling cepat berubah. Untuk contoh kita dengan dua Qubit, ia adalah satu yang fasanya berlegar dari 0 hingga 2π2\pi tiga kali:

ϕ3=12(00+e3iπ/201+e6iπ/210+e9iπ/211)=12(00i0110+i11)|\phi_3\rangle = \frac{1}{2} (|00\rangle + e^{3i\pi/2}|01\rangle + e^{6i\pi/2}|10\rangle + e^{9i\pi/2}|11\rangle) = \frac{1}{2} (|00\rangle - i|01\rangle - |10\rangle + i|11\rangle)

Bar graph of the complex amplitude (x-y plane) for each computational basis state (z-axis) for phi_3. The red line shows how the complex phase accumulates such that it winds around 2\pi three times as you step through all of the computational basis states.

Secara umum, untuk keadaan mm-Qubit, terdapat 2m2^m keadaan asas Fourier, yang frekuensi variasi fasanya berkisar dari malar, untuk ϕ0|\phi_0\rangle, hingga berubah dengan pantas untuk ϕ2m1|\phi_{2^m-1}\rangle, melengkapkan 2m12^m-1 perlegaraan sekitar 2π2\pi melalui superposisi keadaan. Jadi, apabila kita mengambil QFT bagi keadaan kuantum, kita pada asasnya melakukan analisis asas yang sama seperti yang kita buat untuk bentuk gelombang muzik dalam Pengenalan. Kita menentukan komponen frekuensi Fourier yang menyumbang kepada mencipta keadaan kuantum yang diminati.

Cuba beberapa contoh QFT

Mari cuba terus membina intuisi kita untuk jelmaan Fourier kuantum dengan membuat keadaan dalam asas komputasi, kemudian melihat apa yang berlaku apabila kita menerapkan QFT padanya. Buat masa ini, kita akan anggap QFT sebagai kotak hitam yang kita terapkan menggunakan QFTGate daripada pustaka Circuit Qiskit. Kemudian, kita akan intip di bawah hood untuk melihat bagaimana ia dilaksanakan.

Kita mulakan dengan memuatkan pakej yang diperlukan dan memilih peranti 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 anda tidak mempunyai masa yang tersedia pada akaun anda atau ingin menggunakan simulator atas sebab apa pun, anda boleh jalankan sel di bawah untuk menyediakan simulator yang akan meniru peranti 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 asas komputasi tunggal

Pertama, mari cuba mengubah keadaan asas komputasi tunggal. Kita mulakan dengan membuat keadaan komputasi rawak:

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

Output of the previous code cell

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

Output of the previous code cell

Sekarang, mari jelmakan keadaan ini dengan QFTGate:

# Step 1: Map

qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")

Output of the previous code cell

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

Output of the previous code cell

Seperti yang anda lihat, kita mengukur populasi setiap keadaan lebih kurang sama, tambah tolak beberapa bunyi eksperimental dan statistik. Jadi, jika anda mengambil QFT bagi keadaan asas komputasi tunggal, hasilnya ialah superposisi sama rata bagi semua keadaan. Jika anda biasa dengan jelmaan Fourier, ini mungkin tidak mengejutkan anda. Satu prinsip asas yang boleh membantu kita membina hubungan intuitif antara fungsi dan jelmaan Fouriernya ialah lebar fungsi berbanding songsang dengan lebar jelmaan Fouriernya. Jadi, sesuatu yang sangat terpusat dalam masa, contohnya, seperti denyutan yang sangat singkat, akan memerlukan julat frekuensi yang luas untuk menjana denyutan itu. Isyarat itu akan sangat luas dalam ruang Fourier.

Fakta ini sebenarnya berkaitan dengan ketakpastian kuantum! Prinsip ketakpastian Heisenberg biasanya dinyatakan sebagai ΔxΔp/2\Delta x \Delta p \ge \hbar / 2 . Jadi jika ketakpastian dalam xx (Δx\Delta x) adalah kecil, ketakpastian dalam momentum (Δp\Delta p) mesti besar, dan sebaliknya. Ternyata, mengubah dari asas kedudukan xx ke asas momentum pp dicapai melalui jelmaan Fourier.

Nota: Ingat, kita mengukur populasi dalam setiap keadaan asas, jadi kita kehilangan maklumat tentang fasa relatif antara pelbagai bahagian superposisi. Jadi, walaupun QFT bagi mana-mana keadaan asas komputasi tunggal akan menghasilkan sebaran rata dalam populasi merentasi semua keadaan asas, fasa tidak semestinya sama.

Dua keadaan asas komputasi

Sekarang, mari lihat apa yang berlaku apabila kita menyediakan superposisi keadaan asas komputasi. Apa agaknya rupa jelmaan Fourier dalam kes ini?

Mari pilih superposisi:

ψ=12(0+N/2)=12(000...0+100...0)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) = \frac{1}{\sqrt{2}} (|000...0\rangle + |100...0\rangle)

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

Output of the previous code cell

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

Output of the previous code cell

Sekarang, mari jelmakan keadaan ini dengan QFTGate:

# Step 1: Map

qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")

Output of the previous code cell

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

Output of the previous code cell

Yang ini mungkin sedikit mengejutkan. Nampaknya QFT bagi keadaan ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) adalah superposisi semua keadaan asas genap. Tetapi jika kita fikir kembali tentang visualisasi kita bagi setiap keadaan asas ϕy|\phi_y\rangle, dan bagaimana fasa setiap komponen berlegar sekitar 2π2\pi sebanyak yy kali, maka sebab kita mendapat hasil ini mungkin menjadi jelas.

Periksa kefahaman anda

Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaian.

Menggunakan petunjuk di atas, terangkan mengapa hasil yang kita perolehi untuk QFT bagi ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) adalah dijangka.

Jawapan:

Keadaan asal mempunyai fasa relatif 0 (atau gandaan integer 2π2\pi) antara dua bahagian superposisi. Jadi, kita tahu keadaan ini mempunyai komponen Fourier yang fasanya juga sepadan dengan cara itu: yang mempunyai anjakan fasa 0 antara sebutan |0000> dan sebutan |1000>. Setiap keadaan asas Fourier ϕy|\phi_y\rangle terdiri daripada sebutan yang fasanya terkumpul pada kadar 2πy/N2\pi y/N, ertinya, apabila dipesan dengan cara biasa, setiap sebutan dalam superposisi mempunyai fasa 2πy/N2\pi y/N lebih tinggi daripada sebutan yang mendahuluinya. Jadi, pada titik tengah N/2N/2, kita mahu fasa 2πy/NN/22\pi y/N * N/2 menjadi gandaan integer 2π2\pi. Ini berlaku apabila yy adalah genap.

Superposisi keadaan komputasi apakah yang akan sepadan dengan QFT yang mempunyai puncak pada setiap nombor binari ganjil?

Jawapan:

Jika anda mengambil QFT bagi keadaan ψ=0N/2\psi = |0\rangle - |N/2\rangle, maka anda akan melihat puncak pada setiap keadaan bernombor binari ganjil.

Urai algoritma QFT

Kini kita telah mendapat lebih banyak intuisi tentang hubungan antara keadaan Qubit dalam asas komputasi dan asas Fourier, mari kita selami algoritma QFT itu sendiri. Dengan kata lain, Gate apa yang sebenarnya kita laksanakan pada komputer kuantum untuk mencapai jelmaan ini?

Mari mulakan dengan kecil, dengan satu Qubit. Jadi, itu bermakna kita akan mempunyai dua keadaan asas. QFT2_2 mengubah keadaan asas komputasi 0|0\rangle dan 1|1\rangle menjadi keadaan asas Fourier ϕ0\phi_0 dan ϕ1\phi_1:

ϕ0=12(0+1)|\phi_0\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

ϕ1=12(01)|\phi_1\rangle = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

Periksa kefahaman anda

Baca soalan di bawah, fikirkan jawapan anda, kemudian klik segitiga untuk mendedahkan penyelesaian.

Gunakan persamaan untuk QFT dalam bahagian sebelumnya untuk mengesahkan dua keadaan asas Fourier di atas.

Jawapan:

Formula QFT umum ialah:

ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

Untuk satu Qubit (n=1n=1), N=2n=2N=2^n=2, dan ωNxy=e2πiyx2\omega_N^{xy} = e^{2\pi i \frac {y x}{2}}. Jadi, kita ada

ϕ0=12(e2πi0×020+e2πi0×121)=12(0+1) | \phi_0 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {0 \times 0}{2}}|0\rangle + e^{2\pi i \frac {0 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

ϕ1=12(e2πi1×020+e2πi1×121)=12(01) | \phi_1 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {1 \times 0}{2}}|0\rangle + e^{2\pi i \frac {1 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

Lihat dua persamaan tersebut. Anda mungkin sudah tahu Gate kuantum yang boleh digunakan untuk melaksanakan jelmaan ini. Iaitu, terdapat Gate yang mengubah keadaan asas komputasi 0|0\rangle dan 1|1\rangle kepada keadaan asas Fourier masing-masing ϕ0|\phi_0\rangle dan ϕ1|\phi_1\rangle. Ia adalah Gate Hadamard! Ini menjadi lebih jelas jika kita memperkenalkan perwakilan matriks operasi QFTN_N:

QFTN=1Nx=0N1y=0N1ωNxyxy \text{QFT}_N = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} \omega_N^{xy} \vert x \rangle \langle y \vert

Jika anda tidak biasa dengan notasi ini untuk menyatakan pengoperasi kuantum, tidak mengapa! Ia adalah cara untuk mewakili matriks N×NN \times N, di mana xx dan yy mengindeks lajur dan baris matriks, dari 00 hingga N1N-1, dan ωNxy\omega_N^{xy} adalah nilai entri tertentu itu. Jadi, entri dalam lajur ke-0 dan baris ke-2, contohnya, hanyalah ωN0,2=e2πi0×2N=1\omega_N^{0,2} = e^{2 \pi i \frac{0 \times 2}{N}} = 1.

Dalam perwakilan ini, setiap keadaan asas komputasi dikaitkan dengan salah satu vektor asas:

(100),1=(010),N1=(001).\begin{pmatrix} 1 \\ 0 \\ \vdots \\ 0 \end{pmatrix}, |1\rangle = \begin{pmatrix} 0 \\ 1 \\ \vdots \\ 0 \end{pmatrix}, |N-1\rangle = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 1 \end{pmatrix}.

Jika anda ingin belajar lebih mendalam tentang perwakilan ini, lihat pelajaran John Watrous tentang sistem berbilang dalam kursus Asas maklumat kuantum.

Mari cuba bina matriks untuk QFT4_4. Menggunakan formula di atas, kita dapati bahawa

\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 melaksanakan matriks ini pada komputer kuantum, kita perlu mengetahui kombinasi Gate mana yang diterapkan pada Qubit mana yang akan memberikan transformasi uniter yang sepadan dengan matriks di atas. Kita sudah tahu salah satu Gate yang diperlukan: Hadamard. Gate lain yang kita perlukan ialah Gate fasa terkawal, yang menerapkan fasa relatif α\alpha pada keadaan Qubit sasaran, selagi Qubit kawalan berada dalam keadaan 1|1\rangle. Dalam bentuk matriks ini kelihatan 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\}

Memandangkan hanya keadaan 11|11\rangle yang diubah, sebenarnya tidak penting Qubit mana yang dianggap "kawalan" dan mana yang "sasaran." Hasilnya akan sama dalam kedua-dua cara.

Akhir sekali, kita juga memerlukan beberapa Gate SWAP. Gate SWAP menukar keadaan dua Qubit. Ia kelihatan seperti:

\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 membina Circuit QFT2m_{2^m} pada mm Qubit adalah berulang — anda pertama menerapkan QFT2m1_{2^{m-1}} pada Qubit 11 hingga m1m-1, kemudian menambah beberapa Gate antara Qubit 00 dan m1m-1 Qubit yang lain. Tetapi untuk menerapkan QFT2m1_{2^{m-1}}, anda perlu menerapkan QFT2m2_{2^{m-2}} pada Qubit 2 hingga m1m-1 terlebih dahulu, kemudian menambah beberapa Gate antara Qubit 1 dan Qubit yang tinggal 22 hingga m1m-1. Ia seperti anak patung bersarang Rusia: setiap anak patung menambah faktor dua dalam dimensi Circuit QFT, dengan anak patung terkecil di tengah-tengah, iaitu QFT2_2, atau Gate Hadamard.

Untuk meletakkan anak patung di dalam anak patung yang lebih besar seterusnya, seterusnya meningkatkan dimensi QFT sebanyak faktor dua, anda sentiasa mengikuti prosedur yang sama:

  1. Pertama, terapkan QFT2m1_{2^{m-1}} pada m1m-1 Qubit paling bawah. Ini adalah "anak patung yang lebih kecil" daripada set anak patung bersarang Rusia yang akan anda masukkan ke dalam anak patung yang lebih besar seterusnya.
  2. Gunakan Qubit seterusnya di atas sebagai kawalan, dan terapkan Gate fasa terkawal kepada setiap m1m-1 Qubit bawah, dengan fasa kepada keadaan asas standard bagi setiap m1m-1 Qubit yang tinggal.
  3. Lakukan Hadamard pada Qubit paling atas yang sama yang digunakan sebagai kawalan dalam Gate fasa.
  4. Gunakan Gate SWAP untuk mengatur semula susunan Qubit supaya bit paling tidak signifikan (atas) menjadi bit paling signifikan (bawah), dan semua yang lain beralih ke atas satu.

Kita sudah menggunakan fungsi QFTGate daripada pustaka Circuit Qiskit, tetapi sekarang mari lihat di dalam beberapa Gate QFT ini untuk mengesahkan prosedur di atas. Kita boleh melakukan ini dengan decompose().

qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

Jadi, semoga dari empat QFT pertama anda mula nampak bagaimana setiap satu bersarang di dalam yang terbesar seterusnya. Anda mungkin perasan, bagaimanapun, bahawa beberapa Gate fasa tidak tepat seperti yang ditetapkan dalam prosedur yang kita gariskan di atas, dan SWAP tidak muncul selepas setiap subrutin, tetapi sebaliknya hanya di hujung QFT penuh sahaja. Ini menjimatkan Gate yang tidak perlu, yang akan menyebabkan Circuit mengambil masa lebih lama dan lebih mudah tersalah. Daripada melaksanakan SWAP selepas setiap anak patung bersarang, Circuit menjejaki di mana setiap keadaan Qubit sepatutnya berada dan menyesuaikan Qubit yang diterapkan Gate fasa padanya dengan sewajarnya. Kemudian, satu set SWAP akhir di penghujung meletakkan segalanya pada tempat yang betul.

Gunakan QFT: Anggaran fasa

Mari kita lihat bagaimana QFT boleh digunakan untuk menyelesaikan masalah yang berguna dalam pengkomputeran kuantum. Mengira songsang jelmaan Fourier kuantum adalah langkah yang diperlukan dalam algoritma yang dikenali sebagai Anggaran Fasa Kuantum (QPE), yang merupakan subrutin dalam banyak algoritma lain, termasuk "permata mahkota" algoritma kuantum, algoritma pemfaktoran Shor.

Matlamat QPE adalah untuk menganggar nilai eigen bagi pengoperasi unitar. Pengoperasi unitar sangat meluas dalam pengkomputeran kuantum, dan sering kali, mencari nilai eigen bagi vektor eigen yang berkaitan adalah langkah yang diperlukan dalam algoritma yang lebih besar. Bergantung pada masalah, nilai eigen boleh mewakili tenaga Hamiltonian dalam masalah simulasi, boleh membantu kita mencari faktor perdana sesuatu nombor dalam algoritma Shor, atau boleh mengandungi maklumat penting yang lain. QPE adalah salah satu subrutin yang paling penting dan banyak digunakan dalam pengkomputeran kuantum.

Jadi, apakah kaitannya dengan jelmaan Fourier kuantum? Seperti yang mungkin kamu ingat, mana-mana nilai eigen λ\lambda bagi pengoperasi unitar mempunyai magnitud λ=1|\lambda| = 1. Jadi kita boleh tulis setiap nilai eigen sebagai nombor kompleks dengan magnitud satu:

λ=e2πiθ\lambda = e^{2\pi i \theta}

di mana θ\theta adalah nombor nyata antara 0 dan 1. Jika kamu ingin maklumat lanjut tentang matriks unitar, lihat pelajaran John Watrous mengenai subjek ini dalam Asas maklumat kuantum.

Perhatikan bahawa λ\lambda adalah berkala dalam θ\theta. Ini mungkin sudah mencadangkan kepada kamu bahawa QFT mungkin terlibat, kerana kita telah melihat betapa bergunanya QFT dalam menganalisis fungsi berkala. Di bawah, kita akan menelusuri algoritma dan melihat dengan tepat bagaimana QFT memainkan peranannya.

Cara QPE berfungsi

Pertama, kita akan mulakan dengan algoritma QPE yang paling mudah, yang secara kasar menganggar fasa kepada satu digit perduaan ketepatan. Dalam erti kata lain, algoritma ini boleh membezakan antara θ=0\theta = 0 dan θ=1/2\theta = 1/2, tetapi tidak lebih baik daripada itu. Berikut adalah rajah litar:

Rajah litar algoritma QPE untuk satu Qubit data. Hadamard dikenakan pada Qubit data. Seterusnya, algoritma menggunakan Qubit pembantu yang lain, di mana Gate controlled-U dikenakan, dengan Qubit data sebagai kawalan. Selepas satu lagi Hadamard pada Qubit 0, Qubit-Qubit diukur.

Qubit-Qubit disediakan dalam keadaan π0=ψ0|\pi_0\rangle = |\psi\rangle|0\rangle, di mana Qubit 00 berada dalam keadaan 0|0\rangle dan Qubit-Qubit yang lain berada dalam keadaan ψ|\psi\rangle, yang merupakan keadaan eigen bagi UU. Selepas Hadamard pertama, keadaan Qubit menjadi:

π1=12ψ(0+1)|\pi_1\rangle = \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + |1\rangle)

Gate seterusnya adalah Gate "controlled-UU". Ini mengenakan operasi unitar UU pada Qubit-Qubit bawah yang berada dalam keadaan ψ|\psi\rangle jika Qubit 0 berada dalam keadaan 1|1\rangle, tetapi tidak melakukan apa-apa pada ψ|\psi\rangle jika Qubit 0 berada dalam keadaan 0|0\rangle. Ini mengubah Qubit-Qubit kepada keadaan:

π2=12(ψ0+e2πiθψ1)|\pi_2\rangle = \frac{1}{\sqrt{2}}( |\psi\rangle|0\rangle + e^{2\pi i \theta}|\psi\rangle|1\rangle) =12ψ(0+e2πiθ1)= \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + e^{2\pi i \theta}|1\rangle)

Sesuatu yang pelik baru sahaja berlaku: Gate controlled-UU hanya menggunakan Qubit 00 sebagai Qubit kawalan, jadi seseorang mungkin fikir bahawa Gate ini tidak akan mengubah keadaan Qubit 0 sama sekali. Tetapi entah bagaimana, ia berubah! Walaupun operasi dikenakan pada Qubit-Qubit bawah, kesan keseluruhan Gate adalah mengubah fasa Qubit 00. Ini dikenali sebagai "mekanisme tendangan balik fasa," dan digunakan dalam banyak algoritma kuantum, termasuk algoritma Deutsch-Josza dan Grover. Jika kamu ingin mengetahui lebih lanjut tentang mekanisme tendangan balik fasa, lihat pelajaran John Watrous tentang Algoritma pertanyaan kuantum dalam Asas algoritma kuantum.

Selepas tendangan balik fasa, kita kenakan satu lagi Hadamard pada Qubit 00, yang menghasilkan keadaan:

π3=ψ(1+e2πiθ20+1e2πiθ21)=ψ(cos(πθ)0isin(πθ)1)|\pi_3\rangle = |\psi\rangle ( \frac{1+e^{2\pi i \theta}}{2} |0\rangle + \frac{1 - e^{2\pi i \theta}}{2}|1\rangle) = |\psi\rangle ( \cos(\pi\theta) |0\rangle - i \sin(\pi\theta)|1\rangle)

Jadi, apabila kita mengukur Qubit 00 pada akhirnya, kita akan mengukur 0|0\rangle dengan kepastian 100% jika θ=0\theta = 0 dan kita akan mengukur 1|1\rangle dengan kepastian 100% jika θ=12\theta = \frac{1}{2} (dan jika komputer kuantum kita sempurna, tanpa hingar). Jika θ\theta adalah sesuatu yang lain daripada ini, pengukuran akhir hanya bersifat kebarangkalian dan hanya memberitahu kita sekadar itu.

QPE dengan lebih ketepatan: lebih banyak Qubit

Kita boleh memperluaskan konsep mudah ini kepada algoritma yang lebih kompleks dengan ketepatan sewenang-wenangnya. Jika bukannya hanya menggunakan Qubit 00 untuk mengukur fasa, kita menggunakan mm Qubit dari 00 hingga m1m-1, maka kita akan dapat menganggar fasa dengan mm bit ketepatan. Mari kita lihat bagaimana ini berfungsi:

Rajah litar algoritma QPE untuk berbilang Qubit. Hadamard dikenakan pada Qubit-Qubit data 0 hingga m-1. Kemudian satu siri Gate controlled-U dikenakan pada m Qubit pembantu. Akhirnya, songsang QFT dikenakan pada Qubit-Qubit dan ia diukur.

Litar QPE yang lebih tepat ini bermula sama seperti versi satu-bit: Hadamard dikenakan pada mm Qubit pertama, dan Qubit-Qubit yang lain disediakan dalam keadaan ψ|\psi\rangle, mewujudkan keadaan:

π1=12m/2ψ(0+1)(0+1)...(0+1)|\pi_1\rangle = \frac{1}{2^{m/2}}|\psi\rangle(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)...(|0\rangle+|1\rangle)

Sekarang, unitar-unitar terkawal dikenakan. Qubit 00 adalah kawalan untuk unitar UU yang sama seperti sebelumnya. Tetapi sekarang, Qubit 11 adalah kawalan untuk unitar U2U^2, yang hanyalah UU dikenakan dua kali. Jadi, nilai eigen U2U^2 adalah e22πiθe^{2*2\pi i \theta}. Secara umumnya, setiap Qubit kk dari 0 hingga m1m-1 akan menjadi kawalan untuk unitar U2kU^{2^k}. Ini bermakna setiap Qubit ini akan mengalami tendangan balik fasa sebesar e2k2πiθe^{2^k*2\pi i \theta}. Ini menghasilkan keadaan:

π2=ψ12m/2(0+e2m12πiθ1)(0+e2m22πiθ1)...(0+e2πiθ1)|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} (|0\rangle+e^{2^{m-1}2\pi i \theta}|1\rangle)(|0\rangle+e^{2^{m-2}2\pi i \theta}|1\rangle)...(|0\rangle+e^{2\pi i \theta}|1\rangle)

Ini boleh ditulis semula sebagai jumlah atas keadaan asas pengkomputeran:

π2=ψ12m/2k=02m1e2πikθk|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} \sum_{k=0}^{2^{m}-1} e^{2\pi i k \theta} |k\rangle

Adakah jumlah itu kelihatan biasa? Ia adalah QFT! Ingat persamaan untuk jelmaan Fourier kuantum:

QFT2my=12mx=02m1ω2myxx \text{QFT}_{2^m}| y \rangle = \frac{1}{\sqrt{2^m}}\sum_{x=0}^{2^m-1}\omega_{2^m}^{y x} \vert x \rangle

Jadi, jika fasa θ=y/2m\theta = y/2^m untuk suatu integer yy antara 00 dan 2m12^m-1, maka mengambil songsang QFT bagi keadaan ini akan menghasilkan keadaan:

π3=ψy|\pi_3\rangle = |\psi\rangle \otimes |y\rangle

dan daripada y|y\rangle, kita boleh menentukan θ\theta.

Jika θ/2m\theta/2^m bukan gandaan integer, bagaimanapun, maka mengambil songsang QFT hanya akan menganggar θ\theta. Seberapa baik ia menganggar θ\theta akan bersifat kebarangkalian, bermakna kita tidak selalu mendapat anggaran terbaik, tetapi ia akan cukup hampir, dan semakin banyak Qubit mm yang kamu gunakan, semakin baik anggaran yang kamu akan dapat. Untuk mengetahui cara mengukur anggaran θ\theta ini, lihat pelajaran John Watrous tentang Anggaran fasa dan pemfaktoran dalam Asas algoritma kuantum.

Kesimpulan

Modul ini memberikan gambaran keseluruhan tentang apa itu QFT, bagaimana ia dilaksanakan pada komputer kuantum, dan betapa bergunanya ia dalam menyelesaikan masalah. Kita diberikan sedikit gambaran tentang kegunaannya apabila kita melihat bagaimana ia boleh digunakan dalam anggaran fasa kuantum untuk mengetahui tentang nilai eigen matriks unitar.

Konsep penting

  • Jelmaan Fourier Kuantum adalah analog kuantum bagi Jelmaan Fourier Diskret.
  • QFT adalah contoh penjelmaan asas.
  • Prosedur Anggaran Fasa Kuantum bergantung pada mekanisme tendangan balik fasa daripada operasi unitar terkawal, serta songsang QFT.
  • QFT dan QPE keduanya merupakan subrutin yang banyak digunakan dalam pelbagai algoritma kuantum.

Soalan

Benar/Salah

  1. B/S Jelmaan Fourier Kuantum adalah analog kuantum bagi jelmaan Fourier diskret klasik (DFT).
  2. B/S QFT boleh dilaksanakan menggunakan hanya Gate Hadamard dan CNOT.
  3. B/S QFT adalah komponen utama algoritma Shor.
  4. B/S Keluaran Anggaran Fasa Kuantum adalah keadaan kuantum yang mewakili vektor eigen bagi pengoperasi.
  5. B/S QPE memerlukan penggunaan songsang Jelmaan Fourier Kuantum (QFT^\dag).
  6. B/S Dalam QPE, jika fasa ϕ\phi boleh diwakili dengan tepat menggunakan nn bit, algoritma memberikan keputusan yang betul dengan kebarangkalian 1.

Jawapan pendek

  1. Berapa banyak Qubit yang diperlukan untuk melaksanakan QFT pada sistem dengan 2n2^n titik data?
  2. Bolehkah QFT digunakan pada keadaan yang bukan keadaan asas pengkomputeran? Jika boleh, apakah yang berlaku?
  3. Bagaimana bilangan Qubit kawalan yang digunakan dalam QPE mempengaruhi resolusi anggaran fasa yang dihasilkan?

Masalah

  1. Gunakan pendaraban matriks untuk mengesahkan bahawa langkah-langkah dalam algoritma QFT memang menghasilkan matriks QFT4\text{QFT}_4:
QFT4=12(11111i1i11111i1i)\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}

(Kamu tidak perlu buat ini dengan tangan!)

Masalah cabaran

  1. Buat keadaan empat-Qubit yang merupakan superposisi sama rata bagi semua asas pengkomputeran ganjil: ψ=0001+0011+0101+0111+1001+1011+1101+1111|\psi\rangle = |0001\rangle + |0011\rangle + |0101\rangle + |0111\rangle +|1001\rangle +|1011\rangle +|1101\rangle +|1111\rangle. Kemudian lakukan QFT pada keadaan tersebut. Apakah keadaan yang dihasilkan? Terangkan mengapa hasilmu masuk akal, menggunakan pengetahuanmu tentang jelmaan Fourier.
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 Mac 2026