مرحبا سكان! أحدثت أجهزة الكمبيوتر الكمومية ثورة جديدة في الكمبيوتر ، ولديك فرصة كبيرة للانضمام إلى التقدم التكنولوجي في الوقت الحالي. سيجد المطورون والمتخصصون في رسومات الكمبيوتر ومحترفو تكنولوجيا المعلومات الطموحون معلومات عملية حول الحوسبة الكمية التي يحتاجها المبرمجون في هذا الكتاب. بدلاً من دراسة النظرية والصيغ ، ستركز فورًا على مهام محددة تُظهر القدرات الفريدة لتقنية الكم.
يساعد كل من Eric Johnston و Nick Harrigan و Mercedes Gimeno-Segovia على تطوير المهارات اللازمة والحدس ، فضلاً عن إتقان الأدوات اللازمة لإنشاء تطبيقات الكم. سوف تفهم ما يمكن لأجهزة الكمبيوتر الكمومية أن تفعله وكيفية تطبيقه في الحياة الواقعية. يتكون الكتاب من ثلاثة أجزاء: - برمجة QPU: المفاهيم الأساسية لبرمجة المعالجات الكمومية ، وتنفيذ العمليات باستخدام الكيوبتات ، والنقل الآني الكمي. - بدائل QPU: البدائل الحسابية والطرق ، تضخيم السعة ، تحويل فورييه الكمومي وتقدير الطور. - ممارسة QPU: حل مشاكل محددة باستخدام بدائل QPU وطرق البحث الكمي وخوارزمية Shor للتحلل.
هيكل الكتاب
. , , (GPU), , .
— , QPU. , ( , ). (QPU) , QPU.
. I , .
I. QPU
, QPU: , , . QPU.
II. QPU
. , , . « », . , , QPU. QPU, , .
III. QPU
QPU — II — , QPU. .
, , , , .
— , QPU. , ( , ). (QPU) , QPU.
. I , .
I. QPU
, QPU: , , . QPU.
II. QPU
. , , . « », . , , QPU. QPU, , .
III. QPU
QPU — II — , QPU. .
, , , , .
بيانات حقيقية
تم تصميم تطبيقات QPU الكاملة للعمل مع بيانات حقيقية غير تدريبية. لا تقتصر البيانات الحقيقية دائمًا على الأعداد الصحيحة الأساسية التي توصلنا إليها حتى الآن. لذلك ، فإن مسألة كيفية تمثيل البيانات الأكثر تعقيدًا في QPU تستحق الجهد المبذول ، ويمكن أن تكون هياكل البيانات الجيدة بنفس أهمية الخوارزميات الجيدة. سنحاول في هذا الفصل الإجابة عن سؤالين تم تجاوزهما سابقًا:
- كيفية تمثيل أنواع البيانات المعقدة في سجل QPU؟ يمكن تمثيل عدد صحيح موجب في ترميز ثنائي بسيط. ولكن ماذا عن الأرقام غير المنطقية ، أو حتى أنواع البيانات المركبة مثل المتجهات أو المصفوفات؟ يأخذ هذا السؤال عمقًا جديدًا عندما نعتبر أن التراكب والمرحلة النسبية يمكن أن توفر خيارات ترميز كمي جديدة لأنواع البيانات هذه.
- , QPU? , WRITE . , QPU . , , , QPU , .
لنبدأ بالسؤال الأول. عند وصف تمثيلات QPU لأنواع البيانات ذات التعقيد المتزايد ، سنأتي إلى إدخال هياكل البيانات الكمية الكاملة ومفهوم ذاكرة الوصول العشوائي الكمية (QRAM). تعد ذاكرة الوصول العشوائي الكمومية موردًا مهمًا للعديد من تطبيقات QPU العملية.
سوف تعتمد المواد في الفصول اللاحقة بشكل كبير على هياكل البيانات المقدمة في هذا الفصل. على سبيل المثال ، ما يسمى بتشفير الاتساع المعقد الذي سيتم وصفه لبيانات المتجه يعد مركزيًا لجميع تطبيقات التعلم الآلي الكمومي المقدمة في الفصل 13.
البيانات غير الهدف
كيفية ترميز البيانات الرقمية غير الصحيحة في تسجيل QPU؟ الطريقتان المعياريتان لتمثيل هذه القيم في النظام الثنائي هما تمثيلات النقطة الثابتة وتمثيل الفاصلة العائمة. على الرغم من أن تمثيل النقطة العائمة أكثر مرونة (وقابل للتكيف مع نطاق القيم التي يجب تمثيلها بعدد معين من البتات) ، نظرًا للقيمة العالية للكيوبتات ودافعنا عن البساطة ، فإن تمثيل النقطة الثابتة هو مكان أفضل للبدء.
غالبًا ما يتم وصف أرقام النقطة الثابتة في تدوين Q (لسوء الحظ ، لا تعني Q في هذه الحالة "الكم"). هذا يساعد على إزالة الغموض حول مكان انتهاء البتات الكسرية وتبدأ البتات الصحيحة. يشير تدوين Qn.m إلى سجل n-bit ، حيث m بتات للجزء الكسري (وبالتالي ، تحتوي الأجزاء المتبقية (n - m) على الجزء الصحيح). بالطبع ، يمكنك استخدام نفس الترميز لتحديد كيفية استخدام سجل QPU لتشفير رقم نقطة ثابتة. على سبيل المثال ، في الشكل. يوضح الشكل 9.1 سجل QPU من ثمانية كيوبت ، والذي يشفر القيمة 3.640625 في تمثيل النقطة الثابتة Q8.6.
في المثال الموضح ، يمكن ترميز الرقم المحدد بدقة في تمثيل النقطة الثابتة ، لأن 3.640625 =
بالطبع ، لا يوجد مثل هذا الحظ دائمًا. تؤدي زيادة عدد البتات في الجزء الصحيح من سجل النقطة الثابتة إلى توسيع نطاق قيم الأعداد الصحيحة التي يمكن تمثيلها به ، بينما تؤدي زيادة عدد البتات في الجزء الكسري إلى تحسين دقة الجزء الكسري للرقم. كلما زاد عدد الكيوبتات في الجزء الكسري ، زادت احتمالية أن مجموعة ما
يمكن أن تمثل رقمًا معينًا بدقة.

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

هل يمكن استخدام الذاكرة التقليدية لتخزين القيم المخصصة لتهيئة سجلات QPU؟ بالطبع تبدو الفكرة جذابة.
إذا كنت تريد تهيئة سجل QPU بقيمة تقليدية واحدة فقط (تكملة ثنائية ، أو نقطة ثابتة ، أو تشفير ثنائي بسيط) ، فإن ذاكرة الوصول العشوائي (RAM) جيدة. يتم تخزين القيمة المطلوبة ببساطة في الذاكرة ، ويتم استخدام الكتابة () والقراءة () للكتابة أو القراءة من سجل QPU. هذه هي الآلية المحدودة التي تم استخدامها من قبل كود QCEngine JavaScript للتفاعل مع سجلات QPU حتى الآن.
على سبيل المثال ، نموذج الكود في قائمة 9.1 ، والذي يتلقى مصفوفة أ وينفذ العملية [2] + = 1 ؛ يجلب ضمنيًا هذه المجموعة من القيم من ذاكرة الوصول العشوائي لتهيئة سجل QPU. تظهر الدائرة في الشكل. 9.3

عينة من الرموز
يمكن عمل هذا المثال عبر الإنترنت على http://oreilly-qc.github.io؟p=9-1.
قائمة 9.1. استخدام QPU لزيادة الرقم في الذاكرة
var a = [4, 3, 5, 1];
qc.reset(3);
var qreg = qint.new(3, 'qreg');
qc.print(a);
increment(2, qreg);
qc.print(a);
function increment(index, qreg)
{
qreg.write(a[index]);
qreg.add(1);
a[index] = qreg.read();
}
تجدر الإشارة إلى أنه في هذه الحالة البسيطة ، لا يتم استخدام ذاكرة الوصول العشوائي التقليدية فقط لتخزين العدد الصحيح ، ولكن المعالج التقليدي يقوم أيضًا بفهرسة المصفوفة لتحديد ونقل QPU للقيمة المطلوبة.
على الرغم من أن استخدام ذاكرة الوصول العشوائي (RAM) يسمح بتهيئة سجلات QPU إلى قيم ثنائية بسيطة ، إلا أن لها قيودًا خطيرة. ماذا لو كنت بحاجة إلى تهيئة تسجيل QPU مع تراكب القيم المخزنة؟ على سبيل المثال ، افترض أنه في ذاكرة الوصول العشوائي ، تم تخزين القيمة 3 (110) على العنوان 0x01 ، والقيمة 5 (111) مخزنة على العنوان 0x11. كيف أقوم بإعداد سجل الإدخال في تراكب هاتين القيمتين؟
مع ذاكرة الوصول العشوائي التقليدية وعملية الكتابة () التقليدية عالية الأداء ، لن يعمل هذا. سوف تحتاج المعالجات الكمومية ، مثلما فعل أسلافها الأنبوبية من قبل ، إلى معدات ذاكرة جديدة بشكل أساسي - الكم في الطبيعة. تتيح لك تلبية ذاكرة الوصول العشوائي الكمية (QRAM) قراءة البيانات وكتابتها على المستوى الكمي. توجد بالفعل بعض الأفكار حول كيفية بناء QRAM فعليًا ، ولكن تجدر الإشارة إلى أن التاريخ قد يعيد نفسه جيدًا ، وقد تظهر معالجات كمومية قوية بشكل لا يصدق قبل وقت طويل من وجود أي جهاز ذاكرة كمومية قابلة للتطبيق.
يجدر شرح ما يفعله QRAM بشكل أكثر دقة. مثل الذاكرة التقليدية ، يتلقى QRAM سجلين كمدخلات: سجل عنوان QPU لعنوان الذاكرة وسجل إخراج QPU ، الذي يُرجع القيمة المخزنة في العنوان المحدد. بالنسبة لـ QRAM ، يتكون كلا المسجلين من كيوبتات. هذا يعني أنه في سجل العناوين ، من الممكن ضبط تراكب خلايا الذاكرة ، ونتيجة لذلك ، الحصول على تراكب للقيم المقابلة في سجل الخرج (الشكل 9.4).

لذا يسمح لك QRAM بالفعل بقراءة القيم المخزنة في التراكب. يتم تحديد السعات المعقدة الدقيقة للتراكب الذي سيتم الحصول عليه في سجل الإخراج من خلال التراكب المقدم في سجل العناوين. في التين. يوضح الشكل 9.2 الاختلافات عند إجراء نفس عملية الزيادة في القائمة 9.1 (الشكل 9.5) ، ولكن باستخدام QRAM للوصول إلى البيانات بدلاً من عمليات القراءة / الكتابة QPU. يشير الحرف "A" إلى السجل الذي يتم فيه إرسال عنوان QRAM (أو التراكب). يشير الحرف "D" إلى السجل الذي تقوم فيه QRAM بإرجاع التراكب المقابل للقيم المخزنة (البيانات).

عينة من الرموز
يمكن عمل هذا المثال عبر الإنترنت على oreilly-qc.github.io؟p=9-2 .
قائمة 9.2. استخدام QPU لزيادة رقم من QRAM - قد يحتوي سجل العنوان على تراكب ، مما سيؤدي إلى احتواء سجل الإخراج على تراكب القيم المخزنة
var a = [4, 3, 5, 1];
var reg_qubits = 3;
qc.reset(2 + reg_qubits + qram_qubits());
var qreg = qint.new(3, 'qreg');
var addr = qint.new(2, 'addr');
var qram = qram_initialize(a, reg_qubits);
qreg.write(0);
addr.write(2);
addr.hadamard(0x1);
qram_load(addr, qreg);
qreg.add(1);
قد يبدو هذا الوصف لـ QRAM غامضًا جدًا - ما هي أجهزة الذاكرة الكمومية؟ في هذا الكتاب ، لن نقدم وصفًا لكيفية بناء QRAM عمليًا (على سبيل المثال ، لا تقدم معظم الكتب على C ++ وصفًا تفصيليًا لكيفية عمل الذاكرة التقليدية). يتم تنفيذ أمثلة التعليمات البرمجية مثل تلك الموجودة في القائمة 9.2 باستخدام نموذج مبسط يحاكي سلوك QRAM. ومع ذلك ، توجد نماذج أولية لتقنيات QRAM.
في حين أن الذاكرة الكمومية ستكون مكونًا حاسمًا لأي QPU جاد ، فمن المحتمل أن تتغير تفاصيل التنفيذ ، كما هو الحال مع أي جهاز حوسبة كمومية. ما يهمنا هو فكرة المورد الأساسي الذي يتصرف كما هو موضح في الشكل. 9.4 ، والتطبيقات القوية التي يمكن بناؤها فوقها.
مع وجود ذاكرة كمومية تحت تصرفك ، يمكنك الانتقال إلى بناء هياكل بيانات كمية معقدة. تحظى الهياكل التي تسمح لك بتمثيل بيانات المتجه والمصفوفة بأهمية خاصة.
ترميز المتجهات
لنفترض أنك تريد تهيئة سجل QPU لتمثيل متجه بسيط مثل المعادلة 9.1.
الصيغة 9.1. مثال على متجه لتهيئة سجل QPU.

غالبًا ما توجد البيانات في هذا النموذج في تطبيقات التعلم الآلي الكمي.
ربما تكون الطريقة الأكثر وضوحًا لتشفير بيانات المتجه هي تمثيل كل مكون كسجل QPU منفصل مع تمثيل ثنائي مناسب. سنسمي هذا (ربما يكون الأكثر وضوحًا) طريقة ترميز الحالة للمتجهات. يمكن ترميز المتجه من المثال أعلاه في أربعة سجلات من اثنين كيوبت ، كما هو موضح في الشكل. 9.6

تتمثل إحدى مشكلات ترميز الحالة الساذجة في أنه يهدر الكيوبتات - أثمن مورد لوحدة QPU. ومع ذلك ، فإن إحدى مزايا النواقل التقليدية المشفرة بالحالة هي أنها لا تتطلب ذاكرة كمومية. يمكن ببساطة تخزين مكونات المتجه في الذاكرة القياسية ويمكن استخدام قيمها المنفصلة للتحكم في إعداد كل سجل QPU فردي. لكن هذه الميزة تكمن أيضًا وراء أخطر عيب في ترميز الحالة المتجهية: تخزين بيانات المتجه بهذه الطريقة التقليدية يمنعنا من استخدام القدرات غير التقليدية لوحدات QPU. لاستخدام قوة QPU ، يجب أن تكون قادرًا على معالجة المراحل النسبية للتراكبات ، وهذا ليس بالأمر السهل ،إذا كان كل مكون من عناصر المتجه يتعامل بالفعل مع المعالج الكمي الخاص بك كمجموعة من السجلات الثنائية التقليدية!
بدلاً من ذلك ، تحتاج إلى النزول إلى المستوى الكمي. لنفترض أن مكونات المتجه مخزنة في تراكب اتساع سجل QPU واحد. نظرًا لأن سجل QPU لـ n كيوبت يمكن أن يوجد في تراكب بسعة 2n (وبالتالي ستكون هناك دوائر 2n للتجارب مع التسجيل الدائري) ، فمن الممكن تمثيل ترميز متجه مع n من المكونات في سجل QPU مع ceil (log (n)) qubits.
بالنسبة لمثال المتجه من الصيغة 9.1 ، سيتطلب هذا النهج سجلًا مكونًا من 2 كيوبت - الفكرة هي إيجاد مخطط كمي مناسب لتشفير بيانات المتجه في الشكل 1. 9.7

دعونا نطلق على هذا الترميز الفريد لبيانات المتجه الكمي ترميز السعة المعقدة. من المهم تقدير الاختلافات بين ترميز الاتساع المعقد وتشفير الحالة الأكثر تقليدية. الطاولة يقارن 9.1 بين طريقتي التشفير لبيانات المتجه المختلفة. سيحتاج المثال الأخير لتشفير الحالة إلى أربعة سجلات من 7 بتات ، يستخدم كل منها تمثيل النقطة الثابتة Q7.7.
الجدول 9.1. الاختلافات بين طرق تشفير بيانات المتجه (ترميز السعة المعقدة وترميز الحالة)

للحصول على متجهات مع ترميز سعة معقد في QCEngine ، يمكنك استخدام وظيفة amplitude_encode () الملائمة. يأخذ البرنامج في القائمة 9.3 متجهًا للقيم ومرجعًا إلى سجل QPU (والذي يجب أن يكون كبيرًا بدرجة كافية) ويقوم بإعداد هذا السجل عن طريق تنفيذ تشفير سعة معقد على المتجه.
عينة من الرموز
يمكن عمل هذا المثال عبر الإنترنت على oreilly-qc.github.io؟p=9-3 .
قائمة 9.3. تحضير متجهات مع ترميز سعة معقد في محرك QCE
// ,
// 2
var vector = [-1.0, 1.0, 1.0, 5.0, 5.0, 6.0, 6.0, 6.0];
//
//
var num_qubits = Math.log2(vector.length);
qc.reset(num_qubits);
var amp_enc_reg = qint.new(num_qubits, 'amp_enc_reg');
// amp_enc_reg
amplitude_encode(vector, amp_enc_reg);
في هذا المثال ، يتم تمرير المتجه ببساطة كمصفوفة JavaScript مخزنة في الذاكرة التقليدية - على الرغم من أننا أشرنا إلى أن تشفير السعة المعقدة يعتمد على QRAM. كيف يقوم QCEngine بتنفيذ ترميز سعة معقد عندما تكون ذاكرة الوصول العشوائي (RAM) الخاصة بالكمبيوتر متاحة للبرنامج فقط؟ في حين أنه من الممكن إنشاء مخطط ترميز سعة معقد بدون QRAM ، فمن المؤكد أنه لا يمكن القيام به بكفاءة. يوفر QCEngine نموذجًا بطيئًا ولكنه عملي لما يمكن تحقيقه من خلال الوصول إلى QRAM.
حدود سعة الترميز المعقدة
تبدو الفكرة وراء تشفير السعة المعقدة رائعة في البداية - فهي تستخدم عددًا أقل من الكيوبتات وتوفر أدوات كمومية للعمل مع بيانات المتجه. في أي تطبيق يستخدم هذه الآلية ، هناك عاملان مهمان يجب مراعاتهما.
المشكلة الأولى: النتائج الكمية
ربما تكون قد لاحظت بالفعل أول هذه القيود: لا يمكن قراءة التراكبات الكمية عمومًا عن طريق القراءة. عدونا الرئيسي مرة أخرى! إذا وزعت مكونات المتجه على التراكب الكمي ، فلا يمكن قراءتها مرة أخرى. بطبيعة الحال ، هذا لا يخلق أي مشاكل خاصة عند نقل بيانات المتجه إلى إدخال برنامج QPU آخر من الذاكرة. ولكن في كثير من الأحيان ، فإن تطبيقات QPU التي تتلقى بيانات متجهية معقدة بترميز AM عند الإدخال ستولد أيضًا بيانات متجهية معقدة بترميز AM عند الإخراج.
وبالتالي ، فإن استخدام تشفير السعة المعقدة يحد بشدة من قدرتنا على قراءة مخرجات التطبيق من خلال عملية READ. لحسن الحظ ، من الممكن غالبًا استخراج معلومات مفيدة من نتائج تشفير السعة المعقدة. كما سترى في الفصول التالية ، على الرغم من أنك لا تستطيع التعرف على المكونات الفردية ، يمكنك معرفة الخصائص العامة للمتجهات المشفرة بهذه الطريقة. ومع ذلك ، فإن ترميز الاتساع المعقد ليس حلاً سحريًا ، ويتطلب تطبيقه الناجح الانتباه والبراعة.
المشكلة 2: شرط تطبيع النواقل
المشكلة الثانية المرتبطة بتشفير الاتساع المعقد مخفية في الجدول. 9.1 ألق نظرة فاحصة على ترميز السعة المعقدة للمتجهين الأولين في الجدول: [0،1،2،3] و [6،1،1،4]. هل يمكن أن تأخذ السعات المعقدة لسجل QPU المكون من 2 كيوبت القيم [0،1،2،3] أو القيم [6،1،1،4]؟ للأسف لا. في الفصول السابقة ، تجاوزنا عادة مناقشة السعات والمراحل النسبية لصالح تدوين دائري أكثر سهولة. في حين أن هذا النهج كان أكثر سهولة ، إلا أنه كان يحميك من قاعدة عددية مهمة حول السعات المعقدة: يجب أن تضيف مربعات السعات المعقدة للسجل ما يصل إلى 1. هذا المطلب ، المسمى بالتطبيع ، يكون منطقيًا عندما تتذكر أن مربعات السعات في السجل تتوافق مع احتمالات القراءة. نتائج مختلفة.نظرًا لأنه يجب الحصول على نتيجة واحدة ، فإن هذه الاحتمالات (وبالتالي مربعات جميع السعات المعقدة) يجب أن تضيف ما يصل إلى 1. عند استخدام تدوين دائري مناسب ، من السهل نسيان التسوية ، ولكنها تضع قيدًا مهمًا على المتجه يمكن تطبيق ترميز السعة المعقدة على البيانات. لا تسمح قوانين الفيزياء بإنشاء سجل في حالة تراكب بسعات معقدة [0،1،2،3] أو [6،1،1،4].يجري في حالة تراكب مع اتساع معقدة [0،1،2،3] أو [6،1،1،4].يجري في حالة تراكب مع اتساع معقدة [0،1،2،3] أو [6،1،1،4].
لتطبيق تشفير السعة المعقدة على متجهين لمشكلة من الجدول. 9.1 ، تحتاج أولاً إلى تسويتها بقسمة كل مكون على مجموع مربعات كل المكونات. على سبيل المثال ، في ترميز السعة المعقدة للمتجه [0،1،2،3] ، تحتاج أولاً إلى قسمة جميع المكونات على 3.74 للحصول على متجه معياري [0.00 ، 0.27 ، 0.53 ، 0.80] ، وهو مناسب الآن للتشفير في اتساعات التراكب المعقدة.
هل تطبيع بيانات المتجه له أي آثار غير مرغوب فيها؟ يبدو أن البيانات قد تغيرت تمامًا! في الواقع ، يترك التطبيع معظم المعلومات المهمة دون تغيير (في التمثيل الهندسي ، يقيس طول المتجه فقط ، ويترك الاتجاه دون تغيير). هل يمكننا أن نفترض أن البيانات المعيارية تحل محل البيانات الأصلية تمامًا؟ يعتمد ذلك على احتياجات تطبيق QPU المعين الذي تنوي استخدامه فيه. تذكر أنه يمكنك تخزين القيمة العددية لعامل التسوية في سجل مختلف إذا لزم الأمر.
ترميز السعة المعقدة والتسجيل الدائري
عندما تبدأ في التفكير بشكل أكثر تحديدًا في القيم الرقمية للسعات المعقدة للسجلات ، قد يكون من المفيد تذكير نفسك بكيفية تمثيل السعات المعقدة في التدوين الدائري ، وملاحظة مأزق محتمل. تمثل المناطق المملوءة في التدوين الدائري مربعات اتساع السعات المعقدة للحالة الكمية. في حالات مثل ترميز السعة المعقدة ، حيث يجب أن تمثل السعات المعقدة مكونات متجه بقيم حقيقية ، فهذا يعني أن المناطق المملوءة يتم تحديدها بواسطة مربع مكون المتجه المقابل ، وليس بواسطة المكون نفسه. في التين. يوضح 9.8 كيفية تفسير تمثيل المتجه [0،1،2،3] بشكل صحيح بعد التسوية في التدوين الدائري.

أنت الآن تعرف ما يكفي عن المتجهات المعقدة المشفرة بالسعة لفهم تطبيقات QPU التي سيتم تقديمها في الكتاب. ولكن بالنسبة للعديد من التطبيقات ، خاصة تلك المتعلقة بالتعلم الآلي الكمي ، من الضروري المضي قدمًا خطوة أخرى واستخدام QPU لمعالجة ليس فقط المتجهات ، ولكن أيضًا مصفوفات البيانات بأكملها. كيف تقوم بتشفير مصفوفات الأرقام ثنائية الأبعاد؟
»يمكن العثور على مزيد من التفاصيل حول الكتاب على الموقع الإلكتروني لدار النشر
» جدول المحتويات
» مقتطفات
للساكنين خصم 25٪ على القسيمة - البرمجة
عند الدفع مقابل النسخة الورقية من الكتاب ، يتم إرسال كتاب إلكتروني إلى البريد الإلكتروني.