مقدمة في علوم الحاسوب النظرية › تمهيد 1 / 26 التالي

مقدمة الكتاب {#prefacechap }

مقدمة الكتاب

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

"أنصحك بأخذ أصعب المساقات التي تستطيع، لأنك تتعلم أكثر حين تطلب من نفسك ما هو صعب... وجدت مساق CS 121 صعبًا إلى حد كبير."، مارك زوكربيرغ، 2005.

هذا كتاب دراسي لمقرر تمهيدي في علم الحاسوب النظري (theoretical computer science) لمستوى البكالوريوس. والأهداف التعليمية لهذا الكتاب هي نقل ما يأتي:

  • أن الحوسبة (computation) تنشأ في مجموعة متنوعة من الأنظمة الطبيعية والأنظمة المصنوعة من قبل الإنسان، لا في الحواسيب الحديثة المعتمدة على السيليكون فحسب.

  • وأن الحوسبة، على نحو مماثل، لا تكتفي كونها أداة بالغة الأهمية، بل تؤدي أيضًا دور عدسة مفيدة لوصف المفاهيم الطبيعية والفيزيائية والرياضية وحتى الاجتماعية.

  • فكرة العمومية (universality) في نماذج الحوسبة المختلفة العديدة، وفكرة ثنائية الشيفرة (code) و_البيانات_ (data) المرتبطة بها.

  • الفكرة مفادها أنه يمكن تعريف نموذج رياضي للحوسبة بدقّة، ثم استخدام ذلك النموذج لإثبات الحدود الدنيا ونتائج الاستحالة، أو أحيانًا للافتراض فحسب.

  • بعض النتائج والاكتشافات المدهشة في علم الحاسوب النظري الحديث، ومنها هيمنة اكتمال NP (NP-completeness)، وقوة التفاعل، وقوة العشوائية من جهة وإمكانية إزالة العشوائية (derandomization) من جهة أخرى، والقدرة على استخدام الصعوبة «لأغراض خيرة» في علم التعمية (cryptography)، وإمكانية الحوسبة الكمّية (quantum computing) البالغة الدهشة.

آمل أن يتمكن الطلاب بعد دراسة هذا المقرر من التعرّف على الحوسبة، بقوتها ومخاطرها معًا، حين تنشأ في مختلف السياقات، ومنها المحتوى الذي يبدو «ساكنًا» أو الأطر الرسمية «المقيّدة» مثل وحدات الماكرو (macros) والسكربتات (scripts). وينبغي أن يتمكّنوا من متابعة منطق البراهين (proofs) المتعلقة بالحوسبة، بما في ذلك المفهوم المحوري للاختزال (reduction)، وكذلك فهم البراهين «الإحالةية إلى الذات» مثل البراهين القائمة على القطرية (diagonalization) التي تنطوي على برامج يُعطى لها شيفرتها الخاصة كمدخلات. وينبغي للطلاب أن يفهموا أن بعض المسائل صعبة الفكّ بطبيعتها (inherently intractable)، وأن يتمكّنوا من التعرّف على إمكانية عدم القابلية للحلّ حين يواجهون مسألة جديدة. ولئن كان هذا الكتاب لا يلمس التعمية إلا لمسات يسيرة، فعلى الطلاب أن يفهموا الفكرة الأساسية لكيفية استخدامنا الصعوبةَ الحاسوبية لأغراض تعموية. وغير ذلك، فالأهم من أي مهارة محددة، إنما يهدف هذا الكتاب إلى تعريف الطلاب بطريقة جديدة في التفكير في الحوسبة بوصفها موضوعًا في حد ذاته، وبيان كيف تقود هذه الطريقة الجديدة إلى رؤى وتطبيقات بعيدة المدى.

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

البراهين في هذا الكتاب، ومنها وجود آلة تورينج (Turing Machine) عالمية، وحقيقة أن كل دالة متناهية يمكن حسابها بدائرة ما، ومبرهنة كوك-ليفن (Cook-Levin)، وغيرها كثير، غالبًا ما تكون بانية وخوارزمية، بمعنى أنها تنتهي في المطالأصل إلى تحويل برنامج إلى برنامج آخر. وفي حين يمكن متابعة هذه البراهين من دون رؤية الشيفرة، فإنني أعتقد فعلًا أن توفّر الشيفرة، والقدرة على العبث بها ورؤية كيف تتصرف تجاه البرامج المختلفة، من شأنهما أن يجعلا هذه المبرهنات أكثر ملموسة لدى الطلاب. ولهذا الغرض، يتيح موقعٌ مرافق، لا يزال قيد الإنشاء، تنفيذ البرامج في نماذج الحوسبة المختلفة التي نعرّفها، وكذلك رؤية البراهين البانية لبعض هذه المبرهنات.

إلى الطالب

قد يكون هذا الكتاب صعبًا، أساسًا لأنه يجمع بين تنوّع من الأفكار والتقنيات في دراسة الحوسبة. وهناك عدد ليس بالقليل من العقبات التقنية التي ينبغي إتقانها، سواء كان ذلك اتباع حجة القطرية لإثبات أن مسألة التوقف (Halting Problem) غير قابلة للقرار، أو الأدوات التوافقية (combinatorial gadgets) في اختزالات اكتمال NP، أو تحليل الخوارزميات الاحتمالية، أو الجدال حول الخصم لإثبات أمن البنى التعموية (cryptographic primitives).

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

  • حين أطرح مبرهنة، فتوقّف وحاول إثباتها بنفسك قبل قراءة البرهان. ستُدهش من مدى تحسّن فهمك للبرهان حتى بعد خمس دقائق فقط من المحاولة بنفسك.

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

  • لاحظ بنشاط ما الأسئلة التي تنشأ في ذهنك وأنت تقرأ النص، وما إذا كانت مشروحة في النص أم لا.

وكقاعدة عامة، من الأهم أن تفهم التعريفات أكثر من فهم المبرهنات، ومن الأهم أن تفهم صياغة المبرهنة أكثر من فهم برهانها. فبعد كل شيء، قبل أن تستطيع إثبات مبرهنة، عليك أن تفهم ما تقوله، ولفهم ممّ تتحدث المبرهنة، عليك أن تعرف تعريفات الكائنات الداخلة فيها. وكلما كان برهان مبرهنة معقّدًا نوعًا ما، أقدّم «فكرة البرهان» (proof idea). ولا تتردد في تخطّي البرهان الفعلي في القراءة الأولى، وأن تركّز على فكرة البرهان فقط.

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

هل يستحقّ هذا الجهد؟

هذا ليس كتابًا سهلًا، وقد يتساءل أيّ منك بكل عناء عن لماذا ينبغي أن تبذل جهدًا في تعلّم هذه المادة. أما التبرير التقليدي لمقرر «نظرية الحوسبة» (Theory of Computation) فهو أنك قد تصادف هذه المفاهيم لاحقًا في مسارك المهني. ربما واجهت مسألة صعبة وتبيّن أنها مكتملة NP (NP complete)، أو احتجت أن تستعمل ما تعلّمته عن التعبيرات النمطية (regular expressions). قد يكون هذا صحيحًا إلى حدٍّ كبير، لكن الفائدة الرئيسة من هذا الكتاب ليست في تعليمك أداة عملية أو تقنية، بل في أن يمنحك طريقة تفكير مختلفة: قدرة على التعرّف على ظواهر حوسبة حتى حين تظهر في سياقات غير بديهية، وطريقة لنمذجة المهام والمسائل الحاسوبية، والتفكير فيها.

ومهما كانت الفائدة التي ستستمدّها من هذا الكتاب، فإنني أعتقد أن تعلّم هذه المادة مهم لأنها تضم مفاهيم جميلة وجوهريية في آن واحد. فالدور الذي أداه الطاقة (energy) و_المادة_ (matter) في القرن العشرين يؤديه في القرن الحادي والعشرين الحوسبة (computation) و_المعلومات_ (information)، لا أداتين لتقنياتنا واقتصادنا فحسب، بل لبنات البناء الأساسية التي نفهم بها العالم. وستعطيك هذا الكتاب لمحة عن بعض النظرية الكامنة وراء ذلك، وآمل أن يشعل فيك الفضول لدراسة المزيد.

إلى المحاضرين المحتملين

كتبت هذا الكتاب من أجل مساقي في هارفارد، لكنني آمل أن يجده محاضرون آخرون مفيدًا أيضًا. وهو مشابه إلى حدٍّ ما، في محتواه، لمقررات «نظرية الحوسبة» (Theory of Computation) أو «الأفكار العظيمة» (Great Ideas) مثل التي تُدرَّس في CMU أو MIT.

أبرز فرق بين منهجنا والمناهج الأكثر تقليدية (كتلك لدَوَرَي هوبكروفت وأولمان في [@HopcroftUllman69, @HopcroftUllman79] ولسيبسر في [@SipserBook]) هو أننا لا نبدأ بـ_الأوتوماتا المحدودة_ (finite automata) كنموذج حوسبة ابتدائي. بدلاً من ذلك، نموذجنا الحوسب الأولي هو الدوائر المنطقية (Boolean Circuits).[1] ونحن نعتقد أن الدوائر المنطقية أكثر أساسية لنظرية الحوسبة (وحتى ممارستها!) من الأوتوماتا. وبشكل خاص، فإن الدوائر المنطقية شرط مسبق لكثير من المفاهيم التي نرغب في تدريسها ضمن مقرر حديث في علم الحاسوب النظري، بما فيها علم التعمية، والحوسبة الكمّية، وإزالة العشوائية، والمحاولات لإثبات P≠NP\mathbf{P} \neq \mathbf{NP}، وغيرها. وحتى في الحالات التي لا تكون فيها الدوائر المنطقية مطلوبة على نحو صارم، فإنها غالبًا ما تقدّم تبسيطات جوهرية (كما في حالة برهان مبرهنة كوك-ليفن).

وفضلا على ذلك، أعتقد أن هناك أسبابًا تربوية تجعل البدء بالدوائر المنطقية أفضل من البدء بالأوتوماتا المحدودة. فالدوائر المنطقية نموذج حوسبة أكثر طبيعية، وهي تقابل الحساب في السيليكون على نحو أقرب، مما يجعل الصلة بالتطبيق العملي أقرب إلى الأذهان لدى الطلاب. والدوال المتناهية يمكن القول إنها أسهل في الإدراك من اللانهائية، إذ يمكننا كتابة جدول حقيقتها (truth table) كاملًا. والمبرهنة القائلة بأن كل دالة متناهية يمكن حسابها بدائرة منطقية هي في آن واحد بسيطة بما يكفي ومهمّة بما يكفي لتكون نقطة انطلاق ممتازة لهذا المقرر. وعلاوة على ذلك، فإن كثيرًا من النقاط المفاهيمية الرئيسة في نظرية الحوسبة، بما في ذلك فكرة الثنائية بين الشيفرة (code) و_البيانات_ (data)، وفكرة العمومية (universality)، يمكن رؤيتها أصلًا في هذا السياق.

وبعد الدوائر المنطقية، ننتقل إلى آلات تورينج (Turing machines) ونُثبت نتائج مثل وجود آلة تورينج عالمية، وعدم قابلية مسألة التوقف للحساب (uncomputability of the halting problem)، ومبرهنة رايس (Rice's Theorem). أمّا الأوتوماتا فنناقشها بعد أن نرى آلات تورينج والاستحالة، بوصفها مثالًا على نموذج حوسبة مقيّد (restricted computational model) تُحلّ فيه مسائل مثل تحديد التوقف بشكل فعّال.

ولرغم أن هذا ليس دافعنا، فإن ترتيبنا الذي نعرض به الدوائر وآلات تورينج والأوتوماتا يقابل تقريبًا الترتيب الزمني لاكتشافها. فجبر البولياني (Boolean algebra) يعود إلى أعمال بولي ودي مورغان في الأربعينيات من القرن التاسع عشر [@Boole1847mathematical, @DeMorgan1847] (مع أن تعريف الدوائر المنطقية وربطها بالحوسبة الفيزيائية لم يُقدَّم إلا بعد 90 عامًا على يد شانون [@Shannon1938])، بينما عرّف آلان تورينج ما نسمّيه الآن «آلات تورينج» في الثلاثينيات [@Turing37]، وأُدخلت الأوتوماتا المحدودة في عمل مكولوتش وبيتس عام 1943 [@McCullochPitts43]، لكن لم تُفهم فعليًا إلا في العمل المؤسِّس لرابين وسكوت عام 1959 [@RabinScott59].

والأهم من ذلك، أن نماذج مثل آلات الحالات المحدودة (finite-state machines)، والتعبيرات النمطية (regular expressions)، وقواعد السياق الحر (context-free grammars) بالغة الأهمية في التطبيق العملي، لكن التطبيقات الرئيسة لهذه النماذج (سواء كانت لتحليل الصياغة (parsing)، أو لتحليل خصائص مثل الحيوية (liveness) و_السلامة_ (safety)، أو حتى لـجداول توجيه معرَّفة برمجيًا) تعتمد اعتمادًا حاسمًا على كون هذه نماذج قابلة للحلّ عمليًا (tractable) يمكننا الإجابة عن أسئلتها الدلالية (semantic questions) بفاعلية. ويمكن تقدير هذا الدافع العملي على نحو أفضل بعد أن يرى الطلاب عدم قابلية قرار الخصائص الدلالية لنماذج الحوسبة العامة.

وبدءنا بالدوائر يصبح إثبات مبرهنة كوك-ليفن (Cook-Levin Theorem) أسهل بكثير. فبرهاننا لهذه المبرهنة يمكن أن يتم (وهو يتم فعلًا) باستخدام حفنة من أسطر Python. ودمج هذا البرهان مع الاختزالات المعيارية (والتي تُنفَّذ هي الأخرى في Python) يتيح للطلاب أن يروا بصريًا كيف يمكن تحويل مسألة تتعلق بالحوسبة إلى مسألة تتعلق، مثلًا، بوجود مجموعة مستقلة (independent set) في رسم بياني (graph).

وهنا بعض الاختلافات الأخرى بين هذا الكتاب والنصوص السابقة هي التالية:

  1. لقياس تعقيد الزمن (time complexity)، نستخدم نموذج آلة الذاكرة العشوائية (RAM machine model) القياسي المستخدَم ضمنًا في مقررات الخوارزميات، بدلًا من آلات تورينج. وفي حين أن هذين النموذجين متكافئان قطعًا بدرجة متعددة الحدود (polynomially equivalent)، وبالتالي لا يُحدثان فرقًا في تعريفات الأصناف P\mathbf{P} وNP\mathbf{NP} وEXP\mathbf{EXP}، فإن اختيارنا يجعل التمييز بين مفاهيم من قبيل O(n)O(n) أو O(n2)O(n^2) زمنًا أكثر دلالة. ويؤمّن هذا الاختيار أيضًا أن أصناف التعقيد الزمني الأدقّ هذه تطابق التعريفات غير الرسمية للزمن الخطي والتربيعي التي يلتقيها الطلاب في محاضرات الخوارزميات (أو في مقابلات البرمجة على السبورة...).

  2. نستخدم مصطلح الدوال (functions) بدلًا من مصطلح اللغات (languages). أي، بدلًا من القول إن آلة تورينج MM تقرّر لغة L⊆{0,1}∗L \subseteq \{0,1\}^*، نقول إنها تحسب دالة F:{0,1}∗→{0,1}F:\{0,1\}^* \rightarrow \{0,1\}. ومصطلح «اللغات» نبع من أعمال تشومسكي [@Chomsky56]، لكنه كثيرًا ما يكون مربكًا أكثر مما هو مضيء. كما يجعل مصطلح «اللغات» من العسير مناقشة مفاهيم مثل الخوارزميات التي تحسب دوالّ بمخرج من أكثر من بت (بما في ذلك المهام الأساسية ك الجمع والضرب إلخ...). وحقيقة أننا نستخدم الدوال بدل اللغات تعني علينا أن نكون أكثر يقظةً في تمييز الطلاب بين المواصفة (specification) لمهمة حسابية (مثل الدالة) وبين تنفيذها (implementation) (مثل البرنامج). ومن جهة أخرى، فإن هذه النقطة بالغة الأهمية بحيث تستحق التكرار والتأكيد على الطلاب مرارًا، أيًّا كان التدوين المستخدم. ويذكر الكتاب مصطلح اللغات ويذكّر به من حين لآخر، ليسهل على الطلاب الرجوع إلى مصادر خارجية.

ويتيح تقليص الوقت المخصّص للأوتوماتا المحدودة واللغات الخالية من السياق للمحاضرين قضاء وقت أطول على الموضوعات التي يحتاج مقرر حديث في نظرية الحوسبة إلى لمّسها. وتشمل هذه العشوائية والحوسبة، والتفاعلات بين البراهين و_البرامج_ (بما في ذلك مبرهنة عدم اكتمال غودل، وأنظمة البرهان التفاعلية (interactive proof systems)، وحتى لمحة عن حساب لامدا (λ\lambda-calculus) والمقابلة بين Curry-Howard (correspondence)، وعلم التعمية (cryptography)، والحوسبة الكمّية (quantum computing).

يحتوي هذا الكتاب على قدر كافٍ من التفصيل ليتيح استخدامه للدراسة الذاتية. ولتحقيق هذا الغرض، تبدأ كل شعبة بقائمة أهداف تعليمية، وتنتهي بملخص، وتُنثر بـ«صندوقات توقّف» (pause boxes) التي تشجّع الطلاب على التوقف وحساب برهان أو التأكد من فهمهم لتعريف قبل أن يتابعوا.

أن خارطة طريق لبقية هذا الكتاب يتضمن «خارطة طريق» (roadmap) لهذا الكتاب، مع وصفات للفروع المختلفة، وكذلك بنية الاعتماديات بينها. وهذا قد يساعد في تخطيط مقرر قائم على هذا الكتاب.

شكر وتقدير

هذا النص في تطور مستمر، وأنا أتلقى ملاحظات من كثيرين، وأنا ممتنّ لهم بعمق. وتعاون معي ساليلفادان (Salil Vadhan) في دورة هذه المقرر الأولى، وقدّم لي قدرًا هائلًا من الملاحظات والرؤى المفيدة خلال هذه العملية. وقام ميكيلي أموريتي (Michele Amoretti) وماريكا سوانبرغ (Marika Swanberg) بقراءة عدة فصول من هذا النص قراءة متأنية وقدّما تعليقات مفيدة للغاية ومفصّلة. وأسهم ديف إيفانز (Dave Evans) وريتشارد شو (Richard Xu) بطلبات سحب (pull requests) كثيرة تصحّح الأخطاء وتحسّن الصياغة. ونشكر أنيل آدا (Anil Ada) وفينكات غوروسوامي (Venkat Guruswami) وريان أودونل (Ryan O'Donnell) على النصائح المفيدة التي قدّموها من خبرتهم في تدريس CMU 15-251. ونشكر آدم هيسربيرغ (Adam Hesterberg) ومادو سودان (Madhu Sudan) على تعليقاتهما عن تجربتهما في تدريس CS 121 مع هذا الكتاب. وقدّم كونال مرواه (Kunal Marwaha) ملاحظات كثيرة، كما ساعد كثيرًا في الجوانب التقنية لإخراج الكتاب.

ونشكر كل من أرسل إليّ ملاحظات، أو بلّغ عن أخطاء مطبعية، أو فتح قضايا أو أرسل طلبات سحب في مستودع GitHub https://github.com/boazbk/tcs. وأخصّ بالشكر التغذية الراجعة المفيدة من Scott Aaronson وMichele Amoretti وAadi Bajpai وMarguerite Basta وAnindya Basu وSam Benkelman وJarosław Błasiok وEmily Chan وChristy Cheng وMichelle Chiang وDaniel Chiu وChi-Ning Chou وMichael Colavita وBrenna Courtney وRodrigo Daboin Sanchez وRobert Darley Waddilove وAnlan Du وJuan Esteller وDavid Evans وMichael Fine وSimon Fischer وLeor Fishman وZaymon Foulds-Cook وWilliam Fu وKent Furuie وPiotr Galuszka وCarolyn Ge وJason Giroux وMark Goldstein وAlexander Golovnev وSayan Goswami وMaxwell Grozovsky وMichael Haak وRebecca Hao وLucia Hoerr وJoosep Hook وAustin Houck وThomas Huet وEmily Jia وSerdar Kaçka وChan Kang وNina Katz-Christy وVidak Kazic وJoe Kerrigan وEddie Kohler وEstefania Lahera وAllison Lee وBenjamin Lee وOndřej Lengál وRaymond Lin وEmma Ling وAlex Lombardi وLisa Lu وKai Ma وAditya Mahadevan وKunal Marwaha وChristian May وJosh Mehr وJacob Meyerson وLeon Mlodzian وGeorge Moe وTodd Morrill وGlenn Moss وHaley Mulligan وHamish Nicholson وOwen Niles وSandip Nirmel وSebastian Oberhoff وThomas Orton وJoshua Pan وPablo Parrilo وJuan Perdomo وBanks Pickett وAaron Sachs وAbdelrhman Saleh وBrian Sapozhnikov وAnthony Scemama وPeter Schäfer وJosh Seides وAlaisha Sharma وNathan Sheely وHaneul Shin وNoah Singer وMatthew Smedberg وMiguel Solano وHikari Sorensen وDavid Steurer وAlec Sun وAmol Surati وEverett Sussman وMarika Swanberg وGarrett Tanzer وEric Thomas وSarah Turnill وSalil Vadhan وPatrick Watts وJonah Weissman وRyan Williams وLicheng Xu وRichard Xu وWanqian Yang وElizabeth Yeoh-Wang وJosh Zelinsky وFred Zhang وGrace Zhang وAlex Zhao وJessica Zhu.

أنا أستخدم حزم برمجية مفتوحة المصدر كثيرة في إنتاج هذه الملاحظات، وأنا ممتنّ لها. وبخاصة، أنا شاكر لدونالد نوث (Donald Knuth) وليزلي لامبورت (Leslie Lamport) على LaTeX، ولجون ماكفارلان (John MacFarlane) على Pandoc. وكتب ديفيد ستورر (David Steurer) السكربتات الأصلية لإنتاج هذا النص. وتستخدم النسخة الحالية panflute لسيرجيو كورييا (Sergio Correia). وقوالب نسختي LaTeX وHTML مشتقة من Tufte LaTeX وGitbook وBookdown. ونشكر إيمي هندرسون (Amy Hendrickson) على استشارتها في LaTeX. وطوّر خوان إستيلر (Juan Esteller) وغيب مونتاغ (Gabe Montague) في البداية لغتَي البرمجة NAND* بلغة OCaml وJavascript. واستخدمت مشروع Jupyter لكتابة مقتطفات الشيفرة التكميلية.

وأخيرًا، أودّ أن أشكر عائلتي: زوجتي Ravit، وابني Alma وGoren. فقد استغرق العمل على هذا الكتاب (والمقرر المقابل) من وقتي ما استغرق، حتى كتبت Alma مقالًا لفصلها في الصف الخامس تقول فيه «ينبغي ألا تضغط الجامعات على الأساتذة للعمل أكثر مما ينبغي». ولستُ بخوف من أن كل ما يمكنني عرضه على هذا الجهد هو 600 صفحة من النص الرياضي شديد الرتابة.


  1. كتاب سابق يبدأ بالدوائر كنموذج ابتدائي هو كتاب جون سافيج [@Savage1998models]. ↩︎