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

خوارزمية شور

في وحدة Qiskit in Classrooms هذه، يجب أن يكون لدى الطلاب بيئة 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.

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

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit 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'

مقدمة

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

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

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

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

مسألة التحليل إلى عوامل

الهدف من مسألة التحليل إلى عوامل هو إيجاد العوامل الأولية لعدد NN. بالنسبة لبعض الأعداد NN، هذا أمر سهل نسبيًا. فمثلًا، إذا كان NN زوجيًا، فأحد عوامله الأولية سيكون 2. وإذا كان NN قوة أولية، أي N=pkN=p^k لعدد أولي pp ما، فمن السهل نسبيًا إيجاد pp: نقترّب من الجذر kthk^{\text{th}} للعدد NN ونبحث عن الأعداد الأولية القريبة التي قد تكون pp.

لكن تكمن صعوبة الحواسيب الكلاسيكية حين يكون NN فرديًا وليس قوة أولية. وهذا هو الحالة التي تتعامل معها خوارزمية شور. تجد الخوارزمية عاملين pp وqq بحيث يكون N=pqN=pq، ويمكن تطبيقها بشكل تكراري حتى تصبح جميع العوامل أولية. في الأقسام التالية سنرى كيف يتم التعامل مع هذه المسألة.

الصلة بالأمن السيبراني

تم بناء كثير من المخططات التشفيرية على أساس أن تحليل الأعداد الكبيرة إلى عوامل أمر صعب، بما في ذلك مخطط يُستخدم شائعًا اليوم يُعرف بـ RSA. في RSA، يُنشأ مفتاح عام بضرب عددين أوليين كبيرين معًا للحصول على N=pqN = p\cdot q. بعد ذلك، يمكن لأي شخص استخدام هذا المفتاح العام لتشفير البيانات. لكن فقط من يملك المفتاح الخاص، وهو pp وqq، يستطيع فك تشفير تلك البيانات.

لو كان تحليل NN إلى عوامل أمرًا سهلًا، لتمكّن أي شخص من تحديد pp وqq وكسر التشفير. لكنه ليس كذلك. هذه مسألة صعبة للغاية واشتُهرت بذلك. في الواقع، لم يُعثر حتى الآن على العوامل الأولية لعدد يُسمى RSA1024، الذي يتكوّن من 1024 رقمًا ثنائيًا و309 رقمًا عشريًا، على الرغم من تقديم جائزة بقيمة $100,000 لتحليله منذ عام 1991.

حل شور

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

الحساب المعياري

الحساب المعياري هو نظام عدّ دوري، بمعنى أن العدّ يبدأ بالطريقة المعتادة بالأعداد الصحيحة 0، 1، 2، إلخ، لكن عند نقطة معينة، بعد دورة NN، يبدأ العدّ من جديد. لنرى كيف يعمل هذا بمثال. لنفرض أن الدورة هي 5. إذن، أثناء العدّ، بدلًا من الوصول إلى 5، نعود إلى 0:

0,1,2,3,4,0,1,2,3,4,0,1,2,...0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, ...

هذا لأنه في عالم "modulo-5"، 5 يعادل 0. نقول إن 5mod5 =05\bmod 5 \ = 0. وفي الواقع، ستعادل جميع مضاعفات 5 القيمة 0mod50\bmod 5.

اختبر فهمك

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

استخدم الحساب المعياري لحل المسألة التالية:

غادرت في رحلة قطار طويلة عبر القارات الساعة 8 صباحًا. مدة رحلة القطار 60 ساعة. ما الوقت حين تصل؟

الإجابة:

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

(8+60)mod(24)=20(8+60)\text{mod}(24) = 20

إذن، ستصل إلى وجهتك الساعة 20:00، أو الساعة 8 مساءً.

ZN\mathbb{Z}_N وZN\mathbb{Z}_N^*

من المفيد في الغالب تقديم مجموعتين، ZN\mathbb{Z}_N وZN\mathbb{Z}_N^*. ZN\mathbb{Z}_N هي ببساطة مجموعة الأعداد الموجودة في عالم "modulo-NN". مثلًا، حين كنّا نعدّ modulo-5، ستكون المجموعة Z5={0,1,2,3,4}\mathbb{Z}_5=\{0,1,2,3,4\}. مثال آخر: Z15={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}\mathbb{Z}_{15} = \{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\}. يمكننا إجراء عمليتي الجمع والضرب (معياريًا بالنسبة لـ NN) على عناصر ZN\mathbb{Z}_N، ونتيجة كل من هاتين العمليتين تكون أيضًا عنصرًا في ZN\mathbb{Z}_N، مما يجعل ZN\mathbb{Z}_N كيانًا رياضيًا يُسمى حلقة.

هناك مجموعة جزئية خاصة من ZN\mathbb{Z}_N تهمّنا بشكل خاص لخوارزمية شور. وهي مجموعة الأعداد في ZN\mathbb{Z}_N التي يكون القاسم المشترك الأكبر بين كل عنصر منها وNN يساوي 1، بحيث يكون كل عنصر "أوليًا مشتركًا" مع NN. إذا أخذنا هذه المجموعة مع عملية الضرب المعياري، فإنها تُشكّل كيانًا رياضيًا آخر يُسمى مجموعة. نسمّي هذه المجموعة ZN\mathbb{Z}_N^*. اتضح أنه مع ZN\mathbb{Z}_N^* (والمجموعات المنتهية بشكل عام)، إذا اخترنا أي عنصر aZNa \in \mathbb{Z}_N^* وضربنا aa في نفسه بشكل متكرر، سنصل دائمًا في نهاية المطاف إلى العدد 11. أدنى عدد من المرات التي يجب فيها ضرب aa في نفسه للحصول على 11 يُسمى رتبة aa. هذه الحقيقة ستكون بالغة الأهمية في نقاشنا حول كيفية تحليل الأعداد إلى عوامل فيما بعد.

اختبر فهمك

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

ما هي Z15\mathbb{Z}_{15}^*؟

الإجابة:

Z15={1,2,4,7,8,11,13,14}\mathbb{Z}_{15}^* = \{1,2,4,7,8,11,13,14\}

استبعدنا الأعداد التالية:

3:GCD(3,15)=35:GCD(5,15)=56:GCD(6,15)=39:GCD(9,15)=310:GCD(10,15)=512:GCD(12,15)=3\begin{aligned} 3: GCD(3,15)=3 \\ 5: GCD(5,15)=5 \\ 6: GCD(6,15)=3 \\ 9: GCD(9,15)=3 \\ 10: GCD(10,15)=5 \\ 12: GCD(12,15)=3 \\ \end{aligned}

ما هي رتبة كل عنصر من عناصر Z15\mathbb{Z}_{15}^*؟

الإجابة:

الرتبة rr هي أصغر عدد بحيث يكون armod(15)=1a^r\text{mod}(15)=1 لكل عنصر aa.

11mod(15)=1,r=124mod(15)=1,r=442mod(15)=1,r=274mod(15)=1,r=484mod(15)=1,r=4112mod(15)=1,r=2134mod(15)=1,r=4142mod(15)=1,r=2\begin{aligned} 1^1\text{mod}(15) = 1, r=1 \\ 2^4\text{mod}(15) = 1, r=4 \\ 4^2\text{mod}(15) = 1, r=2 \\ 7^4\text{mod}(15) = 1, r=4 \\ 8^4\text{mod}(15) = 1, r=4 \\ 11^2\text{mod}(15) = 1, r=2 \\ 13^4\text{mod}(15) = 1, r=4 \\ 14^2\text{mod}(15) = 1, r=2 \\ \end{aligned}

لاحظ أنه على الرغم من أننا تمكّنا من إيجاد رتبة الأعداد في Z15\mathbb{Z}_{15}^*، إلا أن هذا ليس مهمة سهلة بشكل عام لقيم NN الأكبر. هذا هو جوهر مسألة التحليل إلى عوامل وسبب حاجتنا إلى حاسوب كمومي. سنرى لماذا حين نتابع بقية المفكرة.

تطبيق الحساب المعياري على مسألة التحليل إلى عوامل

مفتاح إيجاد العاملين pp وqq بحيث يكون N=pqN=pq يعتمد على إيجاد عدد صحيح آخر xx بحيث

x21modNx^2 \equiv 1 \bmod N و x≢±1modN.x \not\equiv \pm 1 \bmod N.

كيف يساعدنا إيجاد xx في إيجاد العاملين pp وqq؟ دعنا نستعرض المنطق الآن. بما أن x21modNx^2 \equiv 1 \bmod N، فهذا يعني أن x210modNx^2 - 1 \equiv 0 \bmod N . بعبارة أخرى، x21x^2 - 1 هو مضاعف لـ NN. لذا، لعدد صحيح ما ll،

x21=lNx^2 - 1 = l N

يمكننا تحليل x21x^2 - 1 للحصول على:

(x+1)(x1)=lN(x+1)(x-1) = l N

من افتراضاتنا الأولية نعلم أن x≢±1modNx \not\equiv \pm 1 \bmod N، لذا لا يقسم NN بالتساوي على x+1x+1 أو x1x-1. فالعاملان الاثنان لـ NN، وهما pp وqq، يجب أن يقسم كل منهما على x1x-1 وx+1x+1. إما أن pp يقسم x1x-1 وqq يقسم x+1x+1، أو العكس. لذا، إذا حسبنا القاسم المشترك الأكبر (GCD) بين NN وكل من x1x-1 وx+1x+1، فسيعطينا ذلك العاملين pp وqq. حساب القاسم المشترك الأكبر بين عددين مهمة كلاسيكية سهلة يمكن إنجازها مثلًا باستخدام خوارزمية إقليدس.

اختبر فهمك

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

قد يكون من الصعب فهم كل خطوة من خطوات المنطق أعلاه، لذا جرّب التحقق منها بمثال. استخدم N=15N=15 وx=11x=11. أولًا، تحقّق من أن x21mod(N)x^2 \equiv 1 \text{mod}(N) وx≢±1modNx \not\equiv \pm 1 \bmod N. ثم تابع التحقق من كل خطوة. أخيرًا، احسب GCD(11±1,15)\text{GCD}(11\pm1,15) وتحقق من أنها عوامل 1515.

الإجابة:

112=12111^2 = 121، وهو 158+115*8 + 1، إذن 112mod15=111^2\bmod 15 = 1. \checkmark

111=10 11 - 1 = 10، وهو لا يعادل 0mod150\bmod 15. \checkmark

11+1=12 11 + 1 = 12، وهو لا يعادل 0mod150\bmod 15. \checkmark

الآن، نعلم أن (x+1)(x1)=lN(x+1)(x-1) = l N لعدد صحيح ll ما. يتحقق هذا حين نعوّض بـ xx وNN: (12)(10)=l15(12)(10) = l 15 عند l=8l = 8. \checkmark

الآن، نحتاج إلى حساب GCD(12,15)\text{GCD}(12,15) وGCD(10,15)\text{GCD}(10,15).

GCD(12,15)=3GCD(10,15)=5\begin{aligned} \text{GCD}(12,15) = 3 \\ \text{GCD}(10,15) = 5 \end{aligned}

إذن، وجدنا عوامل 1515!

الخوارزمية

الآن بعد أن رأينا كيف أن إيجاد عدد صحيح xx بحيث يكون x21modNx^2 \equiv 1\bmod N يساعدنا على تحليل NN إلى عوامل، يمكننا استعراض خوارزمية شور. يتلخّص الأمر في جوهره في إيجاد xx:

  1. اختر عددًا صحيحًا عشوائيًا اختر عددًا صحيحًا عشوائيًا aa بحيث يكون 1<a<N1 < a < N.
  • احسب GCD(a,N)\text{GCD}(a, N) كلاسيكيًا.
    • إذا كان GCD(a,N)>1\text{GCD}(a, N) > 1، فقد وجدت عاملًا بالفعل. توقف.
    • وإلا، تابع.
  1. أوجد الرتبة rr لـ aa معياريًا بالنسبة لـ NN أوجد أصغر عدد صحيح موجب rr يحقق ar1(modN)a^r \equiv 1 \pmod N.

  2. تحقق من أن الرتبة زوجية

  • إذا كانت rr فردية، عُد إلى الخطوة 1 واختر aa جديدة.
  • إذا كانت rr زوجية، تابع إلى الخطوة 4.
  1. احسب x=ar/2modNx = a^{r/2} \bmod N
  • تحقق من أن x≢1(modN)x \not\equiv 1 \pmod N وأن x≢1(modN)x \not\equiv -1 \pmod N.
    • إذا كان x±1(modN)x \equiv \pm 1 \pmod N، عُد إلى الخطوة 1 واختر aa جديدة.
  • وإلا، احسب القواسم المشتركة الكبرى لاستخراج العوامل:
p=GCD(x1,N),q=GCD(x+1,N)p = \text{GCD}(x-1, N), \quad q = \text{GCD}(x+1, N)

ستكون هذه عوامل غير بديهية لـ NN.

  1. حلّل إلى عوامل بشكل تكراري إذا لزم الأمر
  • إذا لم يكن pp و/أو qq أوليين، طبّق الخوارزمية بشكل تكراري لتحليلهما بالكامل.
  • بمجرد أن تصبح جميع العوامل أولية، يكتمل التحليل.

بناءً على هذا الإجراء، قد لا يكون من الواضح سبب الحاجة إلى حاسوب كمومي لإتمام هذه المهمة. الضرورة تأتي من الخطوة 2، إذ إن إيجاد رتبة aa معياريًا بالنسبة لـ NN مسألة صعبة للغاية كلاسيكيًا. يتناسب تعقيدها أُسّيًا مع حجم NN. لكن مع الحاسوب الكمومي، نحتاج فقط إلى استخدام تقدير الطور الكمومي لحلها. أما الخطوة 4، إيجاد القاسم المشترك الأكبر لعددين، فهي مهمة سهلة نسبيًا كلاسيكيًا. لذا، الخطوة الوحيدة التي تحتاج فعلًا إلى قوة الحاسوب الكمومي هي خطوة إيجاد الرتبة. نقول إن مسألة التحليل إلى عوامل "تختزل" في مسألة إيجاد الرتبة.

الجزء الصعب: إيجاد الرتبة

الآن، سنستعرض كيف يمكننا استخدام الحاسوب الكمومي في إيجاد الرتبة. أولًا، لنوضح ما نعنيه بـ "الرتبة". بالطبع، أخبرتك بالفعل ما تعنيه الرتبة رياضيًا: إنها أول عدد صحيح غير صفري rr بحيث يكون ar=1(modN).a^r = 1 \pmod N. لكن دعنا نرى إن كان بإمكاننا اكتساب مزيد من الحدس حول هذا المفهوم.

بالنسبة لقيم NN الصغيرة بما يكفي، يمكننا تحديد الرتبة ببساطة بحساب كل قوة من قوى aa، وأخذ المعيار NN لذلك العدد، ثم التوقف حين نجد القوة rr التي تحقق ar=1mod(N)a^r = 1 \text{mod}(N). هذا ما فعلناه في مثالنا N=15N=15 أعلاه. دعنا نلقي نظرة على بعض رسوم بيانية لهذه القوى المعيارية لبعض قيم aa وNN:

قيمة a أس k معياريًا بالنسبة لـ N مقابل الأس k، حيث a=2 وN=15. نلاحظ أنه مع ازدياد k، يظهر نمط متكرر، مما يُظهر أن a^k معياريًا بالنسبة لـ N هي دالة دورية في k.

قيمة a أس k معياريًا بالنسبة لـ N مقابل الأس k، حيث a=5 وN=21. نلاحظ أنه مع ازدياد k، يظهر نمط متكرر، مما يُظهر أن a^k معياريًا بالنسبة لـ N هي دالة دورية في k.

لاحظ شيئًا؟ هذه دوال دورية! والرتبة rr هي نفسها الدورة! إذن، إيجاد الرتبة يعادل إيجاد الدورة.

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

في تقدير الطور الكمومي (QPE)، نبدأ بعامل أحادي UU وحالة ذاتية لذلك العامل الأحادي ψ|\psi\rangle. ثم نستخدم QPE لتقريب القيمة الذاتية المقابلة، والتي، بما أن العامل أحادي، ستكون على الشكل e2πiθe^{2\pi i \theta}. إذن، إيجاد القيمة الذاتية يعادل إيجاد قيمة θ\theta في الدالة الدورية. تبدو الدائرة كالتالي:

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

حيث يحدد عدد كيوبتات التحكم (الكيوبتات mm العليا في الشكل أعلاه) دقة التقريب.

في خوارزمية شور، نستخدم QPE على العامل الأحادي MaM_a:

MayaymodN. M_a|y\rangle \equiv |ay \mod N \rangle .

هنا، y|y\rangle يشير إلى حالة أساس حسابية لسجل متعدد الكيوبتات، حيث القيمة الثنائية للكيوبتات تقابل العدد الصحيح yy. مثلًا، إذا كان N=15N=15 وy=2y = 2، فإن y|y\rangle يُمثَّل بحالة الأساس رباعية الكيوبتات 0010|0010\rangle، إذ يلزم أربعة كيوبتات لترميز الأعداد حتى 15. (إذا كان هذا المفهوم غير مألوف، راجع وحدة Qiskit in Classrooms التمهيدية لمراجعة الترميز الثنائي للحالات الكمومية.)

الآن، نحتاج إلى تحديد حالة ذاتية لهذا العامل الأحادي. إذا بدأنا في الحالة 1|1\rangle، نلاحظ أن كل تطبيق متتالٍ لـ UU سيضرب حالة سجلنا في a(modN)a \pmod N، وبعد rr تطبيقًا سنصل إلى الحالة 1|1\rangle مجددًا. مثلًا مع a=3a = 3 وN=35N = 35:

M31=3M321=9M331=27M3(r1)1=12M3r1=1\begin{aligned} M_3|1\rangle &= |3\rangle & \\ M_3^2|1\rangle &= |9\rangle \\ M_3^3|1\rangle &= |27\rangle \\ & \vdots \\ M_3^{(r-1)}|1\rangle &= |12\rangle \\ M_3^r|1\rangle &= |1\rangle \end{aligned}

إذن، التراكبات فوق الحالات في هذه الدورة (ψj|\psi_j\rangle) على الشكل:

ψj=1rk=0r1e2πijkrak|\psi_j\rangle = \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{\frac{2 \pi i j k}{r}} |a^k \rangle}

هي جميعها حالات ذاتية لـ MaM_a. (هناك حالات ذاتية أكثر من هذه، لكننا نهتم فقط بالتي على الشكل أعلاه.)

اختبر فهمك

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

أوجد حالة ذاتية للعامل الأحادي المقابل لـ a=2a=2 وN=15N = 15.

الإجابة:

M21=2M221=4M231=8M241=1\begin{aligned} M_2|1\rangle &= |2\rangle & \\ M_2^2|1\rangle &= |4\rangle \\ M_2^3|1\rangle &= |8\rangle \\ M_2^4|1\rangle &= |1\rangle \\ \end{aligned}

إذن، الرتبة r=4r=4. ستكون الحالات الذاتية التي نهتم بها تراكبًا متساويًا لجميع الحالات التي مررنا بها أعلاه، مع أطوار متنوعة:

ψ0=12(1+2+4+8)ψ1=12(e2πi041+e2πi142+e2πi244+e2πi348)=12(1+i24i8)ψ2=12(e2πi041+e2πi242+e2πi444+e2πi648)=12(12+48)ψ3=12(e2πi041+e2πi342+e2πi644+e2πi948)=12(1i24+i8)\begin{aligned} |\psi_0\rangle &= \frac{1}{2}(|1\rangle+|2\rangle+|4\rangle+|8\rangle) \\ |\psi_1\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{1}{4}}|2\rangle+e^{2 \pi i \frac{2}{4}}|4\rangle+e^{2 \pi i \frac{3}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle+i|2\rangle-|4\rangle-i|8\rangle) \\ |\psi_2\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{2}{4}}|2\rangle+e^{2 \pi i \frac{4}{4}}|4\rangle+e^{2 \pi i \frac{6}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle-|2\rangle+|4\rangle-|8\rangle) \\ |\psi_3\rangle &= \frac{1}{2}(e^{2 \pi i \frac{0}{4}}|1\rangle+e^{2 \pi i \frac{3}{4}}|2\rangle+e^{2 \pi i \frac{6}{4}}|4\rangle+e^{2 \pi i \frac{9}{4}}|8\rangle) \\ &= \frac{1}{2}(|1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ \end{aligned}

لنفرض أننا تمكّنّا من تهيئة حالة كيوبتنا إلى إحدى هذه الحالات الذاتية (سبويلر — لسنا كذلك. أو على الأقل ليس بسهولة. سنوضح لماذا وما يمكننا فعله بدلًا من ذلك قريبًا). عندها يمكننا استخدام QPE لتقدير القيمة الذاتية المقابلة، ωj=e2πiθj\omega_j = e^{2 \pi i \theta_j} حيث θj=jr\theta_j = \frac{j}{r}. ثم سنتمكّن من تحديد الرتبة rr بالمعادلة البسيطة:

r=jθj.r = \frac{j}{\theta_j}.

لكن تذكّر، قلت إن QPE يقدّر θj\theta_j — لا يعطينا قيمة دقيقة. نحتاج إلى أن يكون التقدير جيدًا بما يكفي للتمييز بين rr وr+1r+1. كلما زاد عدد كيوبتات التحكم mm، كان التقدير أفضل. في المسائل في نهاية الدرس، ستُطلب منك تحديد الحد الأدنى لـ mm اللازم لتحليل العدد NN إلى عوامل.

الآن، علينا التعامل مع مشكلة. كل الشرح أعلاه حول كيفية إيجاد rr يبدأ بتحضير الحالة الذاتية ψj=1rk=0r1e2πijkrak|\psi_j\rangle = \tfrac{1}{\sqrt{r}}\sum_{k=0}^{r-1}{e^{\frac{2 \pi i j k}{r}} |a^k \rangle}. لكننا لا نعرف كيف نفعل ذلك دون أن نعرف rr مسبقًا. المنطق دائري. نحتاج إلى طريقة لتقدير القيمة الذاتية دون تهيئة الحالة الذاتية.

بدلًا من البدء بحالة ذاتية لـ MaM_a، يمكننا تحضير الحالة الابتدائية في حالة الكيوبت البالغة nn المقابلة لـ 1|1\rangle في الثنائي (أي 000...01|000...01\rangle). على الرغم من أن هذه الحالة ليست حالة ذاتية لـ MaM_a بوضوح، إلا أنها تراكب فوق جميع الحالات الذاتية ψk|\psi_k\rangle:

1=1rk=0r1ψk|1\rangle = \frac{1}{\sqrt{r}} \sum\limits_{k=0}^{r-1}{|\psi_k\rangle}

اختبر فهمك

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

تحقق من أن 1|1\rangle يعادل التراكب فوق الحالات الذاتية التي وجدتها لـ N=15N=15 وa=2a=2 في سؤال التحقق السابق.

الإجابة:

الحالات الذاتية الأربع كانت:

ψ0=12(1+2+4+8)ψ1=12(1+i24i8)ψ2=12(12+48)ψ3=12(1i24+i8)\begin{aligned} |\psi_0\rangle &= \frac{1}{2}(|1\rangle+|2\rangle+|4\rangle+|8\rangle) \\ |\psi_1\rangle &= \frac{1}{2}(|1\rangle+i|2\rangle-|4\rangle-i|8\rangle) \\ |\psi_2\rangle &= \frac{1}{2}(|1\rangle-|2\rangle+|4\rangle-|8\rangle) \\ |\psi_3\rangle &= \frac{1}{2}(|1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ \end{aligned}

إذن،

1rk=0r1ψk=12(ψ0+ψ1+ψ2+ψ3)=14(1+2+4+8+1+i24i8+12+48+1i24+i8)=14(41)=1\begin{aligned} \frac{1}{\sqrt{r}} \sum\limits_{k=0}^{r-1}{|\psi_k\rangle} &= \frac{1}{2}(|\psi_0\rangle + |\psi_1\rangle + |\psi_2\rangle + |\psi_3\rangle ) \\ &= \frac{1}{4}(|1\rangle+|2\rangle+|4\rangle+|8\rangle+|1\rangle+i|2\rangle-|4\rangle-i|8\rangle+|1\rangle-|2\rangle+|4\rangle-|8\rangle + |1\rangle-i|2\rangle-|4\rangle+i|8\rangle) \\ &= \frac{1}{4}(4|1\rangle) = |1\rangle \end{aligned}

كيف يساعدنا هذا في إيجاد الرتبة rr؟ بما أن الحالة الابتدائية هي تراكب فوق جميع الحالات الذاتية من الشكل المذكور أعلاه، فإن خوارزمية QPE تقدّر في آنٍ واحد كل من θk\theta_k المقابلة لهذه الحالات الذاتية. لذا، قياس كيوبتات التحكم البالغة mm في النهاية سيعطي تقريبًا للقيمة k/rk/r حيث k{0,1,2,...,r1}k \in \{0,1,2,...,r-1\} هي إحدى القيم الذاتية المختارة عشوائيًا. إذا كرّرنا هذه الدائرة بضع مرات وحصلنا على بضع عيّنات بقيم مختلفة لـ kk، سنتمكّن بسرعة من استنتاج rr.

التطبيق في Qiskit

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

سنُشغّل الخوارزمية باستخدام إطار العمل القياسي لدينا لحل المسائل الكمومية، المسمى إطار أنماط Qiskit. يتكوّن من أربع خطوات:

  1. تعيين مسألتك على دائرة كمومية
  2. تحسين الدائرة لتشغيلها على الأجهزة الكمومية
  3. تنفيذ دائرتك على الحاسوب الكمومي
  4. المعالجة اللاحقة للقياسات

1. التعيين

لنحلّل N=15N=15، مختارين a=2a=2 كعددنا الصحيح الأولي المشترك.

أولًا، نحتاج إلى بناء الدائرة التي ستنفّذ العامل الأحادي للضرب المعياري، MaM_a. هذا في الواقع أصعب جزء في التطبيق بأكمله، ويمكن أن يكون مكلفًا حسابيًا جدًا، حسب طريقة إجرائه. لهذا، سنحتال قليلًا: نعلم أننا نبدأ في الحالة 1|1\rangle، ومن سؤال تحقق سابق،

M21=2M22=4M24=8M28=1\begin{aligned} M_2|1\rangle &= |2\rangle & \\ M_2|2\rangle &= |4\rangle \\ M_2|4\rangle &= |8\rangle \\ M_2|8\rangle &= |1\rangle \\ \end{aligned}

إذن، سنبني عاملًا أحاديًا يقوم بالعمليات الصحيحة على هذه الحالات الأربع، لكنه يترك جميع الحالات الأخرى دون تغيير. هذا يعدّ غشًا لأننا نستخدم معرفتنا برتبة 2mod152\bmod 15 لتبسيط العامل الأحادي. لو كنّا نحاول فعلًا تحليل عدد لا نعرف عواملها، لما تمكّنا من فعل هذا.

اختبر فهمك

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

بناءً على معرفتك بكيفية تحويل المؤثر M2M_2 للحالات المذكورة أعلاه، أنشئ المؤثر من سلسلة بوابات SWAP التي تبادل حالات كيوبتين. (تلميح: كتابة كل حالة i|i\rangle بالصيغة الثنائية سيساعدك.)

الجواب:

لنعيد كتابة فعل M2M_2 على الحالات بالصيغة الثنائية:

M20001=0010M20010=0100M20100=1000M21000=0001\begin{aligned} M_2|0001\rangle &= |0010\rangle \\ M_2|0010\rangle &= |0100\rangle \\ M_2|0100\rangle &= |1000\rangle \\ M_2|1000\rangle &= |0001\rangle \\ \end{aligned}

كل واحدة من هذه الأفعال يمكن تحقيقها بعملية SWAP بسيطة. M20001M_2|0001\rangle تتحقق بتبادل حالتَي الكيوبت 00 و11. M20010M_2|0010\rangle تتحقق بتبادل حالتَي الكيوبت 11 و22. وهكذا. إذن، يمكننا تفكيك مصفوفة M2M_2 إلى السلسلة التالية من بوابات SWAP:

M2=SWAP(0,1)SWAP(1,2)SWAP(2,3)M_2 = SWAP(0,1)SWAP(1,2)SWAP(2,3)

بالأخذ بعين الاعتبار أن المؤثرات تعمل من اليمين إلى اليسار، لنتحقق أن هذا يحقق الأثر المطلوب على كل حالة:

M20001=SWAP(0,1)SWAP(1,2)SWAP(2,3)0001=SWAP(0,1)SWAP(1,2)0001=SWAP(0,1)0001=0010M20010=SWAP(0,1)SWAP(1,2)SWAP(2,3)0010=SWAP(0,1)SWAP(1,2)0010=SWAP(0,1)0100=0100M20100=SWAP(0,1)SWAP(1,2)SWAP(2,3)0100=SWAP(0,1)SWAP(1,2)1000=SWAP(0,1)1000=1000M21000=SWAP(0,1)SWAP(1,2)SWAP(2,3)1000=SWAP(0,1)SWAP(1,2)0100=SWAP(0,1)0010=0001\begin{aligned} M_2|0001\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0001\rangle \\ &= SWAP(0,1)SWAP(1,2)|0001\rangle \\ &= SWAP(0,1)|0001\rangle \\ &=|0010\rangle \checkmark \\ M_2|0010\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0010\rangle \\ &= SWAP(0,1)SWAP(1,2)|0010\rangle \\ &= SWAP(0,1)|0100\rangle \\ &=|0100\rangle \checkmark \\ M_2|0100\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|0100\rangle \\ &= SWAP(0,1)SWAP(1,2)|1000\rangle \\ &= SWAP(0,1)|1000\rangle \\ &=|1000\rangle \checkmark \\ M_2|1000\rangle &= SWAP(0,1)SWAP(1,2)SWAP(2,3)|1000\rangle \\ &= SWAP(0,1)SWAP(1,2)|0100\rangle \\ &= SWAP(0,1)|0010\rangle \\ &=|0001\rangle \checkmark \\ \end{aligned}

الآن يمكننا برمجة الدائرة المكافئة لهذا المؤثر في Qiskit.

أولاً، نستورد الحزم اللازمة:

# Import necessary packages

import numpy as np
from fractions import Fraction
from math import floor, gcd, log

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.library import QFTGate
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization import plot_histogram

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler

ثم نبني المؤثر M2M_2:

def M2mod15():
"""
M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)

U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)

U = U.to_gate()
U.name = f"M_{b}"

return U
# Get the M2 operator
M2 = M2mod15()

# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M2, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)

Output of the previous code cell

خوارزمية QPE تستخدم بوابة UU متحكَّم بها. إذن، بعد أن أنشأنا دائرة M2M_2، نحتاج إلى جعلها دائرة متحكَّم بها M2M_2:

def controlled_M2mod15():
"""
Controlled M2 (mod 15)
"""
b = 2
U = QuantumCircuit(4)

U.swap(2, 3)
U.swap(1, 2)
U.swap(0, 1)

U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()

return c_U
# Get the controlled-M2 operator
controlled_M2 = controlled_M2mod15()

# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M2, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)

Output of the previous code cell

الآن لدينا بوابة UU المتحكَّم بها. لكن لتشغيل خوارزمية تقدير الطور الكمي، سنحتاج إلى U2U^2 متحكَّم بها، وU4U^4 متحكَّم بها، وصولاً إلى U2m1U^{2^{m-1}} متحكَّم بها، حيث mm هو عدد الكيوبتات المستخدمة لتقدير الطور. كلما زاد عدد الكيوبتات، كان تقدير الطور أكثر دقة. سنستخدم m=8m=8 كيوبتات تحكم في إجراء تقدير الطور. إذن نحتاج إلى:

Ma2kya2kymodNM_{a^{2^k}}|y\rangle \equiv |a^{2^k} y \bmod N \rangle

حيث المؤشر kk، مع 0km1=70 \le k \le m-1 = 7، يتوافق مع كيوبت التحكم. الآن لنحسب a2kmodNa^{2^k}\bmod N لكل قيمة من قيم kk:

def a2kmodN(a, k, N):
"""Compute a^{2^k} (mod N) by repeated squaring"""
for _ in range(k):
a = int(np.mod(a**2, N))
return a
k_list = range(8)
b_list = [a2kmodN(2, k, 15) for k in k_list]

print(b_list)
[2, 4, 1, 1, 1, 1, 1, 1]

بما أن a2kmodN=1a^{2^k} \bmod N = 1 عند k2k \ge 2، فإن كل المؤثرات المقابلة (M8M_8 وما فوق) مكافئة للمؤثر الوحداني. إذن، نحتاج فقط إلى بناء مصفوفة واحدة إضافية وهي M4M_4.

ملاحظة: هذا التبسيط يعمل هنا فقط لأن رتبة 2mod152 \bmod 15 هي 44. بمجرد أن يصبح k=2k=2 (أي 2k=42^k = 4)، كل قوة لاحقة للمؤثر تصبح مؤثراً وحدانياً. بشكل عام، للأعداد الأكبر NN أو اختيارات مختلفة لـ aa، لا يمكنك تخطي بناء القوى الأعلى. هذا أحد الأسباب التي تجعل هذا يُعتبر مثالاً تجريبياً: الأرقام الصغيرة تتيح اختصارات لن تنجح مع الحالات الأكبر.

def M4mod15():
"""
M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)

U.swap(1, 3)
U.swap(0, 2)

U = U.to_gate()
U.name = f"M_{b}"

return U
# Get the M4 operator
M4 = M4mod15()

# Add it to a circuit and plot
circ = QuantumCircuit(4)
circ.compose(M4, inplace=True)
circ.decompose(reps=2).draw(output="mpl", fold=-1)

Output of the previous code cell

وكما فعلنا سابقاً، نجعلها مؤثر M4M_4 متحكَّماً به:

def controlled_M4mod15():
"""
Controlled M4 (mod 15)
"""
b = 4
U = QuantumCircuit(4)

U.swap(1, 3)
U.swap(0, 2)

U = U.to_gate()
U.name = f"M_{b}"
c_U = U.control()

return c_U
# Get the controlled-M4 operator
controlled_M4 = controlled_M4mod15()

# Add it to a circuit and plot
circ = QuantumCircuit(5)
circ.compose(controlled_M4, inplace=True)
circ.decompose(reps=1).draw(output="mpl", fold=-1)

Output of the previous code cell

الآن، يمكننا تجميع كل شيء معاً لإيجاد رتبة 2mod152\bmod 15 بدائرة كمومية، باستخدام تقدير الطور:

# Order finding problem for N = 15 with a = 2
N = 15
a = 2

# Number of qubits
num_target = floor(log(N - 1, 2)) + 1 # for modular exponentiation operators
num_control = 2 * num_target # for enough precision of estimation

# List of M_b operators in order
k_list = range(num_control)
b_list = [a2kmodN(2, k, 15) for k in k_list]

# Initialize the circuit
control = QuantumRegister(num_control, name="C")
target = QuantumRegister(num_target, name="T")
output = ClassicalRegister(num_control, name="out")
circuit = QuantumCircuit(control, target, output)

# Initialize the target register to the state |1>
circuit.x(num_control)

# Add the Hadamard gates and controlled versions of the
# multiplication gates
for k, qubit in enumerate(control):
circuit.h(k)
b = b_list[k]
if b == 2:
circuit.compose(
M2mod15().control(), qubits=[qubit] + list(target), inplace=True
)
elif b == 4:
circuit.compose(
M4mod15().control(), qubits=[qubit] + list(target), inplace=True
)
else:
continue # M1 is the identity operator

# Apply the inverse QFT to the control register
circuit.compose(QFTGate(num_control).inverse(), qubits=control, inplace=True)

# Measure the control register
circuit.measure(control, output)

circuit.draw("mpl", fold=-1)

Output of the previous code cell

2. التحسين

بعد أن رسمنا دائرتنا، الخطوة التالية هي تحسينها لتشغيلها على حاسوب كمي معين. أولاً نحتاج إلى تحميل الخلفية (backend).

service = QiskitRuntimeService()

backend = service.backend("ibm_marrakesh")

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

pm = generate_preset_pass_manager(optimization_level=2, backend=backend)

transpiled_circuit = pm.run(circuit)

print(f"2q-depth: {transpiled_circuit.depth(lambda x: x.operation.num_qubits==2)}")
print(f"2q-size: {transpiled_circuit.size(lambda x: x.operation.num_qubits==2)}")
print(f"Operator counts: {transpiled_circuit.count_ops()}")
transpiled_circuit.draw(output="mpl", fold=-1, style="clifford", idle_wires=False)
2q-depth: 188
2q-size: 281
Operator counts: OrderedDict({'sx': 548, 'rz': 380, 'cz': 281, 'measure': 8, 'x': 6})

Output of the previous code cell

3. التنفيذ

# Sampler primitive to obtain the probability distribution
sampler = Sampler(backend)

# Turn on dynamical decoupling with sequence XpXm
sampler.options.dynamical_decoupling.enable = True
sampler.options.dynamical_decoupling.sequence_type = "XpXm"
# Enable gate twirling
sampler.options.twirling.enable_gates = True

pub = transpiled_circuit
job = sampler.run([pub], shots=1024)
result = job.result()[0]
counts = result.data["out"].get_counts()
plot_histogram(counts, figsize=(35, 5))

Output of the previous code cell

نرى أربع قمم واضحة عند 00000000 و01000000 و10000000 و11000000، مع بعض العدّات في سلاسل بت أخرى بسبب الضوضاء في الحاسوب الكمي. سنتجاهل هذه ونحتفظ فقط بالأربع القمم الرئيسية من خلال تطبيق عتبة: فقط العدّات التي تتجاوز هذه العتبة تُعتبر إشارة حقيقية فوق الضوضاء.

# Dictionary of bitstrings and their counts to keep
counts_keep = {}
# Threshold to filter
threshold = np.max(list(counts.values())) / 2

for key, value in counts.items():
if value > threshold:
counts_keep[key] = value

print(counts_keep)

4. المعالجة اللاحقة

في خوارزمية شور، جزء كبير من الخوارزمية يُنفَّذ كلاسيكياً. إذن، سنضع باقي الخطوات في مرحلة "المعالجة اللاحقة"، بعد أن نحصل على قياساتنا من الحاسوب الكمي. كل واحدة من القياسات أعلاه يمكن تحويلها إلى أعداد صحيحة، والتي بعد القسمة على 2m2^m تصبح تقريباتنا لـ kr\frac{k}{r}، حيث kk عشوائي في كل مرة.

a = 2
N = 15

FACTOR_FOUND = False
num_attempt = 0

while not FACTOR_FOUND:
print(f"\nATTEMPT {num_attempt}:")
# Here, we get the bitstring by iterating over outcomes
# of a previous hardware run with multiple shots.
# Instead, we can also perform a single-shot measurement
# here in the loop.
bitstring = list(counts_keep.keys())[num_attempt]
num_attempt += 1
# Find the phase from measurement
decimal = int(bitstring, 2)
phase = decimal / (2**num_control) # phase = k / r
print(f"Phase: theta = {phase}")

# Guess the order from phase
frac = Fraction(phase).limit_denominator(N)
r = frac.denominator # order = r
print(f"Order of {a} modulo {N} estimated as: r = {r}")

if phase != 0:
# Guesses for factors are gcd(a^{r / 2} ± 1, 15)
if r % 2 == 0:
x = pow(a, r // 2, N) - 1
d = gcd(x, N)
if d > 1:
FACTOR_FOUND = True
print(f"*** Non-trivial factor found: {x} ***")
ATTEMPT 0:
Phase: theta = 0.0
Order of 2 modulo 15 estimated as: r = 1

ATTEMPT 1:
Phase: theta = 0.75
Order of 2 modulo 15 estimated as: r = 4
*** Non-trivial factor found: 3 ***

الخاتمة

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

بينما لا نزال بعيدين عن استخدام هذه الخوارزمية لتحليل أرقام مثل RSA1024، إلا أن حواسيبنا الكمومية تتحسن كل يوم، وبمجرد الوصول إلى عتبة تُسمى التحمل للأخطاء، فإن خوارزميات كهذه ستكون في المتناول قريباً. إنه وقت مثير للتعلم عن الحوسبة الكمية!

المسائل

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

  • تعتمد أنظمة التشفير الحديثة على الصعوبة الكلاسيكية في تحليل الأعداد الصحيحة الكبيرة.
  • الحساب المعياري — بما في ذلك البنيتان ZN\mathbb{Z}_N وZN\mathbb{Z}_N^* — يوفر الأساس الرياضي لخوارزمية شور.
  • يمكن اختزال مشكلة تحليل العدد الصحيح NN إلى مشكلة إيجاد رتبة عدد ما بالنسبة المعيارية لـ NN.
  • إيجاد الرتبة الكمومي يستخدم تقنيات تقدير الطور الكمي لتحديد دورة الدالة axmodNa^x \mod N.
  • تتكون خوارزمية شور من سير عمل هجين كلاسيكي-كمي يختار قاعدة، وينفذ إيجاد الرتبة كمومياً، ثم يحسب العوامل كلاسيكياً من النتيجة.

صح/خطأ:

  1. ص/خ كفاءة خوارزمية شور تهدد أمان تشفير RSA.
  2. ص/خ يمكن تنفيذ خوارزمية شور بكفاءة على أي حاسوب كمي حديث.
  3. ص/خ تستخدم خوارزمية شور تقدير الطور الكمي (QPE) كروتين فرعي رئيسي.
  4. ص/خ الجزء الكلاسيكي من خوارزمية شور يتضمن حساب القاسم المشترك الأكبر (GCD).
  5. ص/خ تعمل خوارزمية شور فقط لتحليل الأعداد الزوجية.
  6. ص/خ التشغيل الناجح لخوارزمية شور يضمن دائماً الحصول على العوامل الصحيحة.

أسئلة قصيرة:

  1. لماذا تُعتبر خوارزمية شور تهديداً مستقبلياً محتملاً لتشفير RSA؟
  2. لماذا يُعدّ إيجاد الدورة أو الرتبة لدالة أسية معيارية مفيداً لتحليل عدد ما في خوارزمية شور؟

مسائل تحدي:

  1. كم عدد كيوبتات التحكم mm الذي نحتاجه لعدد معطى NN نحاول تحليله للحصول على الدقة اللازمة في QPE لإيجاد القيمة الصحيحة للرتبة rr؟