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

خوارزمية دويتش-يوزسا

خوارزمية دويتش تتفوق على جميع الخوارزميات الكلاسيكية في مسألة الاستعلام، لكن الميزة محدودة نسبياً: استعلام واحد مقابل اثنين. خوارزمية دويتش-يوزسا تمتد لتوسيع هذه الميزة — بل يمكن استخدامها لحل مسألتَي استعلام مختلفتَين.

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

خوارزمية دويتش-يوزسا

بالطبع، لم نتحدث بعد عن المسائل التي تحلها هذه الخوارزمية؛ وسيأتي ذلك في القسمين التاليين.

مسألة دويتش-يوزسا

سنبدأ بمسألة الاستعلام التي صُمِّمت خوارزمية دويتش-يوزسا في الأصل لحلها، والمعروفة بـمسألة دويتش-يوزسا.

الدالة المُدخَلة في هذه المسألة تأخذ الشكل f:ΣnΣf:\Sigma^n \rightarrow \Sigma لعدد صحيح موجب nn اعتباطي. كما في مسألة دويتش، المهمة هي إخراج 00 إذا كانت ff ثابتة و11 إذا كانت ff متوازنة، أي أن عدد السلاسل المُدخَلة التي تأخذ عندها الدالة القيمة 00 يساوي عدد السلاسل التي تأخذ عندها القيمة 11.

لاحظ أنه حين يكون nn أكبر من 11، توجد دوال بالشكل f:ΣnΣf:\Sigma^n \rightarrow \Sigma ليست ثابتة ولا متوازنة. مثلاً، الدالة f:Σ2Σf:\Sigma^2\rightarrow\Sigma المعرَّفة كالتالي:

f(00)=0f(01)=0f(10)=0f(11)=1\begin{aligned} f(00) & = 0 \\ f(01) & = 0 \\ f(10) & = 0 \\ f(11) & = 1 \end{aligned}

لا تندرج تحت أيٍّ من الفئتين. في مسألة دويتش-يوزسا، ببساطة لا نهتم بمثل هذه الدوال — فهي تُعدّ مُدخلات "لا يهم أمرها". أي أن لدينا في هذه المسألة وعداً بأن ff إما ثابتة أو متوازنة.

مسألة دويتش-يوزسا

المُدخَل: دالة f:{0,1}n{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
الوعد: ff إما ثابتة أو متوازنة
المُخرَج: 00 إذا كانت ff ثابتة، 11 إذا كانت ff متوازنة

خوارزمية دويتش-يوزسا، باستعلامها الواحد، تحل هذه المسألة بالطريقة التالية: إذا كانت جميع نتائج القياس الـnn تساوي 00، فالدالة ff ثابتة؛ وإلا، إذا كانت إحدى نتائج القياس تساوي 11، فالدالة ff متوازنة. طريقة أخرى للتعبير عن ذلك هي أن الدائرة الموصوفة أعلاه تتبعها خطوة معالجة كلاسيكية تحسب فيها العملية OR لنتائج القياس لإنتاج الخرج.

تحليل الخوارزمية

لتحليل أداء خوارزمية دويتش-يوزسا في مسألة دويتش-يوزسا، من المفيد أن نبدأ بالتفكير في تأثير طبقة واحدة من بوابات هادامار. يمكن التعبير عن عملية هادامار كمصفوفة بالطريقة المعتادة:

H=(12121212),H = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\[2mm] \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix},

لكن يمكننا أيضاً التعبير عن هذه العملية من خلال تأثيرها على حالات الأساس القياسية:

H0=120+121H1=120121.\begin{aligned} H \vert 0\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} \vert 1 \rangle\\[3mm] H \vert 1\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle - \frac{1}{\sqrt{2}} \vert 1 \rangle. \end{aligned}

يمكن دمج هاتين المعادلتين في صيغة واحدة:

Ha=120+12(1)a1=12b{0,1}(1)abb,H \vert a \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} (-1)^a \vert 1 \rangle = \frac{1}{\sqrt{2}} \sum_{b\in\{0,1\}} (-1)^{ab} \vert b\rangle,

وهذا صحيح لكلتا قيمتَي aΣa\in\Sigma.

لنفترض الآن أنه بدلاً من كيوبت واحد لدينا nn كيوبت، وتُجرى عملية هادامار على كل منها. العملية المشتركة على الكيوبتات الـnn يصفها الجداء التنسوري HHH\otimes \cdots \otimes H (nn مرة)، الذي نكتبه اختصاراً HnH^{\otimes n}. باستخدام الصيغة أعلاه ثم التوسيع والتبسيط، يمكننا التعبير عن تأثير هذه العملية المشتركة على حالات الأساس القياسية لـnn كيوبت كالتالي:

Hnxn1x1x0=(Hxn1)(Hx0)=(12yn1Σ(1)xn1yn1yn1)(12y0Σ(1)x0y0y0)=12nyn1y0Σn(1)xn1yn1++x0y0yn1y0.\begin{aligned} & H^{\otimes n} \vert x_{n-1} \cdots x_1 x_0 \rangle \\ & \qquad = \bigl(H \vert x_{n-1} \rangle \bigr) \otimes \cdots \otimes \bigl(H \vert x_{0} \rangle \bigr) \\ & \qquad = \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{n-1}\in\Sigma} (-1)^{x_{n-1} y_{n-1}} \vert y_{n-1} \rangle \Biggr) \otimes \cdots \otimes \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{0}\in\Sigma} (-1)^{x_{0} y_{0}} \vert y_{0} \rangle \Biggr) \\ & \qquad = \frac{1}{\sqrt{2^n}} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle. \end{aligned}

هنا نكتب السلاسل الثنائية ذات الطول nn على شكل xn1x0x_{n-1}\cdots x_0 وyn1y0y_{n-1}\cdots y_0، وذلك باتباع اصطلاح ترقيم Qiskit.

تمنحنا هذه الصيغة أداة مفيدة لتحليل الدائرة الكمومية أعلاه. بعد تنفيذ الطبقة الأولى من بوابات هادامار، تكون حالة الكيوبتات الـn+1n+1 (بما فيها الكيوبت الأيسر/السفلي الذي يُعامَل بصورة منفصلة عن البقية):

(H1)(Hn00)=12nxn1x0Σnxn1x0.\bigl( H \vert 1 \rangle \bigr) \bigl( H^{\otimes n} \vert 0 \cdots 0 \rangle \bigr) = \vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \vert x_{n-1} \cdots x_0 \rangle.

عند تنفيذ العملية UfU_f، تتحوّل هذه الحالة إلى:

12nxn1x0Σn(1)f(xn1x0)xn1x0\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \vert x_{n-1} \cdots x_0 \rangle

وذلك من خلال ظاهرة الركل الطوري نفسها التي رأيناها في تحليل خوارزمية دويتش.

ثم تُنفَّذ الطبقة الثانية من بوابات هادامار، التي تحوّل هذه الحالة (بالصيغة أعلاه) إلى:

12nxn1x0Σnyn1y0Σn(1)f(xn1x0)+xn1yn1++x0y0yn1y0.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0) + x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle.

يبدو هذا التعبير معقداً نوعاً ما، ولا يمكن استنتاج الكثير عن احتمالات الحصول على نتائج قياس مختلفة دون معرفة المزيد عن الدالة ff.

لحسن الحظ، كل ما نحتاج معرفته هو احتمال أن تكون جميع نتائج القياس 00 — لأن ذلك هو احتمال أن تقرر الخوارزمية أن ff ثابتة. هذا الاحتمال له صيغة بسيطة:

12nxn1x0Σn(1)f(xn1x0)2={1إذا كانت f ثابتة0إذا كانت f متوازنة\Biggl\vert \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \Biggr\vert^2 = \begin{cases} 1 & \text{إذا كانت $f$ ثابتة}\\[1mm] 0 & \text{إذا كانت $f$ متوازنة} \end{cases}

بمزيد من التفصيل: إذا كانت ff ثابتة، فإما أن f(xn1x0)=0f(x_{n-1}\cdots x_0) = 0 لكل سلسلة xn1x0x_{n-1}\cdots x_0، وعندئذٍ تكون قيمة المجموع 2n2^n، أو f(xn1x0)=1f(x_{n-1}\cdots x_0) = 1 لكل سلسلة xn1x0x_{n-1}\cdots x_0، وعندئذٍ تكون قيمة المجموع 2n-2^n. القسمة على 2n2^n وأخذ مربع القيمة المطلقة يعطيان 11.

أما إذا كانت ff متوازنة، فإنها تأخذ القيمة 00 على نصف السلاسل xn1x0x_{n-1}\cdots x_0 والقيمة 11 على النصف الآخر، فتتلاشى حدود +1+1 و1-1 في المجموع وتبقى القيمة 00.

نستنتج أن الخوارزمية تعمل بصورة صحيحة متى تحقق الوعد.

الصعوبة الكلاسيكية

خوارزمية دويتش-يوزسا تعمل في جميع الأحوال، وتعطينا دائماً الإجابة الصحيحة حين يُستوفى الوعد، وتحتاج استعلاماً واحداً فحسب. كيف يقارن ذلك بالخوارزميات الكلاسيكية لمسألة دويتش-يوزسا؟

أولاً، أي خوارزمية كلاسيكية حتمية تحل مسألة دويتش-يوزسا بصورة صحيحة يجب أن تجري عدداً أسياً من الاستعلامات: يُحتاج في أسوأ الحالات إلى 2n1+12^{n-1} + 1 استعلاماً. السبب هو أنه إذا استعلمت خوارزمية حتمية ff عند 2n12^{n-1} سلسلة مختلفة أو أقل، وحصلت على نفس قيمة الدالة في كل مرة، فكلا الجوابين لا يزالان ممكنَين. قد تكون الدالة ثابتة، أو قد تكون متوازنة لكن بحظ سيء تعيد جميع الاستعلامات نفس قيمة الدالة.

يبدو الاحتمال الثاني غير مرجح — لكن بالنسبة للخوارزميات الحتمية لا توجد عشوائية أو شك، فستفشل بصورة منتظمة في حالة دوال بعينها. لذا لدينا ميزة كبيرة للخوارزميات الكمومية على الكلاسيكية في هذا الشأن.

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

بالتحديد، إذا اخترنا kk سلاسل مُدخَلة x1,,xkΣnx^1,\ldots,x^k \in \Sigma^n بصورة عشوائية موحدة، وحسبنا f(x1),,f(xk)f(x^1),\ldots,f(x^k)، وأجبنا بـ00 إذا كانت القيم جميعها متساوية وبـ11 إذا لم تكن، فسنكون دائماً على صواب حين تكون ff ثابتة، وسنخطئ حين تكون ff متوازنة باحتمالية 2k+12^{-k + 1} فحسب. إذا أخذنا k=11k = 11 مثلاً، ستُجيب هذه الخوارزمية بصواب باحتمالية أكبر من 99.999.9%.

لهذا السبب، لا تزال لدينا ميزة محدودة نسبياً للخوارزميات الكمومية على الكلاسيكية — إلا أنها ميزة قابلة للقياس وتمثل تحسناً على خوارزمية دويتش.

دويتش-يوزسا مع Qiskit

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np

لتطبيق خوارزمية دويتش-يوزسا في Qiskit، سنبدأ بتعريف دالة dj_query تُنشئ دائرة كمومية تُنفِّذ بوابة استعلام، لدالة مُختارة عشوائياً تستوفي الوعد لمسألة دويتش-يوزسا. باحتمال 50%، تكون الدالة ثابتة، وباحتمال 50% تكون متوازنة. في كلتا الحالتين، تُختار الدالة بصورة موحدة من بين دوال ذلك النوع. المُعامِل هو عدد بتات المُدخَل للدالة.

def dj_query(num_qubits):
# Create a circuit implementing for a query gate for a random function
# satisfying the promise for the Deutsch-Jozsa problem.

qc = QuantumCircuit(num_qubits + 1)

if np.random.randint(0, 2):
# Flip output qubit with 50% chance
qc.x(num_qubits)
if np.random.randint(0, 2):
# return constant circuit with 50% chance
return qc

# Choose half the possible input strings
on_states = np.random.choice(
range(2**num_qubits), # numbers to sample from
2**num_qubits // 2, # number of samples
replace=False, # makes sure states are only sampled once
)

def add_cx(qc, bit_string):
for qubit, bit in enumerate(reversed(bit_string)):
if bit == "1":
qc.x(qubit)
return qc

for state in on_states:
qc.barrier() # Barriers are added to help visualize how the functions are created.
qc = add_cx(qc, f"{state:0b}")
qc.mcx(list(range(num_qubits)), num_qubits)
qc = add_cx(qc, f"{state:0b}")

qc.barrier()

return qc

يمكننا عرض تطبيق الدائرة الكمومية لبوابة الاستعلام باستخدام دالة draw كالمعتاد.

display(dj_query(3).draw(output="mpl"))

Output of the previous code cell

بعد ذلك نُعرِّف دالة تُنشئ دائرة دويتش-يوزسا، آخذةً تطبيق الدائرة الكمومية لبوابة الاستعلام كمعامل.

def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in the Deutsch-Jozsa algorithm.

n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.compose(function, inplace=True)
qc.h(range(n))
qc.measure(range(n), range(n))
return qc

أخيراً، نُعرِّف دالة تُشغِّل دائرة دويتش-يوزسا مرة واحدة.

def dj_algorithm(function: QuantumCircuit):
# Determine if a function is constant or balanced.

qc = compile_circuit(function)

result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if "1" in measurements[0]:
return "balanced"
return "constant"

يمكننا اختبار تطبيقنا باختيار دالة عشوائياً، وعرض تطبيق الدائرة الكمومية لبوابة الاستعلام لتلك الدالة، ثم تشغيل خوارزمية دويتش-يوزسا عليها.

f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

Output of the previous code cell

'balanced'

مسألة برنشتاين-فازيراني

بعد ذلك، سنناقش مسألة تُعرف بـمسألة برنشتاين-فازيراني. وتُسمى أيضاً مسألة أخذ عينات فورييه، وإن كانت هناك صياغات أعم لهذه المسألة تحمل الاسم ذاته.

أولاً، لنُدخل بعض الرموز. لأي سلسلتَين ثنائيتَين x=xn1x0x = x_{n-1} \cdots x_0 وy=yn1y0y = y_{n-1}\cdots y_0 ذواتَي الطول nn، نُعرِّف:

xy=xn1yn1x0y0.x \cdot y = x_{n-1} y_{n-1} \oplus \cdots \oplus x_0 y_0.

سنسمي هذه العملية الضرب الداخلي الثنائي. طريقة بديلة لتعريفه هي كالتالي:

xy={1xn1yn1++x0y0 فردي0xn1yn1++x0y0 زوجيx \cdot y = \begin{cases} 1 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ فردي}\\[0.5mm] 0 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ زوجي} \end{cases}

لاحظ أن هذه عملية متماثلة، أي أن النتيجة لا تتغير إذا استبدلنا xx بـyy، فيمكننا فعل ذلك متى أردنا. أحياناً يكون من المفيد التفكير في الضرب الداخلي الثنائي xyx \cdot y باعتباره تعادل (parity) بتات xx في المواضع التي تحتوي yy على 11، أو بالتكافؤ، تعادل بتات yy في المواضع التي تحتوي xx على 11.

بهذه الرموز، يمكننا الآن تعريف مسألة برنشتاين-فازيراني.

مسألة برنشتاين-فازيراني

المُدخَل: دالة f:{0,1}n{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
الوعد: توجد سلسلة ثنائية s=sn1s0s = s_{n-1} \cdots s_0 بحيث f(x)=sxf(x) = s\cdot x لكل xΣnx\in\Sigma^n
المُخرَج: السلسلة ss

لا نحتاج في الواقع إلى خوارزمية كمومية جديدة لهذه المسألة؛ فخوارزمية دويتش-يوزسا تحلها. من أجل الوضوح، لنُشر إلى الدائرة الكمومية الواردة أعلاه، التي لا تتضمن خطوة المعالجة الكلاسيكية لحساب OR، باسم دائرة دويتش-يوزسا.

تحليل الخوارزمية

لتحليل كيفية عمل دائرة دويتش-يوزسا مع دالة تستوفي وعد مسألة برنشتاين-فازيراني، سنبدأ بملاحظة سريعة. باستخدام الضرب الداخلي الثنائي، يمكننا وصف تأثير nn بوابة هادامار على حالات الأساس القياسية لـnn كيوبت بالصيغة التالية:

Hnx=12nyΣn(1)xyyH^{\otimes n} \vert x \rangle = \frac{1}{\sqrt{2^n}} \sum_{y\in\Sigma^n} (-1)^{x\cdot y} \vert y\rangle

وذلك مماثل لما رأيناه في تحليل خوارزمية دويتش، لأن قيمة (1)k(-1)^k لأي عدد صحيح kk تعتمد فقط على ما إذا كان kk فردياً أم زوجياً.

بالعودة إلى دائرة دويتش-يوزسا، بعد تنفيذ الطبقة الأولى من بوابات هادامار، تكون حالة الكيوبتات الـn+1n+1:

12nxΣnx.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} \vert x \rangle.

ثم تُنفَّذ بوابة الاستعلام، التي (من خلال ظاهرة الركل الطوري) تحوّل الحالة إلى:

12nxΣn(1)f(x)x.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} (-1)^{f(x)} \vert x \rangle.

باستخدام صيغتنا لتأثير طبقة بوابات هادامار، نرى أن الطبقة الثانية من بوابات هادامار تحوّل هذه الحالة إلى:

12nxΣnyΣn(1)f(x)+xyy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{f(x) + x \cdot y} \vert y \rangle.

الآن يمكننا إجراء بعض التبسيطات في أس 1-1 داخل المجموع. وُعِدنا بأن f(x)=sxf(x) = s\cdot x لسلسلة ما s=sn1s0s = s_{n-1} \cdots s_0، فيمكننا كتابة الحالة:

12nxΣnyΣn(1)sx+xyy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{s\cdot x + x \cdot y} \vert y \rangle.

بما أن sxs\cdot x وxyx\cdot y قيم ثنائية، يمكننا استبدال الجمع بالـXOR — مرة أخرى لأن الشيء الوحيد المهم لعدد صحيح في أس 1-1 هو ما إذا كان فردياً أم زوجياً. باستخدام تماثل الضرب الداخلي الثنائي، نحصل على التعبير التالي للحالة:

12nxΣnyΣn(1)(sx)(yx)y.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\cdot x) \oplus (y \cdot x)} \vert y \rangle.

(أُضيفت الأقواس للوضوح، وإن لم تكن ضرورية حقاً لأن العرف يجعل الضرب الداخلي الثنائي أعلى أولوية من الـXOR.)

عند هذه النقطة سنستخدم الصيغة التالية:

(sx)(yx)=(sy)x(s\cdot x) \oplus (y \cdot x) = (s \oplus y) \cdot x

يمكننا الحصول على هذه الصيغة من خلال صيغة مماثلة للبتات،

(ac)(bc)=(ab)c,(a c) \oplus (b c) = (a \oplus b) c,

مع توسيع الضرب الداخلي الثنائي وXOR البتية:

(sx)(yx)=(sn1xn1)(s0x0)(yn1xn1)(y0x0)=(sn1yn1)xn1(s0y0)x0=(sy)x\begin{aligned} (s\cdot x) \oplus (y \cdot x) & = (s_{n-1} x_{n-1}) \oplus \cdots \oplus (s_{0} x_{0}) \oplus (y_{n-1} x_{n-1}) \oplus \cdots \oplus (y_{0} x_{0}) \\ & = (s_{n-1} \oplus y_{n-1}) x_{n-1} \oplus \cdots \oplus (s_{0} \oplus y_{0}) x_{0} \\ & = (s \oplus y) \cdot x \end{aligned}

هذا يتيح لنا التعبير عن حالة الدائرة قبيل القياسات مباشرةً كالتالي:

12nxΣnyΣn(1)(sy)xy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle.

الخطوة الأخيرة هي استخدام صيغة أخرى، تصح لكل سلسلة ثنائية z=zn1z0z = z_{n-1}\cdots z_0:

12nxΣn(1)zx={1إذا كان z=0n0إذا كان z0n\frac{1}{2^n} \sum_{x \in \Sigma^n} (-1)^{z \cdot x} = \begin{cases} 1 & \text{إذا كان $z = 0^n$}\\ 0 & \text{إذا كان $z\neq 0^n$} \end{cases}

نستخدم هنا ترميزاً بسيطاً للسلاسل سنوظِّفه عدة مرات أخرى في الدرس: 0n0^n هي السلسلة الصفرية الكاملة ذات الطول nn.

طريقة بسيطة للتحقق من صحة هذه الصيغة هي النظر في الحالتين بصورة منفصلة. إذا كان z=0nz = 0^n، فإن zx=0z\cdot x = 0 لكل سلسلة xΣnx\in\Sigma^n، وعندئذٍ قيمة كل حد في المجموع هي 11، ونحصل على 11 بعد الجمع والقسمة على 2n2^n. أما إذا كان أي بت من بتات zz يساوي 11، فإن الضرب الداخلي الثنائي zxz\cdot x يساوي 00 لنصف الاختيارات الممكنة لـxΣnx\in\Sigma^n بالضبط و11 للنصف الآخر — لأن قيمة الضرب الداخلي الثنائي zxz\cdot x تنقلب (من 00 إلى 11 أو من 11 إلى 00) إذا قلبنا أي بت من بتات xx في موضع يحتوي zz على 11.

إذا طبقنا هذه الصيغة لتبسيط حالة الدائرة قبل القياسات، نحصل على:

12nxΣnyΣn(1)(sy)xy=s,\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle = \vert - \rangle \otimes \vert s \rangle,

استناداً إلى أن sy=0ns\oplus y = 0^n إذا وفقط إذا كان y=sy = s. وهكذا تكشف القياسات تماماً السلسلة ss التي نبحث عنها.

الصعوبة الكلاسيكية

في حين أن دائرة دويتش-يوزسا تحل مسألة برنشتاين-فازيراني باستعلام واحد، فإن أي خوارزمية استعلام كلاسيكية تحتاج إلى nn استعلام على الأقل لحل هذه المسألة.

يمكن إثبات ذلك من خلال حجة تُعرف بـنظرية المعلومات، وهي بسيطة جداً في هذه الحالة. كل استعلام كلاسيكي يكشف بتاً واحداً من المعلومات عن الحل، وهناك nn بت من المعلومات التي تحتاج إلى اكتشافها — لذا تلزم على الأقل nn استعلامات.

في الواقع، يمكن حل مسألة برنشتاين-فازيراني كلاسيكياً باستعلام الدالة على كل من السلاسل الـnn التي تحتوي على 11 واحد في كل موضع ممكن و00 في جميع البتات الأخرى، مما يكشف بتات ss واحدة تلو الأخرى. لذا فإن ميزة الخوارزميات الكمومية على الكلاسيكية في هذه المسألة هي استعلام واحد مقابل nn استعلاماً.

برنشتاين-فازيراني مع Qiskit

لقد طبّقنا بالفعل دائرة دويتش-يوزسا أعلاه، وسنستخدمها هنا لحل مسألة برنشتاين-فازيراني. أولاً سنُعرِّف دالة تُطبِّق بوابة استعلام لمسألة برنشتاين-فازيراني لأي سلسلة ثنائية ss.

def bv_query(s):
# Create a quantum circuit implementing a query gate for the
# Bernstein-Vazirani problem.

qc = QuantumCircuit(len(s) + 1)
for index, bit in enumerate(reversed(s)):
if bit == "1":
qc.cx(index, len(s))
return qc

display(bv_query("1011").draw(output="mpl"))

Output of the previous code cell

الآن يمكننا إنشاء دالة تشغّل دائرة دويتش-يوزسا على الدالة، باستخدام دالة compile_circuit المُعرَّفة سابقاً.

def bv_algorithm(function: QuantumCircuit):
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
return result.get_memory()[0]

display(bv_algorithm(bv_query("1011")))
'1011'

ملاحظة حول التسمية

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

ما فعله برنشتاين وفازيراني بعد إثبات أن خوارزمية دويتش-يوزسا تحل مسألة برنشتاين-فازيراني (كما صِيغت أعلاه) هو تعريف مسألة أكثر تعقيداً بكثير، تُعرف بـمسألة أخذ عينات فورييه التكرارية. هذه مسألة مُصطنعة للغاية حيث تُطلق حلول حالات مختلفة من المسألة مستويات جديدة من المسألة مرتّبة في هيكل شجري. مسألة برنشتاين-فازيراني هي في جوهرها الحالة الأساسية لهذه المسألة الأكثر تعقيداً.

كانت مسألة أخذ عينات فورييه التكرارية أول مثال معروف على مسألة استعلام تتمتع فيها الخوارزميات الكمومية بميزة فوق-متعددة الحدود على الخوارزميات الاحتمالية، متجاوزةً بذلك ميزة الكم على الكلاسيكية التي تقدمها خوارزمية دويتش-يوزسا. بشكل حدسي، تُضخِّم النسخة التكرارية من المسألة ميزة 11 مقابل nn للخوارزميات الكمومية إلى شيء أكبر بكثير.

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

مسألة سايمون، والخوارزمية الخاصة بها الموصوفة في القسم التالي، تقدم مثالاً أبسط بكثير على ميزة فوق-متعددة الحدود (وفي الواقع أسية) للخوارزميات الكمومية على الكلاسيكية، ولهذا السبب نادراً ما تُناقَش مسألة أخذ عينات فورييه التكرارية. إلا أنها تظل مسألة حسابية مثيرة للاهتمام في حد ذاتها.