انتقل إلى المحتوى الرئيسي

تحويل فورييه الكمي

لهذه الوحدة من برنامج Qiskit في الفصول الدراسية، يجب أن يكون لدى الطلاب بيئة Python تعمل بشكل صحيح مع تثبيت الحزم التالية:

  • qiskit الإصدار v2.1.0 أو أحدث
  • qiskit-ibm-runtime الإصدار v0.40.1 أو أحدث
  • qiskit-aer الإصدار v0.17.0 أو أحدث
  • qiskit.visualization
  • numpy
  • pylatexenc

لإعداد الحزم وتثبيتها، راجع دليل تثبيت Qiskit. لتشغيل مهام على أجهزة حاسوب كمي حقيقية، يحتاج الطلاب إلى إنشاء حساب على IBM Quantum® باتباع الخطوات في دليل إعداد حساب IBM Cloud الخاص بك.

تم اختبار هذه الوحدة واستخدمت 13 ثانية من وقت وحدة معالجة الكم (QPU). هذا تقدير بحسن نية؛ قد يختلف استخدامك الفعلي.

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

المقدمة

تحويل فورييه هو أداة شائعة الاستخدام في الرياضيات والفيزياء ومعالجة الإشارات وضغط البيانات وعدد لا يحصى من المجالات الأخرى. النسخة الكمية من تحويل فورييه، التي تحمل الاسم المناسب "تحويل فورييه الكمي"، تُشكّل الأساس لبعض أهم الخوارزميات الكمية.

اليوم، بعد مراجعة سريعة لتحويل فورييه الكلاسيكي، سنتحدث عن كيفية تنفيذ تحويل فورييه الكمي على حاسوب كمي. ثم سنناقش أحد تطبيقات تحويل فورييه الكمي في خوارزمية تُسمى خوارزمية تقدير الطور. تقدير الطور الكمي هو روتين فرعي في خوارزمية التحليل إلى عوامل الشهيرة لشور، التي يُشار إليها أحيانًا بـ"جوهرة تاج الحوسبة الكمية". هذه الوحدة تمهّد لوحدة أخرى تتمحور بالكامل حول خوارزمية شور، لكنها مصمَّمة أيضًا لتكون قائمة بذاتها. تحويل فورييه الكمي خوارزمية رائعة ومفيدة في حد ذاتها!

تحويل فورييه الكلاسيكي

قبل أن نخوض في تحويل فورييه الكمي، دعنا نُذكّر أنفسنا بالنسخة الكلاسيكية أولًا. تحويل فورييه هو طريقة للتحويل من ما يُسمى "أساس" إلى آخر. يمكنك التفكير في الأساسَين كمنظورَين مختلفَين للمسألة ذاتها — كلاهما طريقة صالحة للتعبير عن دالة، لكن أحدهما قد يكون أكثر إيضاحًا من الآخر حسب المسألة المطروحة. بعض الأمثلة على أزواج الأساسات المرتبطة بتحويل فورييه هي الموضع والزخم، والوقت والتردد.

لنرَ مثالًا على كيفية مساعدة تحويل فورييه في معرفة النوتة التي تعزفها آلة موسيقية بناءً على شكل موجتها الصوتية. عادةً نرى الموجات ممثَّلة في أساس الوقت — أي أن سعة الموجة تُعبَّر عنها كدالة في الوقت.

Single sinusoidal signal plotted as a function of time.

يمكننا تطبيق تحويل فورييه على هذه الموجة للانتقال من أساس الوقت إلى أساس التردد:

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

في أساس التردد، يمكننا بوضوح رؤية ذروة واضحة عند حوالي 260 هرتز. هذا هو دو الوسطى (middle C)!

الآن، ربما كنت قادرًا على تحديد أن دو الوسطى كانت تُعزف دون الحاجة إلى تحويل فورييه، لكن ماذا لو عُزفت نوتات متعددة في وقت واحد؟ عندها تصبح الموجة أكثر تعقيدًا حين نرسمها في أساس الوقت:

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

لكن الطيف الترددي يُحدد بوضوح ثلاث ذرى:

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.

كان هذا وترًا مؤلفًا من دو الكبير (C major)، يعزف نوتات دو (C) وهـ (E) وصول (G).

هذا النوع من تحليل فورييه يساعدنا في استخلاص مكونات التردد من أي إشارة معقدة.

تحويل فورييه المتقطع

تحويل فورييه مفيد لعدد كبير من تطبيقات معالجة الإشارات. لكن في معظم هذه التطبيقات الواقعية (بما فيها مثال الموسيقى الذي استخدمناه)، نريد تحويل مجموعة متقطعة من NN نقطة بيانات — لا دالة مستمرة. في هذه الحالة، نستخدم تحويل فورييه المتقطع. يعمل تحويل فورييه المتقطع (DFT) على متجه (x0,...,xN1)(x_0, ..., x_{N-1}) ويربطه بالمتجه (y0,...,yN1)(y_0, ..., y_{N-1}) وفق الصيغة:

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

حيث نأخذ ωNjk=e2πijkN\omega_N^{jk} = e^{2\pi i \frac{jk}{N}}. (لاحظ أن هناك اصطلاحات أخرى تضع إشارة ناقص في الأس، لذا انتبه حين ترى DFT في مصادر أخرى.) تذكّر أن e2πijkNe^{2\pi i \frac{jk}{N}} دالة دورية ذات فترة Nk\frac{N}{k}. إذن، بالضرب في هذه الدالة، يكون تحويل فورييه في جوهره طريقة لتفكيك الدالة (المتقطعة) {xj}\{x_{j}\} إلى تركيب خطي من دوالها الدورية المكوِّنة، كل منها ذات فترة Nk\frac{N}{k}.

تحويل فورييه الكمي

الآن، رأينا كيف يُستخدم تحويل فورييه لتمثيل دالة كتركيب خطي من مجموعة جديدة من ما يُسمى "دوال الأساس". تحويلات الأساس تُجرى بانتظام على حالات الكيوبتات أيضًا. على سبيل المثال، يمكن التعبير عن حالة كيوبت واحد ψ|\psi\rangle في الأساس الحسابي ψ=c00+c11|\psi\rangle = c_0 |0\rangle + c_1 |1\rangle مع حالتَي الأساس 0|0\rangle و1|1\rangle، أو في أساس XX على الشكل ψ=c+++c|\psi\rangle = c_+ |+\rangle + c_- |-\rangle مع حالتَي الأساس +=12(0+1)|+\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) و=12(01)|-\rangle = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle). كلاهما صحيح بالقدر ذاته، لكن أحدهما قد يكون أكثر طبيعية من الآخر حسب نوع المسألة التي تحاول حلها.

يمكن أيضًا التعبير عن حالات الكيوبتات في أساس فورييه حيث تُعبَّر الحالة كتركيب خطي من حالات أساس فورييه ϕy|\phi_y\rangle، بدلًا من حالات الأساس الحسابي المعتادة x|x\rangle. للقيام بذلك، تحتاج إلى تطبيق تحويل فورييه الكمي (QFT):

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

مع ωNyx=e2πiyxN\omega_N^{yx} = e^{\frac{2\pi i y x}{N}} كما سبق، وNN هو عدد حالات الأساس في نظامك الكمي. لاحظ أننا نعمل الآن مع الكيوبتات، لذا فـmm كيوبت يعطيك 2m2^m حالة أساس، إذن N=2mN=2^m. هنا، تُكتب حالات الأساس كرقم واحد x|x\rangle حيث تتراوح xx من 00 إلى N1N-1، لكنك في الغالب سترى حالات الأساس مكتوبة على الشكل 00...00|00...00\rangle, 00...01|00...01\rangle, 00...11|00...11\rangle, ..., 11...11|11...11\rangle، حيث يمثل كل رقم ثنائي حالة الكيوبت من 0 إلى m1m-1 من اليمين إلى اليسار. هناك طريقة سهلة لتحويل هذه الحالات الثنائية إلى رقم واحد: ببساطة عاملها كأرقام ثنائية! إذن، 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، وهكذا حتى 11...11=2m1=N1|11...11\rangle = |2^m -1\rangle = |N-1\rangle.

بناء الحدس لحالات أساس فورييه

إذن، استعرضنا للتو ما هي حالات الأساس الحسابي وكيفية ترتيبها: هي مجموعة الحالات التي يكون فيها كل كيوبت إما في 00 أو 11، ونرتبها من الحالة التي تكون فيها جميع الكيوبتات 00، وهي 00...00|00...00\rangle، إلى الحالة التي تكون فيها جميعها 11، وهي 11...11|11...11\rangle.

لكن كيف نفهم حالات أساس فورييه؟ جميع حالات أساس فورييه هي تراكبات متساوية لجميع حالات الأساس الحسابي، لكن كل حالة تختلف عن الأخرى في دورية الطور لمكوناتها. لفهم هذا بشكل أكثر تحديدًا، دعنا نلقي نظرة على حالات أساس فورييه الأربع لنظام مؤلف من كيوبتَين. أدنى حالة فورييه هي التي لا يتغير طورها إطلاقًا:

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

يمكننا تصوير هذه الحالة برسم السعة العقدية لكل من حدودها. الخط الأحمر يُرشد العين ليظهر لك كيف يدور طور هذه السعة حول المستوى العقدي كدالة في حالة الأساس الحسابي. بالنسبة لـϕ0|\phi_0\rangle، يبقى الطور ثابتًا:

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

حالة أساس فورييه التالية هي التي تدور أطوار مكوناتها مرة واحدة من 00 إلى 2π2\pi:

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

ويمكننا رؤية هذا الدوران في مخطط السعة العقدية مقابل حالة الأساس الحسابي:

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.

إذن، كل حالة لديها طور أعلى بـ2π/42\pi/4 راديان من الحالة السابقة لها عند ترتيبها بالطريقة المعيارية، لأن لدينا في هذا المثال أربع حالات أساس (N=4N=4). حالة الأساس التالية تدور من 0 إلى 2π2\pi مرتَين:

ϕ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.

أخيرًا، أعلى مكون في فورييه هو الأسرع تغيرًا في الطور. في مثالنا بكيوبتَين، هو الذي تدور أطواره من 0 إلى 2π2\pi ثلاث مرات:

ϕ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.

بوجه عام، لحالة مؤلفة من mm كيوبت، ستكون هناك 2m2^m حالة أساس فورييه، تتراوح ترددات تغير طورها من ثابت بالنسبة لـϕ0|\phi_0\rangle، إلى سريع التغير بالنسبة لـϕ2m1|\phi_{2^m-1}\rangle، مكتملةً 2m12^m-1 دورانًا حول 2π2\pi عبر التراكب الفائق للحالات. إذن، حين نطبق QFT على حالة كمية، فنحن في الجوهر نُجري نفس التحليل الأساسي الذي أجريناه على الموجة الموسيقية في المقدمة. نحن نُحدد مكونات التردد في فورييه التي تُسهم في بناء الحالة الكمية المعنية.

جرّب بعض أمثلة QFT

لنواصل بناء حدسنا لتحويل فورييه الكمي من خلال إنشاء حالة في الأساس الحسابي، ثم نرى ما يحدث حين نطبق QFT عليها. في الوقت الحالي، سنتعامل مع QFT كصندوق أسود نطبقه باستخدام QFTGate من مكتبة دوائر Qiskit. لاحقًا، سنكشف ما بداخله لنرى كيف يُنفَّذ.

نبدأ بتحميل الحزم الضرورية واختيار جهاز لتشغيل دائرتنا عليه:

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

إذا لم يكن لديك وقت متاح في حسابك أو كنت تريد استخدام محاكٍ لأي سبب، يمكنك تشغيل الخلية أدناه لإعداد محاكٍ يحاكي الجهاز الكمي الذي اخترناه أعلاه:

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

حالة أساس حسابية واحدة

أولًا، دعونا نجرّب تحويل حالة أساس حسابية واحدة. نبدأ بإنشاء حالة حسابية عشوائية:

# 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

الآن، دعونا نطبّق تحويل فورييه على هذه الحالة باستخدام 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)

ناتج خلية الكود السابقة

كما ترى، نقيس احتمالات كل حالة وهي متساوية تقريبًا مع بعض الضوضاء التجريبية والإحصائية. أي أنه إذا أخذت التحويل QFT لحالة أساسية حسابية واحدة، فإن النتيجة هي تراكب متساوٍ لجميع الحالات. إذا كنت مطّلعًا على تحويلات فورييه، فهذا ليس مفاجئًا. من المبادئ الأساسية التي تساعدنا في بناء ربط حدسي بين دالة وتحويل فورييه الخاص بها: أن عرض الدالة يتناسب عكسيًا مع عرض تحويل فورييه الخاص بها. أي أن شيئًا مضغوطًا جدًا في الزمن، مثل نبضة قصيرة جدًا، يحتاج مدى واسعًا من الترددات لتوليد تلك النبضة. وبالتالي ستكون الإشارة واسعة جدًا في فضاء فورييه.

هذه الحقيقة مرتبطة فعلًا بعدم اليقين الكمي! مبدأ عدم اليقين لهايزنبرغ يُصاغ عادةً هكذا: ΔxΔp/2\Delta x \Delta p \ge \hbar / 2. فلو كان عدم اليقين في xx (وهو Δx\Delta x) صغيرًا، يجب أن يكون عدم اليقين في الزخم (Δp\Delta p) كبيرًا، والعكس بالعكس. وقد تبيّن أن التحويل من أساس الموضع xx إلى أساس الزخم pp يتم عبر تحويل فورييه.

ملاحظة: تذكّر أننا نقيس الاحتمالات في كل حالة من حالات الأساس، فنحن نفقد معلومات عن الأطوار النسبية بين أجزاء التراكب المختلفة. فرغم أن التحويل QFT لأي حالة أساسية حسابية واحدة سيعطي نفس التوزيع المتساوي في الاحتمالات على جميع حالات الأساس، إلا أن الأطوار ليست بالضرورة متطابقة.

حالتان أساسيتان حسابيتان

الآن، دعونا نرَ ماذا يحدث عندما نُحضّر تراكبًا من حالات الأساس الحسابية. ماذا تتوقع أن يكون شكل تحويل فورييه في هذه الحالة؟

دعونا نختار التراكب:

ψ=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")

ناتج خلية الكود السابقة

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

ناتج خلية الكود السابقة

الآن، دعونا نطبّق تحويل فورييه على هذه الحالة باستخدام 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)

مخرجات خلية الكود السابقة

قد تكون هذه النتيجة مفاجئة قليلًا. يبدو أن التحويل الفوريه الكمي للحالة ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) هو تراكب لجميع الحالات الأساسية الزوجية. لكن إذا عدنا إلى تصوّرنا لكل حالة أساسية ϕy|\phi_y\rangle، وكيف أن طور كل مكوّن يلتف حول 2π2\pi بمقدار yy مرة، فإن السبب وراء هذه النتيجة قد يصبح أوضح.

تحقق من فهمك

اقرأ السؤال/الأسئلة أدناه، فكّر في إجابتك، ثم اضغط على المثلث لإظهار الحل.

باستخدام التلميح أعلاه، فسّر لماذا النتيجة التي حصلنا عليها للتحويل الفوريه الكمي للحالة ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) متوقعة.

الجواب:

الحالة الأصلية لديها فرق طور نسبي يساوي 0 (أو مضاعف صحيح من 2π2\pi) بين جزأي التراكب. أي أننا نعلم أن هذه الحالة تحتوي على مكوّنات فورييه أطوارها تتطابق بنفس الطريقة: تلك التي لديها إزاحة طور 0 بين الحد |0000> والحد |1000>. كل حالة أساس فوريه ϕy|\phi_y\rangle مكوّنة من حدود يتراكم طورها بمعدل 2πy/N2\pi y/N، أي أنه عندما نرتبها بالطريقة المعتادة، كل حد في التراكب لديه طور أكبر بـ 2πy/N2\pi y/N من الحد الذي قبله. فعند نقطة المنتصف N/2N/2، نريد أن يكون الطور 2πy/NN/22\pi y/N * N/2 مضاعفًا صحيحًا من 2π2\pi. يتحقق هذا عندما تكون yy زوجية.

أي تراكب من الحالات الحسابية يقابل تحويلاً فوريه كمياً فيه قمم على كل رقم ثنائي فردي؟

الجواب:

إذا أخذت التحويل الفوريه الكمي للحالة ψ=0N/2\psi = |0\rangle - |N/2\rangle، فسوف ترى قممًا على كل حالة برقم ثنائي فردي.

تحليل خوارزمية التحويل الفوريه الكمي

الآن وقد اكتسبنا حدسًا أكبر حول العلاقة بين حالات الكيوبت في الأساس الحسابي وأساس فورييه، دعونا نتعمق في خوارزمية التحويل الفوريه الكمي نفسها. أي بوابات نطبّقها فعليًا على الحاسوب الكمي لتحقيق هذا التحويل؟

دعونا نبدأ بشيء بسيط، كيوبت واحد. أي أنه سيكون لدينا حالتان أساسيتان. QFT2_2 تحوّل الحالات الأساسية الحسابية 0|0\rangle و1|1\rangle إلى حالات أساس فورييه ϕ0\phi_0 وϕ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)

تحقق من فهمك

اقرأ السؤال/الأسئلة أدناه، فكّر في إجابتك، ثم اضغط على المثلث لإظهار الحل.

استخدم معادلة التحويل الفوريه الكمي من القسم السابق للتحقق من هاتين الحالتين الأساسيتين لفورييه أعلاه.

الجواب:

الصيغة العامة للتحويل الفوريه الكمي هي:

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

لكيوبت واحد (n=1n=1N=2n=2N=2^n=2، وωNxy=e2πiyx2\omega_N^{xy} = e^{2\pi i \frac {y x}{2}}. فيكون عندنا

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

انظر إلى هاتين المعادلتين. ربما تعرف مسبقًا بوابة كمية يمكن استخدامها لتطبيق هذا التحويل. أي أن هناك بوابة تحوّل الحالات الأساسية الحسابية 0|0\rangle و1|1\rangle إلى حالات أساس فورييه المقابلة ϕ0|\phi_0\rangle وϕ1|\phi_1\rangle. إنها بوابة هادامار! يصبح هذا أوضح إذا قدّمنا تمثيل المصفوفة لعملية 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

إذا لم تكن معتادًا على هذا الترميز للتعبير عن عامل كمي، فلا مشكلة! هو طريقة لتمثيل مصفوفة N×NN \times N، حيث xx وyy يرمّزان الأعمدة والصفوف بالترتيب، من 00 إلى N1N-1، وωNxy\omega_N^{xy} هي قيمة هذا المدخل بالتحديد. أي أن المدخل في العمود الصفري والصف الثاني مثلًا، يكون ببساطة ωN0,2=e2πi0×2N=1\omega_N^{0,2} = e^{2 \pi i \frac{0 \times 2}{N}} = 1.

في هذا التمثيل، كل حالة أساسية حسابية مرتبطة بأحد متجهات الأساس:

(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}.

إذا أردت التعلم عن هذا التمثيل بشكل أعمق، انظر درس جون واتروس عن الأنظمة المتعددة في مقرر أساسيات المعلومات الكمية.

دعونا نحاول بناء مصفوفة QFT4_4. باستخدام المعادلة أعلاه، نجد أن

\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\}

لتطبيق هذه المصفوفة على حاسوب كمي، سنحتاج إلى معرفة أي مجموعة من البوابات المطبّقة على أي كيوبتات ستعطينا تحويلًا أحاديًا يطابق المصفوفة أعلاه. نعرف مسبقًا أن إحدى البوابات المطلوبة هي بوابة هادامار. بوابة أخرى سنحتاجها هي بوابة الطور المتحكَّم بها، التي تطبّق طورًا نسبيًا α\alpha على حالة الكيوبت الهدف، شريطة أن يكون الكيوبت المتحكِّم في الحالة 1|1\rangle. بصورة مصفوفة تبدو كالتالي:

\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\}

بما أن الحالة 11|11\rangle فقط هي التي تتغير، فعمليًا لا يهم أي كيوبت هو "المتحكِّم" وأيهم هو "الهدف". ستكون النتيجة نفسها في كلتا الحالتين.

وأخيرًا، سنحتاج أيضًا إلى بعض بوابات SWAP. بوابة SWAP تبادل حالتي كيوبتين. تبدو هكذا:

\text\{SWAP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end\{pmatrix\}

الإجراء لبناء دائرة QFT2m_{2^m} على mm كيوبت هو إجراء تكراري — تطبّق أولًا QFT2m1_{2^{m-1}} على الكيوبتات من 11 إلى m1m-1، ثم تضيف بعض البوابات بين الكيوبت 00 وبقية الـ m1m-1 كيوبتات. لكن لتطبيق QFT2m1_{2^{m-1}}، تحتاج أولًا إلى تطبيق QFT2m2_{2^{m-2}} على الكيوبتات من 2 إلى m1m-1، ثم تضيف بعض البوابات بين الكيوبت 1 والكيوبتات الباقية من 22 إلى m1m-1. الأمر مثل دمية ماتريوشكا الروسية: كل دمية تضيف عاملًا مضاعفًا لاثنين في بُعد دائرة التحويل الفوريه الكمي، مع أصغر دمية في المنتصف تمامًا، وهي QFT2_2، أو بوابة هادامار.

لوضع دمية داخل الدمية الأكبر منها بحجم، مما يزيد بُعد التحويل الفوريه الكمي بعامل اثنين، تتبع دائماً نفس الإجراء:

  1. أولًا، طبّق QFT2m1_{2^{m-1}} على أسفل m1m-1 كيوبت. هذه هي "الدمية الصغيرة" في مجموعة دمى ماتريوشكا الروسية التي ستضعها قريبًا داخل الدمية الأكبر.
  2. استخدم الكيوبت التالي فوقه كـ control، وطبّق بوابات الطور المتحكَّم بها على كل واحد من أسفل m1m-1 كيوبت، مع أطوار للحالات الأساسية القياسية لكل واحد من الـ m1m-1 كيوبت المتبقية.
  3. طبّق هادامار على نفس الكيوبت الأعلى الذي استُخدم كـ control في بوابات الطور.
  4. استخدم بوابات SWAP لإعادة ترتيب الكيوبتات بحيث يصبح البت الأقل أهمية (العلوي) هو البت الأكثر أهمية (السفلي)، وتنتقل جميع الباقية للأعلى بمقدار واحد.

لقد استخدمنا بالفعل دالة QFTGate من مكتبة دوائر Qiskit، لكن الآن دعونا نتفحّص الجزء الداخلي لبعض بوابات QFT هذه للتحقق من الإجراء المذكور أعلاه. يمكننا القيام بذلك باستخدام 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

إذن، آمل أنك من خلال أول أربع QFTs بدأت ترى كيف أن كل واحدة منها متداخلة داخل الأكبر منها. ربما لاحظت، مع ذلك، أن بعض بوابات الطور ليست تمامًا كما هو مقرر في الإجراء الذي حددناه أعلاه، وأن SWAP لا تظهر بعد كل روتين فرعي، بل فقط في نهاية الـ QFT الكاملة. هذا يوفّر علينا بوابات غير ضرورية، التي كانت ستجعل الدائرة تستغرق وقتًا أطول وتكون أكثر عرضة للأخطاء. بدلًا من تطبيق SWAP بعد كل دمية متداخلة، تتتبع الدائرة أين يُفترض أن تكون حالة كل كيوبت وتضبط الكيوبتات التي تُطبَّق عليها بوابات الطور بناءً على ذلك. ثم، مجموعة نهائية من الـ SWAPs في النهاية تضع كل شيء في مكانه الصحيح.

تطبيق QFT: تقدير الطور

دعونا نرَ كيف يمكن استخدام QFT لحل مشكلة مفيدة في الحوسبة الكمومية. حساب تحويل فورييه الكمومي العكسي هو خطوة ضرورية في خوارزمية تُعرف بـ تقدير الطور الكمومي (QPE)، التي هي بنفسها روتين فرعي في كثير من الخوارزميات الأخرى، منها "جوهرة التاج" في الخوارزميات الكمومية، خوارزمية شور للتحليل إلى عوامل.

هدف QPE هو تقدير القيم الذاتية لمؤثر وحدوي. المؤثرات الوحدوية منتشرة في الحوسبة الكمومية، وفي الغالب، إيجاد القيم الذاتية لأشعة القيم الذاتية المرتبطة بها هي خطوة ضرورية في خوارزمية أكبر. بحسب المشكلة، يمكن أن تمثّل القيمة الذاتية طاقة هاميلتوني في مسألة من نوع المحاكاة، أو يمكن أن تساعدنا في إيجاد العوامل الأولية لعدد في خوارزمية شور، أو يمكن أن تحتوي على معلومات أساسية أخرى. QPE هو من أهم وأوسع الروتينات الفرعية المستخدمة في الحوسبة الكمومية.

إذن، ما علاقة ذلك بتحويل فورييه الكمومي؟ حسنًا، كما قد تتذكر، أي قيمة ذاتية λ\lambda لمؤثر وحدوي لها مقدار λ=1|\lambda| = 1. فيمكننا كتابة كل قيمة ذاتية كعدد مركّب ذي مقدار واحد:

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

حيث θ\theta عدد حقيقي بين 0 و 1. إذا أردت مزيدًا من المعلومات عن المصفوفات الوحدوية، انظر درس جون واتروس عن هذا الموضوع في أساسيات المعلومات الكمومية.

لاحظ أن λ\lambda دورية في θ\theta. بالفعل، قد يوحي لك هذا بأن QFT قد يكون مرتبطًا بالأمر، بما أننا رأينا مدى فائدة QFTs في تحليل الدوال الدورية. فيما يلي، سنسير عبر الخوارزمية ونرى بالضبط كيف يأتي QFT في الصورة.

كيف يعمل QPE

أولًا، سنبدأ بأبسط خوارزمية QPE، التي تقدّر الطور تقريبًا لرقم ثنائي واحد من الدقة. بمعنى آخر، يمكن لهذه الخوارزمية أن تميّز بين θ=0\theta = 0 و θ=1/2\theta = 1/2، لكنها لا تستطيع تحقيق دقة أفضل من ذلك. إليك مخطط الدائرة:

Circuit diagram of the QPE algorithm for a single data qubit. A Hadamard is applied to the data qubit. Next, the algorithm uses another helper qubit, on which a controlled-U gate is applied, with the data qubit as the control. After another Hadamard on qubit 0, the qubits are measured.

تُجهَّز الكيوبتات في الحالة π0=ψ0|\pi_0\rangle = |\psi\rangle|0\rangle، حيث الكيوبت 00 في الحالة 0|0\rangle والكيوبتات المتبقية في الحالة ψ|\psi\rangle، التي هي حالة ذاتية لـ UU. بعد أول هادامار، تصبح حالة الكيوبت:

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

البوابة التالية هي بوابة "controlled-UU". هذه تطبّق العملية الوحدوية UU على الكيوبتات السفلية التي في الحالة ψ|\psi\rangle إذا كان الكيوبت 0 في الحالة 1|1\rangle، لكنها لا تفعل شيئًا لـ ψ|\psi\rangle إذا كان الكيوبت 0 في الحالة 0|0\rangle. هذا يحوّل الكيوبتات إلى الحالة:

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

حدث شيء غريب: بوابة controlled-UU تستخدم الكيوبت 00 فقط كـ control qubit، فقد يتبادر إلى ذهنك أن هذه البوابة لن تغيّر حالة الكيوبت 0 إطلاقًا. لكن بطريقة ما، هي تغيّره! حتى لو أن العملية طُبِّقت على الكيوبتات السفلية، فإن الأثر الكلي للبوابة هو تغيير طور الكيوبت 00. هذا ما يُعرف بـ "آلية ركلة الطور"، وتُستخدم في كثير من الخوارزميات الكمومية، منها خوارزميتا دويتش-جوزا وغروفر. إذا أردت التعلم أكثر عن آلية ركلة الطور، انظر درس جون واتروس عن خوارزميات الاستعلام الكمومي في أساسيات الخوارزميات الكمومية.

بعد ركلة الطور، نطبّق هادامار آخر على الكيوبت 00، الذي ينتج عنه الحالة:

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

إذن، عندما نقيس الكيوبت 00 في النهاية، سنقيس 0|0\rangle بيقين 100% إذا كان θ=0\theta = 0 وسنقيس 1|1\rangle بيقين 100% إذا كان θ=12\theta = \frac{1}{2} (إذا كان حاسوبنا الكمومي مثاليًا بدون ضوضاء). إذا كانت θ\theta قيمة أخرى غير هذه، فإن القياس النهائي يكون احتماليًا فقط ولا يخبرنا بالكثير.

QPE بدقة أعلى: كيوبتات أكثر

يمكننا توسيع هذا المفهوم البسيط إلى خوارزمية أكثر تعقيدًا بدقة اختيارية. إذا استخدمنا بدلًا من الكيوبت 00 فقط لقياس الطور، mm كيوبت من 0 إلى m1m-1، فسنتمكن عندها من تقدير الطور بـ mm بت من الدقة. دعونا نرَ كيف يعمل ذلك:

Circuit diagram of the QPE algorithm for a multiple qubits. Hadamards are applied to the data qubits 0 through m-1. Then a series of controlled-U gates are applied to the m helper qubits. Finally, an inverse QFT is applied to the qubits and they are measured.

تبدأ دائرة QPE الأكثر دقة هذه بنفس طريقة النسخة ذات البت الواحد: تُطبَّق الهادامارات على أول mm كيوبت، وتُجهَّز الكيوبتات المتبقية في الحالة ψ|\psi\rangle، مما ينشئ الحالة:

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

الآن، تُطبَّق الوحدات المتحكَّم بها. الكيوبت 00 هو الـ control لنفس الوحدي UU كما سبق. لكن الآن، الكيوبت 11 هو الـ control للوحدي U2U^2، الذي هو ببساطة UU مطبّق مرتين. إذن، القيمة الذاتية لـ U2U^2 هي e22πiθe^{2*2\pi i \theta}. بشكل عام، كل كيوبت kk من 0 إلى m1m-1 سيكون الـ control للوحدي U2kU^{2^k}. هذا يعني أن كل واحد من هذه الكيوبتات سيختبر ركلة طور بمقدار e2k2πiθe^{2^k*2\pi i \theta}. ينتج عن ذلك الحالة:

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

يمكن إعادة كتابة هذه الحالة كمجموع على الحالات الأساسية الحسابية:

π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

هل المجموع يبدو مألوفاً؟ إنه QFT! تذكّر المعادلة لتحويل فورييه الكمومي:

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

إذن، لو الطور θ=y/2m\theta = y/2^m لعدد صحيح yy بين 00 و 2m12^m-1، فأخذ QFT العكسي لهذه الحالة سينتج الحالة:

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

ومن y|y\rangle، يمكننا استنتاج θ\theta.

إذا لم يكن θ/2m\theta/2^m مضاعفًا صحيحًا، فإن أخذ QFT العكسي سيقدّر θ\theta تقريبيًا فقط. مدى جودة تقريبه لـ θ\theta سيكون احتماليًا، أي أننا لن نحصل دائمًا على أفضل تقريب، لكنه سيكون قريبًا جدًا، وكلما زادت الكيوبتات mm التي تستخدمها، حصلت على تقريب أفضل. لتتعلم كيف تقيس هذا التقريب لـ θ\theta، راجع درس جون واتروس عن تقدير الطور والتحليل إلى عوامل في أساسيات الخوارزميات الكمومية.

خلاصة

هذه الوحدة أعطت نظرة عامة عن ماهية QFT، وكيف يُطبَّق على حاسوب كمومي، ومدى فائدته في حل المشكلات. قدّمنا لك لمحة عن فائدته عندما رأينا كيف يمكن استخدامه في تقدير الطور الكمومي للتعرف على القيم الذاتية لمصفوفة وحدوية.

المفاهيم الأساسية

  • تحويل فورييه الكمومي هو النظير الكمومي لتحويل فورييه المنفصل الكلاسيكي.
  • QFT هو مثال على تحويل الأساس.
  • إجراء تقدير الطور الكمومي يعتمد على آلية ركلة الطور من عمليات الوحدوية المتحكَّم بها، فضلاً عن QFT العكسي.
  • QFT وQPE كلاهما روتينات فرعية مستخدمة على نطاق واسع في عدد كبير من الخوارزميات الكمومية.

الأسئلة

صح/خطأ

  1. ص/خ تحويل فورييه الكمومي هو النظير الكمومي لتحويل فورييه المنفصل الكلاسيكي (DFT).
  2. ص/خ يمكن تطبيق QFT باستخدام بوابات هادامار وCNOT فقط.
  3. ص/خ QFT هو مكوّن أساسي في خوارزمية شور.
  4. ص/خ ناتج تقدير الطور الكمومي هو حالة كمومية تمثّل الشعاع الذاتي للمؤثر.
  5. ص/خ QPE يتطلب استخدام تحويل فورييه الكمومي العكسي (QFT^\dag).
  6. ص/خ في QPE، إذا كان الطور ϕ\phi قابلًا للتمثيل بدقة بـ nn بت، فإن الخوارزمية تعطي النتيجة الصحيحة باحتمال 1.

إجابات قصيرة

  1. كم عدد الكيوبتات اللازمة لتطبيق QFT على نظام بـ 2n2^n نقطة بيانات؟
  2. هل يمكن استخدام QFT على حالة ليست حالة أساسية حسابية؟ إذا نعم، ماذا يحدث؟
  3. كيف يؤثر عدد كيوبتات الـ control المستخدمة في QPE على دقة تقدير الطور الناتج؟

مسائل

  1. استخدم ضرب المصفوفات للتحقق من أن الخطوات في خوارزمية QFT بالفعل تنتج مصفوفة 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}

(لا تحتاج إلى القيام بذلك يدويًا!)

مسائل تحدي

  1. أنشئ حالة من أربعة كيوبتات تكون تراكبًا متساويًا لجميع القواعد الحسابية الفردية: ψ=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. ثم طبّق QFT على الحالة. ما هي الحالة الناتجة؟ اشرح لماذا نتيجتك منطقية باستخدام معرفتك بتحويلات فورييه.