خوارزمية دوتش
تحل خوارزمية دوتش مسألة التكافؤ في الحالة الخاصة . في سياق الحوسبة الكمومية تُعرف هذه المسألة أحيانًا بـمسألة دوتش، وسنتبع هذا التسمية في هذا الدرس.
بدقة أكبر، يُمثَّل المدخل بدالة من بت إلى بت. توجد أربع دوال من هذا النوع:
الدالتان الأولى والأخيرة ثابتتان، أما الدالتان في المنتصف فهما متوازنتان، بمعنى أن القيمتين الممكنتين لمخرج الدالة تظهران بالعدد ذاته حين نمر على جميع المدخلات. مسألة دوتش هي تحديد أي الفئتين تنتمي إليها الدالة المدخلة: ثابتة أم متوازنة.
إذا نظرنا إلى الدالة المدخلة في مسألة دوتش باعتبارها تمثيلًا للوصول العشوائي إلى سلسلة نصية، فنحن نفكر في سلسلة من بتين: .
بهذه الطريقة، تصبح مسألة دوتش حساب التكافؤ (أو ما يعادله OR الحصري XOR) للبتين.
كل خوارزمية استعلام كلاسيكية تحل هذه المسألة بشكل صحيح يجب أن تستعلم عن كلا البتين: و. إذا علمنا أن مثلًا، فقد تكون الإجابة لا تزال أو اعتمادًا على ما إذا كانت أو على التوالي. كل حالة أخرى مشابهة؛ معرفة بت واحد فقط من اثنين لا تُقدِّم أي معلومة عن تكافؤهما. لذلك، الدائرة المنطقية الموضحة في القسم السابق هي الأفضل من حيث عدد الاستعلامات اللازمة لحل هذه المسألة.
وصف الدائرة الكمومية
تحل خوارزمية دوتش مسألة دوتش باستخدام استعلام واحد فقط، مما يوفر ميزة قابلة للقياس للحوسبة الكمومية على الكلاسيكية. قد تبدو هذه الميزة متواضعة — استعلام واحد مقابل اثنين — لكن علينا أن نبدأ من مكان ما. التقدم العلمي يبدأ أحيانًا بأصول متواضعة الظاهر.
فيما يلي الدائرة الكمومية التي تصف خوارزمية دوتش:
التحليل
لتحليل خوارزمية دوتش، سنتتبع تأثير الدائرة أعلاه ونُحدِّد حالات الكيوبتات في اللحظات التي يقترحها هذا الشكل:
الحالة الابتدائية هي ، وتحوِّل عمليتا هادامار على الجانب الأيسر من الدائرة هذه الحالة إلى
(كالعادة، نتبع اتفاقية Qiskit لترتيب الكيوبتات التي تضع الكيوبت العلوي على اليمين والكيوبت السفلي على اليسار.) قد يبدو كتابة هذه الحالة المنتجة بهذه الصورة الموزَّعة جزئيًا غير حدسي، لكن هذا سيجعل التعبيرات اللاحقة أكثر إيجازًا.
بعد ذلك، تُنفَّذ بوابة . وفقًا لتعريف بوابة ، تُطبَّق عملية XOR لقيمة الدالة للحالة الكلاسيكية للكيوبت العلوي/الأيمن على الكيوبت السفلي/الأيسر، مما يحوِّل إلى الحالة
يمكننا تبسيط هذا التعبير بملاحظة أن الصيغة
تنطبق على كلتا القيمتين الممكنتين . الحالتان بصورة أكثر صراحة هما:
وهكذا يمكننا التعبير عن بصيغة بديلة:
حدث شيء مثير للاهتمام! رغم أن تأثير بوابة على حالات الأساس القياسية يُبقي الكيوبت العلوي/الأيمن دون تغيير ويطبق XOR لقيمة الدالة على الكيوبت السفلي/الأيسر، نرى هنا أن حالة الكيوبت العلوي/الأيمن قد تغيرت (بصفة عامة) بينما بقيت حالة الكيوبت السفلي/الأيسر على ما هي عليه — وتحديدًا في الحالة قبل بوابة وبعدها. هذه الظاهرة تُعرف بـانعكاس الطور (phase kickback)، وسنتحدث عنها أكثر قريبًا.
مع تبسيط أخير يتمثل في سحب عامل خارج المجموع، نحصل على هذا التعبير للحالة :
لاحظ أن في هذا التعبير لدينا في أس بدلًا من ، وهو ما قد نتوقعه من منظور جبري صرف، لكننا نحصل على النتيجة ذاتها في الحالتين. وذلك لأن قيمة لأي عدد صحيح تعتمد فقط على ما إذا كان زوجيًا أم فرديًا.
تطبيق بوابة هادامار الأخيرة على الكيوبت العلوي يُعطينا الحالة
مما يؤدي إلى النتيجة الصحيحة باحتمالية عند قياس الكيوبت الأيمن/العلوي.
ملاحظات إضافية حول انعكاس الطور
قبل المضي قُدُمًا، دعنا ننظر إلى التحليل أعلاه من زاوية مختلفة قليلًا قد تُلقي بعض الضوء على ظاهرة انعكاس الطور.
أولًا، لاحظ أن الصيغة التالية تنطبق على كل اختيار للبتين :
يمكن التحقق من ذلك بفحص القيمتين الممكنتين و:
باستخدام هذه الصيغة نرى أن
لكل اختيار للبتين . لأن هذه الصيغة صحيحة من أجل و، نرى بالخطية أن
لجميع متجهات الحالة الكمومية ، وبالتالي
المفتاح الذي يُجعل هذا ممكنًا هو أن . بالمصطلحات الرياضية، المتجه هو متجه ذاتي للمصفوفة بـقيمة ذاتية .
سنناقش المتجهات الذاتية والقيم الذاتية بمزيد من التفصيل في الدرس القادم عن تقدير الطور والتحليل إلى عوامل، حيث يُعمَّم مفهوم انعكاس الطور ليشمل عمليات وحدوية أخرى.
مع الأخذ بعين الاعتبار أن الكميات القياسية تتحرك بحرية عبر الجداء التنسوري، نجد طريقة بديلة للاستدلال على كيفية تحويل العملية للحالة إلى في التحليل أعلاه:
التطبيق في Qiskit
لنرَ الآن كيف يمكننا تطبيق خوارزمية دوتش في Qiskit. سنبدأ بفحص الإصدار ثم نُجري الاستيرادات اللازمة لهذا التطبيق تحديدًا. في تطبيقات الخوارزميات الأخرى التي ستلي، سنُجري الاستيرادات اللازمة بصورة منفصلة لمزيد من الوحدودية.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit import __version__
print(__version__)
2.1.1
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
أولًا، سنعرِّف دائرة كمومية تُطبِّق بوابة استعلام لإحدى الدوال الأربع أو من بت إلى بت كما وردت سابقًا. كما أشرنا، تطبيق بوابات الاستعلام ليس جزءًا أصيلًا من خوارزمية دوتش في حد ذاتها؛ هنا نُظهر في الأساس إحدى طرق إعداد المدخل على هيئة دائرة كمومية لبوابة الاستعلام.
def deutsch_function(case: int):
# This function generates a quantum circuit for one of the 4 functions
# from one bit to one bit
if case not in [1, 2, 3, 4]:
raise ValueError("`case` must be 1, 2, 3, or 4.")
f = QuantumCircuit(2)
if case in [2, 3]:
f.cx(0, 1)
if case in [3, 4]:
f.x(1)
return f
يمكننا رؤية شكل كل دائرة باستخدام طريقة draw. هذه هي الدائرة للدالة .
display(deutsch_function(3).draw(output="mpl"))
بعد ذلك سننشئ الدائرة الكمومية الفعلية لخوارزمية دوتش، مُستبدِلين بوابة الاستعلام بتطبيق دائرة كمومية يُعطى كحجة. بعد قليل سنضع إحدى الدوائر الأربع المعرَّفة بالدالة deutsch_function التي عرَّفناها سابقًا.
تُضمَّن الحواجز لإظهار الفصل المرئي بين تطبيق بوابة الاستعلام وبقية الدائرة.
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in Deutsch's algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.barrier()
qc.compose(function, inplace=True)
qc.barrier()
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
مجددًا يمكننا رؤية شكل الدائرة باستخدام طريقة draw.
display(compile_circuit(deutsch_function(3)).draw(output="mpl"))
أخيرًا، سننشئ دالة تُشغِّل الدائرة المعرَّفة مسبقًا مرة واحدة وتُخرج النتيجة المناسبة: "constant" (ثابتة) أو "balanced" (متوازنة).
def deutsch_algorithm(function: QuantumCircuit):
# Determine if a one-bit function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if measurements[0] == "0":
return "constant"
return "balanced"
يمكننا الآن تشغيل خوارزمية دوتش على أي من الدوال الأربع المعرَّفة أعلاه.
f = deutsch_function(3)
display(deutsch_algorithm(f))
'balanced'