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

الخلفية الرياضية

الخلفية الرياضية

  • استعادة المفاهيم الرياضية الأساسية مثل المجموعات والدوال والأعداد والمشغّلات المنطقية والكمّاسات والسلاسل النصية والرسوم البيانية.
  • تعريف ترميز OO الكبير (Big-OO) تعريفًا دقيقًّا.
  • البراهين بالحَث.
  • التدرّب على قراءة تعريفاتِ و_عباراتِ_ و_براهينَ_ رياضية.
  • تحويل حجّة حدسية إلى برهان دقيق.

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

في هذا الفصل نراجع بعض المفاهيم الرياضية التي نستخدمها في هذا الكتاب. وتُغطَّى هذه المفاهيم عادةً في مساقات أو كتب دراسية في «الرياضيات لعلوم الحاسوب» أو «الرياضيات المتقطّعة»؛ راجع قسم «الملاحظات المرجعية» (ملاحظات مرجعية) لتجدّ عدة مصادر ممتازة في هذه المواضيع متاحة مجّانًا على الإنترنت.

اعتذار الرياضياتي. قد يتساءل بعض الطلاب لماذا يحتوي هذا الكتاب على هذا القدر الكبير من الرياضيات. والسبب هو أنّ الرياضيات هي ببساطة لغة لنمذجة المفاهيم بنية دقيقة وبلا التباس. في هذا الكتاب نستخدم الرياضيات لنمذجة مفهوم الحوسبة. على سبيل المثال، سندرس أسئلة مثل «هل هناك خوارزمية كفؤة لإيجاد العوامل الأولية لعدد صحيح معطى؟». (وسنرى أنّ هذا السؤال ممتع على نحو خاص، إذ يلمس مجالات متباعدة بينها كلٌّ كبير، مثل أمن الإنترنت وميكانيكا الكمّ!) فحتى مجرد صياغة مثل هذا السؤال، نحتاج إلى إعطاء تعريف دقيق لمفهوم الخوارزمية، ولمعنى أن تكون خوارزمية ما كفؤة. وكذلك، بما أنه لا توجد تجربة تجريبية لإثبات عدم وجود خوارزمية، فالطريقة الوحيدة لتثبيت مثل هذه النتيجة هي استخدام برهان رياضي.

دليل القارئ في هذا الفصل

حسب خلفيتك، يمكنك أن تتناول هذا الفصل بطريقتين مختلفتين:

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

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

  • قد ترغب أيضًا في البدء بتنشيط معرفتك بـ_الاحتمالات المتقطّعة_، التي سنستخدمها لاحقًا في هذا الكتاب (راجع نظرية الاحتمالات 101).

لمحة سريعة عن المتطلّبات الرياضية

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

  • البراهين: في المقام الأول والأخير، يتضمّن هذا الكتاب جرعةً ثقيلة من التفكير الرياضي الشكلي، ويشمل ذلك تعريفاتَ و_عباراتَ_ و_براهينَ_ رياضية.

  • المجموعات وعملياتها: سنستخدم على نطاق واسع المجموعات الرياضية. نستخدم علاقتَي الانتماء (∈\in) والاحتواء (⊆\subseteq) الأساسيتين، وعمليات المجموعات، وأهمّها الاتحاد (∪\cup) والتقاطع (∩\cap) وفرق المجموعتين (∖\setminus).

  • جداء ديكارتي وعملية نجمة كلييني: نستخدم أيضًا جداء ديكارتي لمجموعتَين AA وBB، ويُرمز إليه بـ A×BA \times B (أي أنّ A×BA \times B هي مجموعة الأزواج (a,b)(a,b) حيث a∈Aa\in A وb∈Bb\in B). ونرمز إلى جداء ديكارتي AA مع نفسها nn مرّات بـ AnA^n (مثلًا A3=A×A×AA^3 = A \times A \times A)، وإلى A∗A^* (المعروفة بـ_نجمة كلييني_) الاتحادَ لـ AnA^n لكلّ n∈{0,1,2,…}n \in \{0,1,2,\ldots\}.

  • الدوال: المجال (domain) و_المدى_ (codomain) الدالة، وخصائص من كون الدالة حقنة (one-to-one، وتُعرف أيضًا بـ_الحقن_) أو مغطّية (onto، وتُعرف أيضًا بـ_التغطية_)، وكذلك الدوال الجزئية (partial functions) (التي، بخلاف الدوال القياسية أو «الكليّة»، ليست معرَّفة بالضرورة على كلّ عناصر مجالها).

  • العمليات المنطقية: عمليتا AND (و) وOR (أو)، اللتان يُرمز لهما بـ ∧\wedge و∨\vee، وNOT (لا) ويُرمز لها بـ ¬\neg، إضافةً إلى الكمّاسين «يوجد» و«لكلّ» اللذين يُرمز لهما بـ ∃\exists و∀\forall.

  • العدّاديات الأساسية (combinatorics): مفاهيم مثل (nk)\binom{n}{k} (عدد المجموعات الجزئية ذات الحجم kk من مجموعة ذات حجم nn).

  • الرسوم البيانية: رسوم بيانية غير موجّهة وموجّهة، والارتباط، والمسارات، والدورات.

  • ترميز OO الكبير: الترميز O,o,Ω,ω,ΘO,o,\Omega,\omega,\Theta لتحليل النموّ المقارب للدوال.

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

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

قراءة النصوص الرياضية

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

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

مقتطف من قسم «الطرق» (methods) في ورقة «AlphaGo Zero» لسيلفر وآخرين، Nature، 2017.

مقتطف من ورقة «Zerocash» لبين-ساسون وآخرين، التي تُشكّل أساس شركة Zcash الناشئة في العملات الرقمية.

المكوّنات الأساسية لأي نص رياضي هي التعريفات و__الادّعاءات__ و__البراهين__.

التعريفات

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

تعريف — دالة حقنة

لتكن S,TS,T مجموعتَين. نقول إنّ الدالة f:S→Tf:S \rightarrow T حقنة (one to one، وتُعرف أيضًا بـ_الحقن_) إذا كان لكلّ عنصرين x,x′∈Sx,x' \in S، متى كان x≠x′x \neq x'، فإنّ f(x)≠f(x′)f(x) \neq f(x').

يلتقط تعريف — دالة حقنة مفهومًا بسيطًا، ومع ذلك فهو يستخدم قدرًا لا بأس به من الترميز. وعند قراءة تعريف كهذا، من المفيد عادةً أن تعلّمه بقلم أثناء مرورك به (راجع الشكل التوضيحي). على سبيل المثال، حين ترى مُعرِّفًا مثل ff أو SS أو xx، فتأكّد من إدراكك لنوع الشيء الذي هو: هل هو مجموعة، أم دالة، أم عنصر، أم عدد، أم جنّ شيطان؟ قد تجد أيضًا مفيدًا أن تشرح التعريف بالكلمات لصديق (أو لنفسك).

شكلٌ مُعلَّق من onetoonedef، يُبيّن أيّ جزء يُعرَّف وكيف.

الادّعاءات: المبرهنات والمُلمّات والمزاعم

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

البراهين

البراهين (proofs) الرياضية هي الحجج التي نستعملها لنُظهر أنّ مبرهناتنا ومُلمّاتنا ومزاعمنا صحيحة فعلًا. نتناول البراهين في البراهين أدناه، لكنّ النقطة الجوهرية هي أنّ معيار البرهان الرياضي مرتفع جدًّا. وبخلاف بعض المجالات الأخرى، فإنّ البرهان في الرياضيات حجّة «لا ثغرة فيها» (airtight) تُظهر أنّ العبارة صحيحة دون أيّ ذرّة من الشكّ. ومن أمثلة البراهين الرياضية في هذا القسم ما ورد في تمرين محلول — للرؤوس المتّصلة مسارات بسيطة ومثال موسّع: الفرز الطوبولوجي. وكما ذُكر في المقدمة، فالقاعدة العامّة أنّ من المهمّ أن تفهم التعريفات أكثر من فهمك المبرهنات، وأنّ من المهمّ أن تفهم عبارة المبرهنة أكثر من فهمك برهانها.

الكائنات الرياضية المتقطّعة الأساسية

في هذا القسم نراجع سريعًا بعض الكائنات الرياضية (بمعنى «بنى البيانات الأساسية» في الرياضيات، إن صحّ التعبير) التي نستخدمها في هذا الكتاب.

المجموعات

‏_المجموعة_ (set) مجموعةٌ غير مرتّبة من الأشياء. مثلًا، حين نكتب S={2,4,7}S = \{ 2,4, 7 \}، فإنّنا نعني أنّ SS تشير إلى المجموعة التي تحتوي الأعداد 22 و44 و77. (ونستعمل التدوين «2∈S2 \in S» للدلالة على أنّ 22 عنصر في SS.) لاحظ أنّ المجموعة {2,4,7}\{ 2, 4, 7 \} و{7,4,2}\{ 7, 4, 2 \} متطابقتان، لأنّهما تحتويان العناصر نفسها. وكذلك، إمّا أن تحتوي المجموعة عنصرًا وإمّا ألّا تحتويه — إذ لا يوجد مفهوم لاحتوائها عليه «مرّتين» — ولذلك يمكننا حتى كتابة المجموعة SS نفسها على هيئة {2,2,4,7}\{ 2, 2, 4, 7\} (مع أنّ ذلك سيكون غريبًا بعض الشيء). ‏_عدد المجموعة_ (cardinality) المنتهية SS، ويُرمز له بـ ∣S∣|S|، هو عدد عناصرها. (ويمكن تعريف العدد أيضًا للمجموعات لا نهائية؛ انظر المصادر في ملاحظات مرجعية.) ففي المثال أعلاه، ∣S∣=3|S|=3. المجموعة SS هي مجموعة جزئية (subset) من مجموعة TT، ويُرمز لذلك بـ S⊆TS \subseteq T، إذا كان كلّ عنصر في SS هو أيضًا عنصر في TT. (ويمكن أيضًا وصف ذلك بالقول إنّ TT هي مجموعة شاملة (superset) لـ SS.) مثلًا، {2,7}⊆{2,4,7}\{2,7\} \subseteq \{ 2,4,7\}. المجموعة التي لا تحتوي أيّ عناصر تُعرف بـ_المجموعة الفارغة_ (empty set) ويُرمز لها بـ ∅\emptyset. إذا كانت AA مجموعة جزئية من BB غير مساوية لها، نقول إنّ AA مجموعة جزئية صارمة (strict subset) من BB، ونرمز لذلك بـ A⊊BA \subsetneq B.

يمكننا تعريف المجموعات إمّا بإدراج كلّ عناصرها، وإمّا بكتابة قاعدة تَحَقّقها مثل

EVEN={x  ∣   x=2y for some non-negative integer y}  . \text{EVEN} = \{ x \;|\; \text{ $x=2y$ for some non-negative integer $y$} \} \;.

بالطبع هناك أكثر من طريقة لكتابة المجموعة نفسها، وغالبًا ما سنستعمل تدوينًا حدسيًا يدرج بضعة أمثلة توضّح القاعدة. مثلًا، يمكننا أيضًا تعريف EVEN\text{EVEN} على أنه

EVEN={0,2,4,…}  . \text{EVEN} = \{ 0,2,4, \ldots \} \;.

لاحظ أنّ المجموعة إمّا منتهية (مثل المجموعة {2,4,7}\{2,4,7\}) وإمّا لا نهائية (مثل المجموعة EVEN\text{EVEN}). وليس بالضروري أن تكون عناصر المجموعة أعدادًا. فيمكننا الحديث عن مجموعات مثل المجموعة {a,e,i,o,u}\{a,e,i,o,u \} لكلّ حروف المدّ في اللغة الإنجليزية، أو المجموعة {\{New York, Los Angeles, Chicago, Houston, Philadelphia, Phoenix, San Antonio, San Diego, Dallas}\} لكلّ المدن في الولايات المتحدة التي يتجاوز عدد سكّانها المليون، وفق تعداد سنة 2010. ويمكن حتى أن تكون عناصر المجموعة مجموعات أخرى، مثل المجموعة {∅,{1,2},{2,3},{1,3}}\{ \emptyset, \{1,2\},\{2,3\},\{1,3\} \} لكلّ المجموعات الجزئية ذات الحجم الزوجي من {1,2,3}\{1,2,3\}.

عمليات المجموعات: الاتحاد (union) لمجموعتَين S,TS,T، ويُرمز له بـ S∪TS \cup T، هو المجموعة التي تحتوي كلّ العناصر الموجودة في SS أو في TT. أما التقاطع (intersection) لـ SS وTT، ويُرمز له بـ S∩TS \cap T، فهو مجموعة العناصر الموجودة في SS و في TT معًا. أما فرقّ المجموعتين (set difference) SS وTT، ويُرمز له بـ S∖TS \setminus T (وفي بعض النصوص أيضًا بـ S−TS-T)، فهو مجموعة العناصر الموجودة في SS لكن ليست في TT.

المعطوفات والقوائم والسلاسل النصية والمتتاليات: المعطوف (tuple) هو مجموعة مرتّبة من العناصر. مثلًا (1,5,2,1)(1,5,2,1) معطوف من أربعة عناصر (ويُعرف أيضًا بـ44‑معطوف أو رباعي). ولأنّ الترتيب مهمّ، فهذا ليس المعطوف نفسه الذي هو 44‑معطوف (1,1,5,2)(1,1,5,2) أو 33‑معطوف (1,5,2)(1,5,2). ويُعرف 22‑معطوف أيضًا بـ_ثنائي_ (pair). ونحن نستعمل لفظتَي المعطوفات و_القوائم_ بالتبادل. والمعطوف الذي يأتي كلّ عنصره من مجموعة منتهية Σ\Sigma (مثل {0,1}\{0,1\}) يُعرف أيضًا بـ_سلسلة نصية_ (string). على نحو مماثل للمجموعات، فإنّنا نرمز إلى الطول (length) المعطوف TT بـ ∣T∣|T|. وكما في المجموعات تمامًا، يمكننا أيضًا التفكير في نظائر لا نهائية للمعطوفات، مثل المجموعة المرتّبة (1,4,9,…)(1,4,9,\ldots ) لكلّ المربّعات التامّة. وتُعرف المجموعات المرتّبة اللانهائية بـ_متتاليات_ (sequences)؛ وقد نستعمل أحيانًا لفظ «متتالية لا نهائية» للتأكيد على ذلك، ونستعمل «متتالية منتهية» مرادفًا للمعطوف. (ويمكننا التمييز بين متتالية (a0,a1,a2,…)(a_0,a_1,a_2,\ldots) من عناصر مجموعة ما SS وبين دالة A:N→SA:\N \rightarrow S (حيث an=A(n)a_n = A(n) لكلّ n∈Nn\in \N). وعلى نحو مماثل، يمكننا التمييز بين kk‑معطوف (a0,…,ak−1)(a_0,\ldots,a_{k-1}) من عناصر SS وبين دالة A:[k]→SA:[k] \rightarrow S.)

جداء ديكارتي: إذا كانت SS وTT مجموعتَين، فإنّ جداءَهما الديكارتي (Cartesian product)، ويُرمز له بـ S×TS \times T، هو مجموعة كلّ الأزواج المرتّبة (s,t)(s,t) حيث s∈Ss\in S وt∈Tt\in T. مثلًا، إذا كانت S={1,2,3}S = \{1,2,3 \} وT={10,12}T = \{10,12 \}، فإنّ S×TS\times T يحتوي العناصر الستّة (1,10),(2,10),(3,10),(1,12),(2,12),(3,12)(1,10),(2,10),(3,10),(1,12),(2,12),(3,12). وعلى نحو مماثل، إذا كانت S,T,US,T,U مجموعات، فإنّ S×T×US\times T \times U هو مجموعة كلّ الثلاثيات المرتّبة (s,t,u)(s,t,u) حيث s∈Ss\in S وt∈Tt\in T وu∈Uu\in U. وأعمّ من ذلك، لكلّ عدد صحيح موجب nn ومجموعات S0,…,Sn−1S_0,\ldots,S_{n-1}، فإننا نرمز إلى S0×S1×⋯×Sn−1S_0 \times S_1 \times \cdots \times S_{n-1} بالمجموعة المتكوّنة من المعطوفات (s0,…,sn−1)(s_0,\ldots,s_{n-1}) ذات nn عنصرًا حيث si∈Sis_i\in S_i لكلّ i∈{0,…,n−1}i \in \{0,\ldots, n-1\}. ولكلّ مجموعة SS، نرمز إلى المجموعة S×SS\times S بـ S2S^2، وإلى S×S×SS\times S\times S بـ S3S^3، وإلى S×S×S×SS\times S\times S \times S بـ S4S^4، وهكذا.

المجموعات الخاصّة

هناك عدّة مجموعات سنستعملها في هذا الكتاب مرّة بعد أخرى. المجموعة

N={0,1,2,…} \N = \{ 0, 1,2, \ldots \}

تحتوي كلّ الأعداد الطبيعية (natural numbers)، أي الأعداد الصحيحة غير السالبة. ولكلّ عدد طبيعي n∈Nn\in\N، نعرّف المجموعة [n][n] بأنّها {0,…,n−1}={k∈N:k<n}\{0,\ldots, n-1\} = \{ k\in \N : k < n \}. (ونبدأ ترقيم N\N و[n][n] معًا من 00، بينما ترقّم نصوصٌ كثيرة أخرى هذه المجموعات من 11. والبدء من الصفر أو من الواحد ليس سوى اصطلاح لا يهمّ كثيرًا، ما دام المرء متّسقًا معه.)

وسنستعمل أيضًا أحيانًا المجموعة Z={…,−2,−1,0,+1,+2,…}\Z=\{\ldots,-2,-1,0,+1,+2,\ldots \} من الأعداد الصحيحة (integers) (السالبة وغير السالبة)،[1] وكذلك المجموعة R\R من الأعداد الحقيقية (real numbers). (وهي المجموعة التي لا تضمّ الأعداد الصحيحة فحسب، بل أيضًا الكسرية وغير الناطقة؛ مثلًا، تضمّ R\R أعدادًا مثل +0.5+0.5 و−π-\pi وغيرها.) ونرمز إلى المجموعة R+\R_+، وهي {x∈R:x>0}\{ x\in \R : x > 0 \} من الأعداد الحقيقية الموجبة (positive). وتُرمز هذه المجموعة أحيانًا أيضًا بـ (0,∞)(0,\infty).

السلاسل النصية: مجموعة أخرى سنستعملها مرّة بعد أخرى هي

{0,1}n={(x0,…,xn−1)  :  x0,…,xn−1∈{0,1}} \{0,1\}^n = \{ (x_0,\ldots,x_{n-1}) \;:\; x_0,\ldots,x_{n-1} \in \{0,1\} \}

وهي مجموعة كلّ السلاسل النصية الثنائية ذات الطول nn، بالنسبة إلى عدد طبيعي nn ما. أي أنّ {0,1}n\{0,1\}^n هي مجموعة كلّ المعطوفات المكوّنة من nn من الأصفار والواحدات. وهذا يتّسق مع ترميزنا أعلاه: {0,1}2\{0,1\}^2 هو جداء ديكارتي {0,1}×{0,1}\{0,1\} \times \{0,1\}، و{0,1}3\{0,1\}^3 هو الجداء {0,1}×{0,1}×{0,1}\{0,1\} \times \{0,1\} \times \{0,1\}، وهكذا.

سنكتب السلسلة النصية (x0,x1,…,xn−1)(x_0,x_1,\ldots,x_{n-1}) ببساطة على هيئة x0x1⋯xn−1x_0x_1\cdots x_{n-1}. مثلًا،

{0,1}3={000,001,010,011,100,101,110,111}  . \{0,1\}^3 = \{ 000 , 001, 010 , 011, 100, 101, 110, 111 \} \;.

ولكلّ سلسلة نصية x∈{0,1}nx\in \{0,1\}^n وi∈[n]i\in [n]، نكتب xix_i لعنصر xx ذي الترتيب ithi^{th}.

وسنحدّث أيضًا كثيرًا عن مجموعة السلاسل النصية الثنائية بكلّ أطوالها، وهي

{0,1}∗={(x0,…,xn−1)  :  n∈N  ,  ,x0,…,xn−1∈{0,1}}  . \{0,1\}^* = \{ (x_0,\ldots,x_{n-1}) \;:\; n\in\N \;,\;, x_0,\ldots,x_{n-1} \in \{0,1\} \} \;.

ويمكن كتابة هذه المجموعة بطريقة أخرى على هيئة {0,1}∗={0,1}0∪{0,1}1∪{0,1}2∪⋯ \{0,1\}^* = \{0,1\}^0 \cup \{0,1\}^1 \cup \{0,1\}^2 \cup \cdots أو، بإيجاز أكبر، على هيئة

{0,1}∗=∪n∈N{0,1}n  . \{0,1\}^* = \cup_{n\in\N} \{0,1\}^n \;.

تتضمّن المجموعة {0,1}∗\{0,1\}^* «السلسلة النصية ذات الطول 00» أو «السلسلة النصية الفارغة»، وسنرمز إليها بـ """". (وفي استعمالنا لهذا التدوين نتبع اصطلاح كثير من لغات البرمجة. وتستعمل بعض النصوص الأخرى ϵ\epsilon أو λ\lambda للدلالة على السلسلة النصية الفارغة.)

تعميم عملية النجمة: لكلّ مجموعة Σ\Sigma، نعرّف

Σ∗=∪n∈NΣn  .\Sigma^* = \cup_{n\in \N} \Sigma^n \;.

مثلًا، إذا كان Σ={a,b,c,d,…,z}\Sigma = \{a,b,c,d,\ldots,z \} فإنّ Σ∗\Sigma^* تشير إلى مجموعة كلّ السلاسل النصية المنتهية الطول فوق الأبجدية a‑z.

الدمج (concatenation): دمجُ سلسلتين نصيتين x∈Σnx\in \Sigma^n وy∈Σmy\in \Sigma^m هو السلسلة النصية xyxy ذات الطول (n+m)(n+m) التي نحصل عليها بكتابة yy بعد xx. أي أنّه، إذا كان x∈{0,1}nx \in \{0,1\}^n وy∈{0,1}my\in \{0,1\}^m، فإنّ xyxy تساوي السلسلة النصية z∈{0,1}n+mz\in \{0,1\}^{n+m} التي تتحقّق أنّه لكلّ i∈[n]i\in [n] لدينا zi=xiz_i=x_i، ولكلّ i∈{n,…,n+m−1}i\in \{n,\ldots,n+m-1\} لدينا zi=yi−nz_i = y_{i-n}.

الدوال

إذا كانت SS وTT مجموعتَين غير خاليتين، فإنّ دالةَ (function) FF تُسقِط SS على TT، ويُرمز لها بـ F:S→TF:S \rightarrow T، تربط كلّ عنصر x∈Sx\in S بعنصر F(x)∈TF(x)\in T. وتُعرف المجموعة SS بـ_مجال_ (domain) FF، وتُعرف المجموعة TT بـ_مدى_ (codomain) FF. أما صورةُ (image) الدالة FF فهي المجموعة {F(x)  ∣  x∈S}\{ F(x) \;|\; x\in S\}، وهي المجموعة الجزئية من مدى FF المكوّنة من كلّ عناصر الخرج التي تُسقَط من عنصر دخل ما. (تستعمل بعض النصوص لفظَ المدى للدلالة على صورة الدالة، بينما تستعمل نصوصٌ أخرى لفظَ المدى للدلالة على مدى الدالة. ولذلك سنتجنّب استعمال لفظ «المدى» تمامًا.) وكما في حالة المجموعات، يمكننا كتابة الدالة إمّا بإدراج جدول كلّ القيم التي تعطيها لعناصر SS، وإمّا باستعمال قاعدة. مثلًا، إذا كان S={0,1,2,3,4,5,6,7,8,9}S = \{0,1,2,3,4,5,6,7,8,9 \} وT={0,1}T = \{0,1 \}، فإنّ الجدول أدناه يعرّف دالة F:S→TF: S \rightarrow T. لاحظ أنّ هذه الدالة هي نفسها الدالة المعرَّفة بالقاعدة F(x)=(xmod  2)F(x)= (x \mod 2).[2]

المدخل المخرج
0 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1

الجدول: مثال على دالة.

إذا كانت F:S→TF:S \rightarrow T بحيث F(x)≠F(y)F(x)\neq F(y) لكلّ x≠yx \neq y، فإنّنا نقول إنّ FF حقنة (one-to-one) (تعريف — دالة حقنة، وتُعرف أيضًا باسم الدالة الحقنة (injective) أو مجرّدًا حقنًا (injection)). وإذا كانت FF بحيث إنّ لكلّ y∈Ty\in T يوجد x∈Sx\in S بحيث F(x)=yF(x)=y، فإنّنا نقول إنّ FF مغطّية (onto) (وتُعرف أيضًا باسم الدالة المغطّية (surjective) أو مجرّدًا تغطيةً (surjection)). والدالة التي هي حقنة ومغطّية معًا تُعرف باسم الدالة التقابلية (bijective) أو مجرّدًا تقابلًا (bijection). والتقابل من مجموعة SS إلى نفسها يُعرف أيضًا بـ_تبديلٍ_ (permutation) لـ SS. وإذا كان F:S→TF:S \rightarrow T تقابلًا، فإنّ لكلّ y∈Ty\in T يوجد x∈Sx\in S وحيد بحيث F(x)=yF(x)=y. ونرمز إلى هذه القيمة xx بـ F−1(y)F^{-1}(y). لاحظ أنّ F−1F^{-1} هو نفسه تقابل من TT إلى SS (هل ترى لماذا؟).

إعطاء تقابل بين مجموعتين طريقة جيّدة في كثير من الأحيان لإظهار أنّ لهما الحجم نفسه. والواقع أنّ التعريف الرياضي المعياري لفكرة «أنّ SS وTT لهما عدد العناصر نفسه» هو أنّ هناك تقابلًا f:S→Tf:S \rightarrow T. وعلاوة على ذلك، يُعرَّف عدد عناصر المجموعة SS بأنّه nn إذا كان هناك تقابل من SS إلى المجموعة {0,…,n−1}\{0,\ldots,n-1\}. وكما سنرى لاحقًا في هذا الكتاب، فإنّ هذا التعريف يعمّم ليعرّف عدد عناصر المجموعات لا اللانهائية.

الدوال الجزئية: سنهتمّ أحيانًا بـ_الدوال الجزئية_ (partial functions) من SS إلى TT. يُسمح للدالة الجزئية بأن تكون غير معرَّفة على مجموعة جزئية ما من SS. أي أنّه، إذا كانت FF دالة جزئية من SS إلى TT، فإنّ لكلّ s∈Ss\in S، إمّا يوجد عنصر F(s)F(s) في TT (كما في حالة الدوال القياسية)، وإمّا تكون F(s)F(s) غير معرَّفة. مثلًا، الدالة الجزئية F(x)=xF(x)= \sqrt{x} معرَّفة فقط على الأعداد الحقيقية غير السالبة. وحين نريد أن نميّز بين الدوال الجزئية والدوال القياسية (أي غير الجزئية)، فإنّنا نسمّي الأخيرة دوالًا كليّة (total). وحين نقول «دالة» دون أيّ قيود، فإنّنا نعني دالةً كليّة.

مفهوم الدوال الجزئية هو تعميم صارم للدوال، ولذلك فإنّ كلّ دالة هي دالة جزئية، لكن ليس كلّ دالة جزئية هي دالة. (أي أنّه، لكلّ SS وTT غير خاليتين، تكون مجموعة الدوال الجزئية من SS إلى TT مجموعة شاملة صارمة لمجموعة الدوال الكليّة من SS إلى TT.) وحين نريد أن نؤكّد أنّ دالة ff من AA إلى BB قد لا تكون كليّة، فإنّنا سنكتب f:A→pBf: A \rightarrow_p B. كما يمكننا أن نفكّر في الدالة الجزئية FF من SS إلى TT على أنها دالة كليّة من SS إلى T∪{⊥}T \cup \{ \bot \} حيث ⊥\bot هو «رمز فشل» خاص. فبدلًا من القول إنّ FF غير معرَّفة عند xx، يمكننا القول إنّ F(x)=⊥F(x)=\bot.

حقائق أساسية عن الدوال: التحقّق من قدرتك على إثبات النتائج التالية طريقة ممتازة لتنشيط معلوماتك عن الدوال:

  • إذا كانت F:S→TF:S \rightarrow T وG:T→UG:T \rightarrow U دالتين حقنتين، فإنّ تركيبَهما (composition) H:S→UH:S \rightarrow U المعرَّف بـ H(s)=G(F(s))H(s)=G(F(s)) هو أيضًا حقنًا.

  • إذا كانت F:S→TF:S \rightarrow T حقنة، فإنّ هناك دالة مغطّية G:T→SG:T \rightarrow S بحيث G(F(s))=sG(F(s))=s لكلّ s∈Ss\in S.

  • إذا كانت G:T→SG:T \rightarrow S مغطّية، فإنّ هناك دالة حقنة F:S→TF:S \rightarrow T بحيث G(F(s))=sG(F(s))=s لكلّ s∈Ss\in S.

  • إذا كانت SS وTT مجموعتَين منتهيتين غير خاليتين، فإنّ الشروط التالية متكافئة فيما بينها: (a) ∣S∣≤∣T∣|S| \leq |T|، (b) هناك دالة حقنة F:S→TF:S \rightarrow T، و__(c)__ هناك دالة مغطّية G:T→SG:T \rightarrow S. وهذه التكافئات تتحقّق في الحقيقة حتى لو كانت SS وTT لا نهائيتين. وفي حالة المجموعات اللانهائية يكون الشرط (b) (أو بما يكافئه (c)) هو التعريفَ المقبول عادةً لعبارة ∣S∣≤∣T∣|S| \leq |T|.

/images/introtcs/lec_00_1_math_background-3.webp

توقّف وتأمّل

تجد براهين هذه النتائج في متون الرياضيات المتقطّعة، ومن بينها على سبيل المثال القسم 4.5 في ملاحظات Lehman-Leighton-Meyer. لكنّي أنصحك بشدّة بأن تحاول إثباتها بنفسك، أو على الأقلّ أن تقنع نفسك بأنّها صحيحة بإثبات حالات خاصة منها على أحجام صغيرة (مثلًا ∣S∣=3,∣T∣=4,∣U∣=5|S|=3,|T|=4,|U|=5).

لنُثبت إحدى هذه الحقائق كمثال:

لمّة

إذا كانت S,TS,T مجموعتَين غير خاليتين وF:S→TF:S \rightarrow T حقنة، فإنّ هناك دالة مغطّية G:T→SG:T \rightarrow S بحيث G(F(s))=sG(F(s))=s لكلّ s∈Ss\in S.

برهان

اختر s0∈Ss_0 \in S ما. سنعرّف الدالة G:T→SG:T \rightarrow S على النحو التالي: لكلّ t∈Tt\in T، إذا وُجد s∈Ss\in S بحيث F(s)=tF(s)=t، فنضع G(t)=sG(t)=s (واختيار ss معرَّف جيدًا (well-defined) لأنّ خاصية الحقن في FF تمنع وجود s,s′s,s' مختلفين يقودان كلاهما إلى tt). وفي غير ذلك، نضع G(t)=s0G(t)=s_0. الآن، لكلّ s∈Ss\in S، وبحسب تعريف GG، إذا كان t=F(s)t=F(s) فإنّ G(t)=G(F(s))=sG(t)=G(F(s))=s. وعلاوة على ذلك، فإنّ هذا يبيّن أيضًا أنّ GG هي مغطّية، لأنّ ذلك يعني أنّ لكلّ s∈Ss\in S يوجد tt ما، وهو بالضبط t=F(s)t=F(s)، بحيث G(t)=sG(t)=s.

الرسوم البيانية

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

للرسوم البيانية نوعان أساسيّان: غير موجّهة (undirected) و_موجّهة_ (directed).[3]

/images/introtcs/lec_00_1_math_background-4.webp{#graphsexampefig .margin offset="1.5in"}

تعريف — الرسوم البيانية غير الموجّهة

يتكوّن الرسم البياني غير الموجّه (undirected graph) G=(V,E)G = (V,E) من مجموعة VV من الرؤوس (vertices) ومجموعة EE من الأضلاع. كلّ ضلع هو مجموعة جزئية من VV من عنصرين. ونقول إنّ رأسين u,v∈Vu,v \in V متجاوران (neighbors) إذا كان الضلع {u,v}\{u,v\} في EE.

بالاعتماد على هذا التعريف، يمكننا تعريف خصائص أخرى عدّة للرسوم البيانية ورؤوسها. ونعرّف درجةَ (degree) uu بأنّها عدد الجيران الذين لـ uu. والمسار (path) في الرسم البياني هو معطوف (u0,…,uk)∈Vk+1(u_0,\ldots,u_k) \in V^{k+1}، لأجل k>0k>0 ما، بحيث يكون ui+1u_{i+1} جارًا لـ uiu_i لكلّ i∈[k]i\in [k]. والمسار البسيط (simple path) هو مسار (u0,…,uk−1)(u_0,\ldots,u_{k-1}) تكون فيه كلّ الـuiu_i متمايزة. والدورة (cycle) هي مسار (u0,…,uk)(u_0,\ldots,u_k) بحيث u0=uku_0=u_k. ونقول إنّ رأسين u,v∈Vu,v\in V متّصلان (connected) إذا كان u=vu=v أو كان هناك مسار (u0,…,uk)(u_0,\ldots,u_k) بحيث u0=uu_0=u وuk=vu_k=v. ونقول إنّ الرسم البياني GG متّصل (connected) إذا كان كلّ زوج من رؤوسه متّصلًا.

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

لمّة

في أيّ رسم بياني غير موجّه G=(V,E)G=(V,E)، فإنّ مجموع درجات كلّ الرؤوس يساوي ضِعف عدد الأضلاع.

يمكن بيان لمّة بالملاحظة أنّ كلّ ضلع {u,v}\{ u,v\} يساهم مرّتين في مجموع الدرجات (مرّة لـ uu ومرّة أخرى لـ vv).

لمّة

علاقة الاتصال متعدّية (transitive)، بمعنى أنّه إذا كان uu متّصلًا بـ vv، وكان vv متّصلًا بـ ww، فإنّ uu متّصل بـ ww.

يمكن بيان لمّة ببساطة بلصق مسار من الشكل (u,u1,u2,…,uk−1,v)(u,u_1,u_2,\ldots,u_{k-1},v) بمسار من الشكل (v,u1′,…,uk′−1′,w)(v,u'_1,\ldots,u'_{k'-1},w) للحصول على المسار (u,u1,…,uk−1,v,u1′,…,uk′−1′,w)(u,u_1,\ldots,u_{k-1},v,u'_1,\ldots,u'_{k'-1},w) الذي يربط uu بـ ww.

لمّة

لكلّ رسم بياني غير موجّه G=(V,E)G=(V,E) ولكلّ زوج متّصل u,vu,v، فإنّ أقصر مسار من uu إلى vv بسيط. وبخاصة، فلكلّ زوج متّصل يوجد مسار بسيط يربط بينهما.

يمكن بيان لمّة بأنّنا «نختصر» أيّ مسار غير بسيط من uu إلى vv يتكرّر فيه الرأس ww نفسه مرّتين، فنزيل هذا التكرار (راجع الشكل التوضيحي). ويُعدّ تحويل هذا الاستدلال الحدسي إلى برهان رسميّ تمرينًا جيّدًا:

/images/introtcs/lec_00_1_math_background-5.webp

تمرين محلول — للرؤوس المتّصلة مسارات بسيطة

أثبت لمّة

الحل

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

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا، وليكن uu وvv في VV رأسين متّصلين في GG. سنُثبت أنّ هناك مسارًا بسيطًا بين uu وvv. لتكن kk أقصر طول لمسار بين uu وvv، وليكن P=(u0,u1,u2,…,uk−1,uk)P=(u_0,u_1,u_2,\ldots,u_{k-1},u_k) مسارًا ذا طول kk من uu إلى vv (قد يكون هناك أكثر من مسار واحد كهذا: وإنّ كان كذلك فاختر واحدًا منها فقط). (أي إنّ u0=uu_0=u وuk=vu_k=v، و(uℓ,uℓ+1)∈E(u_\ell,u_{\ell+1})\in E لكلّ ℓ∈[k]\ell \in [k].) وندّعي أنّ PP بسيط. والحقّ، لنفترض خلاف ذلك، أي إنّ هناك رأسًا ww ما يتكرّر في المسار مرّتين: w=uiw = u_i وw=ujw=u_j لأجل i<ji<j ما. عندئذٍ يمكننا «اختصار» المسار PP والنظر إلى المسار P′=(u0,u1,…,ui−1,w,uj+1,…,uk)P' = (u_0,u_1,\ldots,u_{i-1},w,u_{j+1},\ldots,u_k)، الذي نحصل عليه بأخذ رؤوس PP الأولى ii (من u0=0u_0=0 إلى أول ظهور لـ ww) وآخر k−jk-j منها (من الرأس uj+1u_{j+1} الذي يلي ظهور ww الثاني إلى uk=vu_k=v). والمسار P′P' مسار صالح بين uu وvv، إذ إنّ كلّ زوج متتالٍ من الرؤوس فيه يربطه ضلع (وبخاصة، بما أنّ w=ui=ujw=u_i=u_j، فإنّ (ui−1,w)(u_{i-1},w) و(w,uj+1)(w,u_{j+1}) كلاهما ضلعان في EE)، لكنّ طول P′P' هو k−(j−i)<kk-(j-i)<k، فهذا يناقض أنّ PP كان الأقصر.

ملاحظة — إيجاد البراهين

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

تتقدّم مفاهيم الدرجة والارتباط طبيعيًّا إلى الرسوم البيانية الموجّهة، المعرَّفة على النحو التالي.

تعريف — الرسوم البيانية الموجّهة

يتكوّن الرسم البياني الموجّه G=(V,E)G=(V,E) من مجموعة VV ومجموعة E⊆V×VE \subseteq V\times V من أزواج مرتّبة (ordered pairs) عناصر VV. ونرمز أحيانًا إلى الضلع (u,v)(u,v) أيضًا على هيئة u→vu \rightarrow v. إذا كان الضلع u→vu \rightarrow v حاضرًا في الرسم البياني، فإنّنا نقول إنّ vv جيرًا صادرًا (out-neighbor) لـ uu، وإنّ uu جارًا واردًا (in-neighbor) لـ vv.

قد يحتوي الرسم البياني الموجّه على u→vu \rightarrow v وv→uv \rightarrow u معًا، وعندئذٍ سيكون uu جيرًا واردًا وجيرًا صادرًا لـ vv، والعكس أيضًا. و_درجةُ الدخول_ (in-degree) لـ uu هي عدد جيرانه الواردين، و_درجةُ الخروج_ (out-degree) لـ vv هي عدد جيرانه الصادرين. والمسار في الرسم البياني هو معطوف (u0,…,uk)∈Vk+1(u_0,\ldots,u_k) \in V^{k+1}، لأجل k>0k>0 ما، بحيث يكون ui+1u_{i+1} جيرًا صادرًا لـ uiu_i لكلّ i∈[k]i\in [k]. وكما في الحالة غير الموجّهة، المسار البسيط هو مسار (u0,…,uk−1)(u_0,\ldots,u_{k-1}) تكون فيه كلّ الـuiu_i متمايزة، والدورة هي مسار (u0,…,uk)(u_0,\ldots,u_k) بحيث u0=uku_0=u_k. وأحد أنواع الرسوم البيانية الموجّهة التي نهتمّ بها كثيرًا هو الرسوم البيانية الموجّهة غير الدورية (directed acyclic graphs) أو DAGs، وهي، كما يدلّ اسمها، رسوم بيانية موجّهة بلا أيّ دورات:

تعريف — الرسوم البيانية الموجّهة غير الدورية

نقول إنّ G=(V,E)هورسمبيانيموجّهغيردوري(directedacyclicgraph,DAG)إذاكانرسمًابيانيًاموجّهًا،ولاتوجدقائمةرؤوسG=(V,E) هو رسم بياني _موجّه غير دوري_ (directed acyclic graph, DAG) إذا كان رسمًا بيانيًا موجّهًا، ولا توجد قائمة رؤوس u_0,u_1,\ldots,u_k \in Vبحيث بحيث u_0=u_k،ولكلّ، ولكلّ i\in [k]يكونالضلع يكون الضلع u_i \rightarrow u_{i+1}في في E$.

للمُلمّات التي ذكرناها أعلاه نظائر في الرسوم البيانية الموجّهة. ونترك البراهين مرّة أخرى (وهي في جوهرها مطابقة لنظائرها غير الموجّهة) تمارينًا.

لمّة

في أيّ رسم بياني موجّه G=(V,E)G=(V,E)، فإنّ مجموع درجات الدخول يساوي مجموع درجات الخروج، وهو يساوي عدد الأضلاع.

لمّة

في أيّ رسم بياني موجّه GG، إذا كان هناك مسار من uu إلى vv ومسار من vv إلى ww، فإنّ هناك مسارًا من uu إلى ww.

لمّة

لكلّ رسم بياني موجّه G=(V,E)G=(V,E) ولكلّ زوج u,vu,v بحيث يوجد مسار من uu إلى vv، فإنّ أقصر مسار من uu إلى vv بسيط.

ملاحظة — الرسوم البيانية المُوسَمة

في بعض التطبيقات سننظر في الرسوم البيانية المُوسَمة (labeled graphs)، حيث يكون للرؤوس أو الأضلاع وسومُ (labels) مرتبطة بها (قد تكون أعدادًا أو سلاسل نصية أو عناصر مجموعة أخرى). ويمكننا التفكير في مثل هذا الرسم البياني على أنّ له دالةَ وسمٍ (labelling function) مرتبطة به (قد تكون جزئية) L:V∪E→LL:V \cup E \rightarrow \mathcal{L}، حيث L\mathcal{L} هي مجموعة الوسوم المحتملة. غير أنّنا لن نشير عادةً صراحةً إلى دالة الوسم هذه، ونكتفي بأن نقول أمورًا مثل: «الرأس vv يحمل الوسم α\alpha».

المشغّلات المنطقية والكمّاسات

إذا كانت PP وQQ عبارتين يمكن أن تكونا صادقتين أو خاطئتين، فإنّ PP AND QQ (ويُرمز لها بـ P∧QP \wedge Q) عبارة تصدق إذا وفقط إذا كانت كلتا PP و QQ صادقتين، وPP OR QQ (ويُرمز لها بـ P∨QP \vee Q) عبارة تصدق إذا وفقط إذا كانت PP أو QQ صادقتان. و_نفيُ_ PP (negation)، ويُرمز له بـ ¬P\neg P أو P‾\overline{P}، يصدق إذا وفقط إذا كانت PP خاطئة.

لنفترض أنّ P(x)P(x) عبارة تعتمد على مُعامِلِ (parameter) ما xx (المعروف أيضًا أحيانًا باسم متغيّر غير مربوط (unbound variable))، بمعنى أنّه لكلّ إسناد لقيمة من مجموعة ما SS إلى xx، تكون P(x)P(x) إمّا صادقة وإمّا خاطئة. مثلًا، x>7x>7 عبارة ليست صادقة ولا خاطئة قبل كلّ نظر، لكنّها تصدق أو تخطئ متى أسنِدنا إلى xx عددًا حقيقيًا ما. ونرمز إلى ∀x∈SP(x)\forall_{x\in S} P(x) بالعبارة التي تصدق إذا وفقط إذا كانت P(x)P(x) صادقة لكلّ x∈Sx\in S.[4] ونرمز إلى ∃x∈SP(x)\exists_{x\in S} P(x) بالعبارة التي تصدق إذا وفقط إذا وُجدَ x∈Sx\in S ما بحيث P(x)P(x) صادقة.

مثلًا، ما يلي هو صياغة رسميّة للعبارة الصحيحة القائلة إنّ هناك عددًا طبيعيًا nn أكبر من 100100 لا يقبل القسمة على 33:

∃n∈N(n>100)∧(∀k∈Nk+k+k≠n)  . \exists_{n\in \N} (n>100) \wedge \left(\forall_{k\in N} k+k+k \neq n\right) \;.

«من أجل nn كبير بما فيه الكفاية.» من التعبيرات التي سنراه يتكرّر مرّة بعد أخرى في هذا الكتاب هو الادّعاء بأنّ عبارة ما P(n)P(n) صادقة «من أجل nn كبير بما فيه الكفاية». ومعنى ذلك أنّ هناك عددًا صحيحًا N0N_0 بحيث تكون P(n)P(n) صادقة لكلّ n>N0n>N_0. ويمكننا صياغة ذلك رسميًّا على هيئة ∃N0∈N∀n>N0P(n)\exists_{N_0\in \N} \forall_{n>N_0} P(n).

كمّاسات المجموعيات والجداءات

الاختصارات التالية للجمع أو لأخذ جداء عدة أعداد تكون مفيدة في أحيان كثيرة. إذا كانت S={s0,…,sn−1}S = \{s_0,\ldots,s_{n-1} \} مجموعة منتهية وf:S→Rf:S \rightarrow \R دالة، فإنّنا نكتب ∑x∈Sf(x)\sum_{x\in S} f(x) اختصارًا عن

f(s0)+f(s1)+f(s2)+…+f(sn−1)  , f(s_0) + f(s_1) + f(s_2) + \ldots + f(s_{n-1}) \;,

ونكتب ∏x∈Sf(x)\prod_{x\in S} f(x) اختصارًا عن

f(s0)⋅f(s1)⋅f(s2)⋅…⋅f(sn−1)  . f(s_0) \cdot f(s_1) \cdot f(s_2) \cdot \ldots \cdot f(s_{n-1}) \;.

مثلًا، يمكن كتابة مجموع مربّعات كلّ الأعداد من 11 إلى 100100 على هيئة

∑i∈{1,…,100}i2  . \sum_{i\in \{1,\ldots,100\}} i^2 \;.

ولأنّ الجمع على مدَيات (فترات) من الأعداد الصحيحة شائع جدًّا، فهناك تدوين خاصّ به. فلكلّ عددين صحيحين، a≤ba \leq b، تعني ∑i=abf(i)\sum_{i=a}^b f(i) ما تعنيه ∑i∈Sf(i)\sum_{i\in S} f(i) حيث S={x∈Z:a≤x≤b}S =\{ x\in \Z : a \leq x \leq b \}. ومن ثمّ يمكننا كتابة المجموع المعادلة على هيئة

∑i=1100i2  . \sum_{i=1}^{100} i^2 \;.

تحليل الصيغ: المتغيّرات المربوطة والحرّة

في الرياضيات، كما في البرمجة، لدينا غالبًا «متغيّرات» أو «معاملات» رمزية. ومن المهمّ، إذا مُعطينا صيغة ما، أن نعرف ما إذا كان متغيّر ما مربوطًا (bound) أم حرًّا (free) في هذه الصيغة. مثلًا، في العبارة التالية يكون nn حرًّا، بينما يكون aa وbb مربوطين بالكمّاس ∃\exists:

∃a,b∈N(a≠1)∧(a≠n)∧(n=a×b) \exists_{a,b \in \N} (a \neq 1) \wedge (a \neq n) \wedge (n = a \times b)

ولأنّ nn حرّ، فيمكن أن يُسنَد إليه أيّ قيمة، وحقّية العبارة المعادلة تعتمد على قيمة nn. مثلًا، إذا كان n=8n=8 تكون العبارة المعادلة صادقة، لكنّها خاطئة مع n=11n=11. (هل ترى لماذا؟)

ويظهر المسألة نفسها عند تحليل الشيفرة. مثلًا، في المقتطف التالي من لغة البرمجة C

for (int i=0 ; i<n ; i=i+1) {
    printf("*");
}

يكون المتغيّر i مربوطًا داخل كتلة for، بينما يكون المتغيّر n حرًّا.

والخاصّية الرئيسة للمتغيّرات المربوطة هي أنّه يمكننا إعادةَ تسميتها (rename) دون أن يتغيّر معنى العبارة (ما دام الاسم الجديد لا يتعارض مع متغيّر مستعمل آخر). ومثال ذلك أنّ العبارة

∃x,y∈N(x≠1)∧(x≠n)∧(n=x×y) \exists_{x,y \in \N} (x \neq 1) \wedge (x \neq n) \wedge (n = x \times y)

هي مكافئة (equivalent) لـالمعادلة بالمعنى أنّها صادقة لمجموعة nn نفسها بالضبط.

وبالمثل، فإنّ الشيفرة

for (int j=0 ; j<n ; j=j+1) {
    printf("*");
}

تعطي النتيجة نفسها التي تعطيها الشيفرة أعلاه التي استعملت i بدلًا من j.

ملاحظة — ملاحظة جانبية: الترميز الرياضي مقابل ترميز البرمجة

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

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

ولكلا المجالين مفهوم «الأنواع»، وفي الرياضيات نحاول عادةً حجز حروف معيّنة لمتغيّرات من نوع بعينه. مثلًا، المتغيّرات مثل i,j,k,ℓ,m,ni,j,k,\ell,m,n تدلّ كثيرًا على أعداد صحيحة، وϵ\epsilon تدلّ كثيرًا على عدد حقيقي موجب صغير (راجع هذا الكتاب: الترميز والاصطلاحات للمزيد عن هذه الاصطلاحات). وحين نقرأ أو نكتب نصوصًا رياضية، فلا نتمتع عادةً بميزة «مُصرِّف» يتحقّق من أمان الأنواع نيابةً عنّا. ولذلك من المهمّ أن نتعقّب نوع كلّ متغيّر، وأن نتأكّد من أنّ العمليات التي تُجرى عليه «منطقية».

يتضمّن كتاب Kun [@Kun18] نقاشًا وافيًا في أوجه التشابه والاختلاف بين ثقافتَي الرياضيات والبرمجة.

المقاربات وترميز OO الكبير

"أُثبت أنّ log⁡log⁡log⁡n\log\log\log n يذهب إلى ما لا نهاية، لكنّه لم يُرصد قطّ وهو يفعل ذلك."، مجهول، نقله كارل بوميرانس (2000)

غالبًا ما يكون وصف كميات مثل زمن التنفيذ بدقّة مرهقًا جدًّا، وليس هو مرغوبًا أيضًا، لأنّنا نهتمّ عادةً في المقام الأول بـ«حدود الرتبة الأعلى». أي أنّنا نريد أن نفهم سلوكَ التغيّر (scaling behavior) لتلك الكمية مع نموّ متغيّر الدخل. مثلًا، فيما يخصّ زمن التنفيذ، فإنّ الفرق بين خوارزمية زمنها n5n^5 وأخرى زمنها n2n^2 أهمّ بكثير من الفرق بين خوارزمية زمنها 100n2+10n100n^2 + 10n وأخرى زمنها 10n210n^2. ولأجل هذا الغرض، فإنّ ترميز OO مفيد جدًّا بوصفه وسيلةً لـ«تنظيف» نصّنا وتشتيت انتباهنا على ما يهمّ حقًّا. مثلًا، باستعمال ترميز OO، يمكننا القول إنّ 100n2+10n100n^2 + 10n و10n210n^2 كلاهما ببساطة Θ(n2)\Theta(n^2) (وهذا يعني غير رسميًّا «أنّهما متساويان حتى ثوابت»)، بينما n2=o(n5)n^2 = o(n^5) (وهذا يعني غير رسميًّا أنّ n2n^2 «أصغر بكثير من» n5n^5).

بوجه عام (وإن ظلّ ذلك غير رسمي)، إذا كانت F,GF,G دالتَين تُسقطان الأعداد الطبيعية على الأعداد الحقيقية غير السالبة، فإنّ «F=O(G)F=O(G)» تعني أنّ F(n)≤G(n)F(n) \leq G(n) إن لم نكتبّ في الثوابت، بينما تعني «F=o(G)F=o(G)» أنّ FF أصغر بكثير من GG، بمعنى أنّه مهما ضُربت FF في أيّ ثابت، فإنّ GG ستكون أكبر متى أخذنا nn كبيرًا بما فيه الكفاية (ولهذا السبب، أحيانًا نكتب F=o(G)F=o(G) على هيئة F≪GF \ll G). ونكتب F=Θ(G)F= \Theta(G) إذا كانت F=O(G)F=O(G) وG=O(F)G=O(F)، ويمكن النظر إلى ذلك على أنّه القول إنّ FF هي نفسها GG إن لم نكتبّ في الثوابت. وبشكلٍ رسميّ أكثر، نعرّف ترميز OO الكبير على النحو التالي:

تعريف — ترميز OO الكبير

لتكن R+={x∈R  ∣  x>0}\R_+= \{ x\in \R \;|\; x>0\} مجموعة الأعداد الحقيقية الموجبة. لدالتَين F,G:N→R+F,G: \N \rightarrow \R_+، نقول إنّ F=O(G)F=O(G) إذا كان هناك عددان a,N0∈Na,N_0 \in \N بحيث F(n)≤a⋅G(n)F(n) \leq a\cdot G(n) لكلّ n>N0n>N_0. ونقول إنّ F=Θ(G)F= \Theta(G) إذا كانت F=O(G)F=O(G) وG=O(F)G=O(F). ونقول إنّ F=Ω(G)F=\Omega(G) إذا كانت G=O(F)G=O(F).

ونقول إنّ F=o(G)F =o(G) إذا كان لكلّ ϵ>0\epsilon>0 عدد N0N_0 ما بحيث F(n)<ϵG(n)F(n) <\epsilon G(n) لكلّ n>N0n>N_0. ونقول إنّ F=ω(G)F =\omega(G) إذا كانت G=o(F)G=o(F).

/images/introtcs/lec_00_1_math_background-6.webp

غالبًا ما يكون من الملائم استعمال «دوالّ مجهولة الاسم» في سياق ترميز OO. مثلًا، حين نكتب عبارة مثل F(n)=O(n3)F(n) = O(n^3)، فإنّنا نعني أنّ F=O(G)F=O(G) حيث GG هي الدالة المعرَّفة بـ G(n)=n3G(n)=n^3. ويقدّم الفصل السابع في ملاحظات Jim Apsnes عن الرياضيات المتقطّعة ملخّصًا جيّدًا لترميز OO؛ راجع أيضًا هذا الدليل مقدّمةً ألطف وأكثر اتّجاهًا إلى المبرمجين.

OO ليست مساواة. إن استعمال علامة المساواة في ترميز OO شائع جدًّا، لكنه تسمية غير دقيقة إلى حدٍّ ما، لأنّ عبارة مثل F=O(G)F = O(G) تعني في الحقيقة أنّ FF تنتمي إلى المجموعة {G′:∃N,c s.t. ∀n>NG′(n)≤cG(n)}\{ G' : \exists_{N,c} \text{ s.t. } \forall_{n>N} G'(n) \leq c G(n) \}. ولعلّ الأنسب هو استعمال متراجحات (inequalities) والكتابة F≤O(G)F \leq O(G) وF≥Ω(G)F \geq \Omega(G)، وترك المساواة لـ F=Θ(G)F = \Theta(G)، ولذلك سنستعمل هذا التدوين أحيانًا أيضًا، لكنّ بما أنّ تدوين المساواة راسخ إلى حدٍّ بعيد، فإنّنا غالبًا ما نلجأ إليه هو الآخر أيضًا. (تكتب بعض النصوص F∈O(G)F \in O(G) بدلًا من F=O(G)F = O(G)، لكنّنا لن نستعمل هذا التدوين.) ورغم علامة المساواة المضلِّلة، ينبغي أن تتذكّر أنّ عبارة مثل F=O(G)F = O(G) تعني أنّ FF هي «على الأكثر» GG بالمعنى التقريبي نفسه حين نتجاهل الثوابت، وأنّ عبارة مثل F=Ω(G)F = \Omega(G) تعني أنّ FF هي «على الأقلّ» GG بالمعنى التقريبي نفسه.

بعض «قواعد الإرشاد» لترميز OO الكبير

هناك بعض القواعد الحدسية (heuristics) البسيطة التي قد تساعد عند محاولة مقارنة دالتَين FF وGG:

  • الثوابت الضربية لا تهمّ في ترميز OO، ولذلك إذا كان F(n)=O(G(n))F(n)=O(G(n)) فإنّ 100F(n)=O(G(n))100F(n)=O(G(n)).

  • عند جمع دالتَين، لا يهمّنا إلّا الأكبر. مثلًا، لأغراض ترميز OO، فإنّ n3+100n2n^3+100n^2 هو نفسه n3n^3، وعلى نحو عام، في أيّ كثير حدود، لا يهمّنا إلّا الأسّ الأكبر.

  • لكلّ ثابتين a,b>0a,b>0، لدينا na=O(nb)n^a = O(n^b) إذا وفقط إذا كان a≤ba \leq b، وna=o(nb)n^a = o(n^b) إذا وفقط إذا كان a<ba<b. مثلًا، بالجمع بين الملاحظتين السابقتين، 100n2+10n+100=o(n3)100n^2 + 10n + 100 = o(n^3).

  • متعدّد الحدود أصغر دائمًا من الأُسّي: na=o(2nϵ)n^a = o(2^{n^\epsilon}) لكلّ ثابتين a>0a>0 وϵ>0\epsilon>0، حتى لو كان ϵ\epsilon أصغر بكثير من aa. مثلًا، 100n100=o(2n)100n^{100} = o(2^{\sqrt{n}}).

  • وبالمثل، اللوغاريتم أصغر دائمًا من متعدّد الحدود: (log⁡n)a(\log n)^a (ونكتبه log⁡an\log^a n) هو o(nϵ)o(n^\epsilon) لكلّ ثابتين a,ϵ>0a,\epsilon>0. مثلًا، بالجمع بين الملاحظات أعلاه، 100n2log⁡100n=o(n3)100n^2 \log^{100} n = o(n^3).

ملاحظة — ترميز OO الكبير في تطبيقات أخرى (اختياري)

على الرغم من أنّ ترميز OO الكبير يُستعمل غالبًا لتحليل زمن تنفيذ الخوارزميات، فإنّه ليس بالتأكيد التطبيق الوحيد. يمكننا استعمال ترميز OO لتقييد العلاقات المقاربة بين أيّ دوالّ تُسقط الأعداد الصحيحة على أعداد موجبة. ويمكن استعماله بصرف النظر عمّا إذا كانت هذه الدوال تقيس زمن التنفيذ، أو استهلاك الذاكرة، أو أيّ كمية أخرى قد لا علاقة لها بالحوسبة. وهنا مثال واحد لا علاقة له بهذا الكتاب (وعليه يمكنك بكلّ سرور تخطّيه): إحدى طرائق صياغة فرضية ريمان (وهي من أشهر المسائل المفتوحة في الرياضيات) هي أنّها تقابل التخمين القائل إنّ عدد الأعداد الأولية بين 00 وnn يساوي ∫2n1ln⁡xdx\int_2^n \tfrac{1}{\ln x} dx حتى خطأ جمعّي مقداره على الأكثر O(nlog⁡n)O(\sqrt{n}\log n).

البراهين

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

ولإنتاج برهان كهذا، تحتاج إلى:

  1. أن تفهم بدقّة ما تعنيه XX.

  2. أن تُقنع نفسك بأنّ XX صحيحة.

  3. أن تكتب استدلالك بلغة إنشائية بسيطة ودقيقة ومُوجزة (لا تستعمل الصيغ أو الترميز إلّا حين يفيدان في الوضوح).

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

البراهين والبرامج

هناك تشابه كبير بين عمليّة كتابة البراهين وعمليّة كتابة البرامج، وكلاهما يحتاج مجموعة مهارات متشابهة. ويستلزم كتابة برنامج ما:

  1. فهم ما هي المهمّة التي نريد للبرنامج أن يحقّقها.

  2. الإقناع نفسك بأنّ المهمّة يمكن إنجازها بواسطة حاسوب، ربما بالتخطيط على سبورة بيضاء أو على دفتر لكيفية تقسيمها إلى مهمّات أبسط.

  3. تحويل هذه الخطة إلى شيفرة يفهمها مُصرِّف (compiler) أو مُفسِّر (interpreter)، بتقسيم كلّ مهمّة إلى تتابع من العمليات الأساسيّة لإحدى لغات البرمجة.

وكما في البرامج كذلك في البراهين، غالبًا ما تكون الخطوة 1 هي الأهمّ. والفرق الجوهري أنّ قارئ البرهان إنسان، وأنّ قارئ البرنامج حاسوب. (وهذا الفرق يزول مع الزمن كلّما كُتبت البراهين أكثر بصيغة قابلة للتحقّق آليًّا؛ إضافةً إلى ذلك، فإنّ ضمان صحّة البرامج وقابليتها للصيانة يتطلّبان أن يكون بالإمكان قراءتها وفهمها من البشر.) ولذلك فإنّ تركيزنا ينصبّ على قابلية القراءة وعلى وجود تسلسل منطقي واضح في برهاننا (وهذا ليس فكرة سيّئة بالنسبة للبرامج أيضًا). وحين تكتب برهانًا، ينبغي أن تنظر إلى جمهورك بوصفه قارئًا ذكيًّا جدًّا لكنّه شديد الشكّ وعضيلًا إلى حدٍّ ما، بحيث يصيح «مخالفة!» عند كلّ خطوة غير مبرَّرة بدقّة.

أسلوب كتابة البراهين

البرهان الرياضي قطعة كتابة، لكنّه نوع كتابة محدّد له اصطلاحات وأنماط تفضيليّة معيّنة. وكما في كلّ كتابة، فالمُمارسة تُجيد، ومن المهمّ أيضًا أن تنقّح مسودّاتك من أجل الوضوح.

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

  1. هل تقول هذه الجملة أو المعادلة إنّ عبارة ما صحيحة؟

  2. إن كان كذلك، فهل تترتّب هذه العبارة عن الخطوات السابقة، أم أننا سنُثبتها في الخطوة التالية؟

  3. ما هو دورُ (role) هذه الجملة أو المعادلة؟ هل هي خطوة في اتجاه إثبات العبارة الأصلية، أم خطوة في اتجاه إثبات مزعَم وسيط سبق أن ذكرناه؟

  4. وأخيرًا، هل تكون إجابات الأسئلة 1-3 واضحةً للقارئ؟ فإن لم تكن، فينبغي أن تعيد الترتيب، أو تعيد الصياغة، أو تضيف توضيحات.

من بين الموارد المفيدة في الكتابة الرياضية هذه النشرة لـ Lee، وهذه النشرة لـ Hutching، وكذلك عدة نشرات ممتازة في مساق Stanford CS 103.

أنماط البراهين

"لو كان هكذا لأمكن؛ ولو كان هكذا لكان؛ لكنّه ليس هكذا، فهو ليس كذلك. هذا هو المنطق."، لويس كارول، عبر المرآة.

وكما في البرمجة تمامًا، هناك عدّة أنماط شائعة من البراهين تتكرّر مرّة بعد أخرى. وهذه بعض الأمثلة:

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

لمّة

لا يوجد عددان طبيعيان a,ba,b بحيث 2=ab\sqrt{2} = \tfrac{a}{b}.

برهان

لنفرض، طلبًا للتناقض، أنّ هذا خاطئ، وليكن a∈Na\in \N أصغر عدد بحيث يوجد b∈Nb\in\N ما يحقّق 2=ab\sqrt{2}=\tfrac{a}{b}. بتفريع هذه المعادلة نحصل على 2=a2/b22=a^2/b^2، أي a2=2b2a^2=2b^2 (∗)(*). لكنّ هذا يعني أنّ a2a^2 زوجيّ، وبما أنّ جداء عددين فرديّين فرديّ، فإنّه يعني أيضًا أنّ aa زوجيّ، أو بعبارة أخرى a=2a′a = 2a' لأجل a′∈Na' \in \N ما. غير أنّ إدخال هذا في (∗)(*) يُظهر أنّ 4a′2=2b24a'^2 = 2b^2، ما يعني أنّ b2=2a′2b^2 = 2a'^2 هو أيضًا عدد زوجيّ. وباعتبارات مماثلة لما سبق نحصل على أنّ bb زوجيّ، وبالتالي يكون a/2a/2 وb/2b/2 عددين طبيعيين يحقّقان a/2b/2=2\tfrac{a/2}{b/2}=\sqrt{2}، وهذا يناقض أصغرية aa.

براهين العبارة الكلّية: كثيرًا ما نريد إثبات عبارة XX من الشكل «كلّ كائن من النوع OO له الخاصّية PP.» وغالبًا ما تبدأ هذه البراهين بجملة مثل «ليكن oo كائنًا من النوع OO»، وتنتهي بإظهار أنّ لـ oo الخاصّية PP. وهنا مثال بسيط:

لمّة

لكلّ عدد طبيعي n∈Nn\in N، إمّا nn وإمّا n+1n+1 زوجيّ.

برهان

لتكن n∈Nn\in N عددًا ما. إذا كان n/2n/2 عددًا صحيحًا فقد انتهينا، لأنّه عندئذٍ n=2(n/2)n=2(n/2) وبالتالي هو زوجيّ. وإلّا فإنّ n/2+1/2n/2+1/2 عدد صحيح، وبالتالي فإنّ 2(n/2+1/2)=n+12(n/2+1/2)=n+1 زوجيّ.

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

لمّة

إذا كان b2≥4acb^2 \geq 4ac فهناك حلّ للمعادلة التربيعية ax2+bx+c=0ax^2 + bx + c =0.

برهان

نفترض أنّ b2≥4acb^2 \geq 4ac. عندئذٍ يكون d=b2−4acd = b^2 - 4ac عددًا غير سالب، وبالتالي له جذر تربيعي ss. وعليه فإنّ x=(−b+s)/(2a)x = (-b+s)/(2a) يحقّق ax2+bx+c=a(−b+s)2/(4a2)+b(−b+s)/(2a)+c=(b2−2bs+s2)/(4a)+(−b2+bs)/(2a)+c  . \begin{aligned} ax^2 + bx + c &= a(-b+s)^2/(4a^2) + b(-b+s)/(2a) + c \\ &= (b^2-2bs+s^2)/(4a)+(-b^2+bs)/(2a)+c \;. \end{aligned}

وإعادة ترتيب حدود المعادلة نحصل على s2/(4a)+c−b2/(4a)=(b2−4ac)/(4a)+c−b2/(4a)=0 s^2/(4a)+c- b^2/(4a) = (b^2-4ac)/(4a) + c - b^2/(4a) = 0

براهين التكافؤ: إذا كانت العبارة من الشكل «AA إذا وفقط إذا BB» (كثيرًا ما تُختصر إلى «AA إن وفقط إن BB» (iff))، فإنّنا نحتاج إلى إثبات أنّ AA تلزم منها BB، وأنّ BB تلزم منها AA. ونسمّي اللّزَمَ بأنّ AA تلزم منها BB اتّجاه «فقط إذا» (only if)، واللّزَمَ بأنّ BB تلزم منها AA اتّجاه «إذا» (if).

براهين بدمج المزاعم الوسيطة: عندما يكون البرهان أعقد، فإنّ تفكيكه إلى عدّة خطوات يكون مفيدًا في كثير من الأحيان. أي أنّه، لإثبات العبارة XX، قد نُثبت أوّلًا العبارات X1X_1 وX2X_2 وX3X_3، ثمّ نُثبت أنّ X1∧X2∧X3X_1 \wedge X_2 \wedge X_3 تلزم منها XX. (وتذكّر أنّ ∧\wedge تدلّ على المشغّل المنطقي AND.)

براهين بالتفريق بين الحالات: هذه حالة خاصّة ممّا سبق، إذ نقسّم، لإثبات عبارة XX، إلى عدة حالات C1,…,CkC_1,\ldots,C_k، ونُثبت أنّ (a) الحالات حاصرة (exhaustive)، بمعنى أنّ إحدى الحالات CiC_i يجب أن تقع، و (b) نمرّ على الحالات واحدةً واحدة ونُثبت أنّ كلّ حالة CiC_i تلزم منها النتيجة XX التي نروم إليها.

البراهين بالحَث: نتناول الحَث ونعطي مثالًا في الحَث الرياضي أدناه. ويمكننا التفكير في هذه البراهين على أنّها صيغةٌ من الصيغ السابقة، حيث لدينا عدد غير محدود من المزاعم الوسيطة X0,X1,X2,…,XkX_0,X_1,X_2,\ldots,X_k، ونُثبت أنّ X0X_0 صادقة، وأنّ X0X_0 تلزم منها X1X_1، وأنّ X0∧X1X_0 \wedge X_1 تلزم منها X2X_2، وهكذا دواليًا. ويحتوي الموقع الخاص بمساق CMU 15-251 على نشرة مفيدة عن المحاذير المحتملة عند إجراء البراهين بالحَث.

«من دون خسارة عامّة» (w.l.o.g): قد يكون هذا المصطلح مربكًا في البداية. وهو في جوهره وسيلة لتبسيط البراهين بالتفريق بين الحالات. والفكرة أنّه إذا كانت الحالة 1 مساوية للحالة 2 بعد تغيير متغيّرات أو تحويل مشابه، فإنّ برهان الحالة 1 سيُلزم منه أيضًا برهان الحالة 2. وهذه دائمًا عبارة ينبغي النظر إليها بشكّ. فكلّما رأيتها في برهان، اسأل نفسك هل تفهم لماذا كان الافتراض المأخوذ بلا خسارة عامّة حقًّا، وحين تستعملها، حاول أن ترى هل الاستعمال مبرَّر فعلًا. وحين تكتب برهانًا، أحيانًا يكون الأسهل ببساطة أن تكرّر برهان الحالة الثانية (مع إضافة ملاحظة بأنّ البرهان قريب جدًّا من الأول).

ملاحظة — البراهين الهرمية (اختياري)

تُكتب البراهين الرياضية في النهاية نثرًا إنجليزيًّا. ويُجادل عالِم الحاسوب المعروف Leslie Lamport بأنّ هذه مسألة، وأنّ البراهين ينبغي أن تُكتب بطريقة أكثر رسمية ودقّة. ويقترح في مخطوطه منهجًا لـ_البراهين الهرمية المهيكلة_ (structured hierarchical proofs)، لها الصيغة التالية:

  • برهان عبارة من الشكل «إذا كانت AA فإنّ BB» هو تتابع من مزاعم مرقّمة، يبدأ بافتراض أنّ AA صادقة، وينتهي بالمزعم بأنّ BB صادقة.

  • يتبع كلّ مزعم برهان يوضّح كيف اشتُقّ من الافتراضات أو المزاعم السابقة.

  • برهان كلّ مزعم هو بدوره تتابع من مزاعم فرعية.

وممّنية صيغة Lamport أنّ دور كلّ جملة في البرهان يتّضح إلى حدٍّ كبير. كما أنّ تحويل هذه البراهين إلى صيغ قابلة للتحقّق آليًّا أصعب بكثير. أمّا العيب فهو أنّ قراءة هذه البراهين وكتابتها قد تكون مملّة، مع تمييز أقلّ بين الأجزاء المهمّة من الحجة والأجزاء الأكثر اعتياديّة.

مثال موسّع: الفرز الطوبولوجي

في هذا القسم سنُثبت ما يلي: كلّ رسم بياني موجّه غير دوريّ (DAG، راجع تعريف — الرسوم البيانية الموجّهة غير الدورية) يمكن ترتيبه في طبقات بحيث إنّ لكلّ ضلع موجّه u→vu \rightarrow v، تكون طبقة vv أكبر من طبقة uu. وتُعرف هذه النتيجة بـالفرز الطوبولوجي، وهي مستعملة في تطبيقات كثيرة، منها جدولة المهمّات، وأنظمة البناء، وإدارة حزم البرمجيات، وحسابات خلايا جداول البيانات، وكثير غيرها (راجع الشكل التوضيحي). والواقع أنّنا سنستعملها نحن أيضًا لاحقًا في هذا الكتاب.

/images/introtcs/lec_00_1_math_background-7.webp

نبدأ بالتعريف التالي. الطبقيّة (layering) لرسم بياني موجّه هي وسيلة لإسناد كلّ رأس vv عددًا طبيعيًا (يقابل طبقته)، بحيث يكون جيران vv الواردون في طبقات ذات أرقام أصغر من طبقة vv، ويكون جيران vv الصادرون في طبقات ذات أرقام أكبر. والتعريف الرسميّ هو على النحو التالي:

تعريف — طبقيّة رسم بياني موجّه غير دوريّ

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا موجّهًا. الطبقيّة لـ GG هي دالة f:V→Nf:V \rightarrow \N بحيث إنّ لكلّ ضلع u→vu \rightarrow v في GG لدينا f(u)<f(v)f(u) < f(v).

في هذا القسم نُثبت أنّ الرسم البياني الموجّه غير دوريّ إذا وفقط إذا كانت له طبقيّة صالحة.

مبرهنة — الفرز الطوبولوجي

لتكن GG رسمًا بيانيًا موجّهًا. عندئذٍ يكون GG غير دوريّ إذا وفقط إذا كانت هناك طبقيّة ff لـ GG.

لإثبات مبرهنة كهذه، نحتاج أوّلًا إلى فهم ما تعنيه. وبما أنّها عبارة «إذا وفقط إذا»، فإنّ مبرهنة — الفرز الطوبولوجي تقابل عبارتين:

لمّة

لكلّ رسم بياني موجّه GG، إذا كان GG غير دوريّ فإنّ له طبقيّة.

لمّة

لكلّ رسم بياني موجّه GG، إذا كان لـ GG طبقيّة، فإنّه غير دوريّ.

لإثبات مبرهنة — الفرز الطوبولوجي نحتاج إلى إثبات لمّة ولمّة معًا. ولمّة في الحقيقة ليس صعبًا جدًّا على الإثبات. فبحدس، إذا كان GG يحتوي على دورة، فإنّه لا يمكن أن تكون كلّ الأضلاع على الدورة ترتفع في رقم الطبقة، لأنّنا إذا سِرنا على الدورة فسنضطر عند نقطة ما إلى العودة إلى الموضع الذي بدأنا منه. والبرهان الرسميّ هو على النحو التالي:

برهان

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا موجّهًا، وليكن f:V→Nf:V \rightarrow \N طبقيّة لـ GG بحسب تعريف — طبقيّة رسم بياني موجّه غير دوريّ . ولنفرض، طلبًا للتناقض، أنّ GG ليس غير دوريّ، ومن ثمّ فهناك دورة u0,u1,…,uku_0,u_1,\ldots,u_k ما بحيث u0=uku_0=u_k، ولكلّ i∈[k]i\in [k] يكون الضلع ui→ui+1u_i \rightarrow u_{i+1} حاضرًا في GG. وبما أنّ ff طبقيّة، فإنّ لكلّ i∈[k]i \in [k] لدينا f(ui)<f(ui+1)f(u_i) < f(u_{i+1})، أي أنّ f(u0)<f(u1)<⋯<f(uk) f(u_0) < f(u_1) < \cdots < f(u_k) وهذا تناقض، لأنّ u0=uku_0=u_k وبالتالي f(u0)=f(uk)f(u_0)=f(u_k).

تقابل لمّة الاتّجاه الأصعب (والأنفع). ولإثباته نحتاج إلى أن نُبيّن كيف، معطى رسم بياني موجّه غير دوريّ GG، يمكننا أن نأتي بطبقيّة لرؤوس GG بحيث تصعد كلّ الأضلاع «إلى أعلى».

توقّف وتأمّل

إن لم تكن قد رأيت برهان هذه المبرهنة من قبل (أو لم تكن تتذكّره)، فإنّ هذا مكان ممتاز للتوقّف ومحاولة إثباتها بنفسك. وإحدى طرق ذلك هي أن تصف خوارزمية (algorithm) تُعطى كدخل رسمًا بيانيًا موجّهًا غير دوريّ GG على nn رؤوس وn−2n-2 أضلاع أو أقلّ، وتبني مصفوفة FF ذات الطول nn بحيث لكلّ ضلع u→vu \rightarrow v في الرسم البياني يكون F[u]<F[v]F[u] < F[v].

الحَث الرياضي

هناك عدة طرائق لإثبات لمّة. وإحدى طرائق ذلك هي البدء بإثباته لرسوم بيانية صغيرة، مثل الرسوم ذات 1 أو 2 أو 3 رؤوس (راجع الشكل التوضيحي، وهي رسوم يمكننا التحقّق من كلّ الحالات فيها)، ثمّ محاولة توسيع البرهان إلى رسوم بيانية أكبر. والمصطلح التقنيّ لهذا المنهج في الإثبات هو البرهان بالحَث.

/images/introtcs/lec_00_1_math_background-8.webp

الحَث (induction) ليس سوى تطبيق قاعدة الاستدلال modus ponens البديهية، التي تقول إنّه إذا كان

(a) ‏PP صادقة

و

(b) ‏PP تلزم منها QQ

فإنّ QQ صادقة.

في سياق البراهين بالحَث، لدينا عادةً عبارة Q(k)Q(k) مُعامَلة بمُعامِل صحيح ما kk، ونُثبت أنّ (a) ‏Q(0)Q(0) صادقة، وأنّ (b) لكلّ k>0k>0، إذا كانت Q(0),…,Q(k−1)Q(0),\ldots,Q(k-1) صادقة كلّها فإنّ Q(k)Q(k) صادقة. (ومعهود أنّ إثبات (b) هو الجزء الصعب، وإنّ كانت هناك أمثلة تكون فيها «الحالة الأساس» (a) دقيقة إلى حدٍّ كبير.) وبتطبيق قاعدة الاستدلال modus ponens، يمكننا أن نستنتج من (a) و (b) أنّ Q(1)Q(1) صادقة. ومتى فعلنا ذلك، فبمجرّد أن نعرف الآن أنّ Q(0)Q(0) وQ(1)Q(1) كلتاهما صادقتان، يمكننا أن نستعمل ذلك مع (b) لنستنتج (مرّة أخرى بتطبيق قاعدة الاستدلال) أنّ Q(2)Q(2) صادقة. ويمكننا تكرار الاستدلال نفسه مرّة بعد مرّة للحصول على أنّ Q(k)Q(k) صادقة لكلّ kk. وتُسمّى العبارة (a) «الحالة الأساس» (base case)، بينما تُسمّى (b) «خطوة الحَث» (inductive step). ويسمّى الافتراض في (b) بأنّ Q(i)Q(i) تتحقّق لـi<ki<k «فرضية الحَث» (inductive hypothesis). (والصورة الموصوفة هنا من الحَث تُسمّى أحيانًا «الحَث القوي» (strong induction) في مقابل «الحَث الضعيف» (weak induction) الذي نستبدل فيه (b) بالعبارة (b') القائلة إنّ إذا كانت Q(k−1)Q(k-1) صادقة فإنّ Q(k)Q(k) صادقة؛ ويمكن النظر إلى الحَث الضعيف بوصفه الحالة الخاصّة من الحَث القوي التي لا نستعمل فيها افتراض أنّ Q(0),…,Q(k−2)Q(0),\ldots,Q(k-2) صادقة.)

ملاحظة — الحَث والتكرار

البراهين بالحَث ترتبط عن قرب بالخوارزميات التكرارية. وفي الحالتين نُقلّص حلّ مسألة أكبر إلى حلّ نسخة أصغر منها. وفي خوارزمية تكرارية لحلّ مسألة ما P على دخل طوله kk، نسأل أنفسنا: «ماذا لو أعطاني أحدهم طريقة لحلّ P على نسخ أصغر من kk؟». وفي برهان بالحَث لإثبات عبارة Q مُعامَلة بعدد kk، نسأل أنفسنا: «ماذا لو كنتُ أعرف أصلًا أنّ Q(k′)Q(k') صادقة لكلّ k′<kk'<k؟». وكلا المفهومين، الحَث والتكرار، مفهومان جوهريان لهذا المساق ولمستوى علم الحاسوب ككلّ (وحتى لمجالات استقصائية أخرى، ومنها الرياضيات وسواها). وكلاهما قد يكون مربكًا في البداية، لكنّهما مع الوقت والممارسة يتّضحان. ولمزيد من البساطة في البراهين بالحَث والتكرار، قد تجد ما يلي مفيدًا: نشرة Stanford CS 103، وهذه المحاضرة من MIT 6.00، أو هذا المقتطف من كتاب Lehman-Leighton.

إثبات النتيجة بالحَث

هناك عدة طرائق لإثبات لمّة بالحَث. وسنستعمل الحَث على عدد الرؤوس nn، ولذلك سنعرّف العبارة Q(n)Q(n) على النحو التالي:

‏Q(n)Q(n) هي : «لكلّ رسم بياني موجّه غير دوريّ G=(V,E)G=(V,E) ذو nn رأسًا، هناك طبقيّة لـ GG.»

العبارة الخاصّة بـQ(0)Q(0) (حيث لا يحتوي الرسم البياني على أيّ رؤوس) بديهية. وعليه يكفي أن نُثبت ما يلي: لكلّ n>0n>0، إذا كانت Q(n−1)Q(n-1) صادقة فإنّ Q(n)Q(n) صادقة.

ولننجز ذلك، نحتاج إلى أن نجد طريقة، معطى رسم بياني GG ذو nn رؤوس، تُحوّل مهمّة إيجاد طبقيّة لـ GG إلى مهمّة إيجاد طبقيّة لرسم بياني آخر G′G' ذو n−1n-1 رأسًا. والفكرة أنّنا سنجد مصدرًا (source) لـ GG: أي رأسًا vv ليس له جيران واردون. يمكننا عندئذٍ إسناد الطبقة 00 إلى vv، ثمّ وضع بقية الرؤوس في طبقات 1,2,…1,2,\ldots باستعمال فرضية الحَث.

ما سبق هو الحدس وراء برهان لمّة، لكنّنا حين نكتب البرهان الرسميّ أدناه نستعمل ميزة النظر إلى الخلف، ونحاول أن نختصر رحلة كانت متعرّجة في تسلسل خطّي سهل الاتّباع من المنطق يبدأ بالكلمة «برهان:» وينتهي بـ «انتهى البرهان» (QED) أو بالرمز ■\blacksquare.[5] والمناقشات والأمثلة والاستطرادات قد تكون بليغة جدًّا، لكنّنا نُبقيها خارج المساحة المحدودة بين هاتين الكلمتين، حيث (بحسب ما تصفه هذه النشرة الممتازة) «يجب أن تتّكئ كلّ جملة على شيء ما». وكما نفعل في البرمجة، يمكننا تقسيم البرهان إلى «دوالّ فرعية» صغيرة (المعروفة في اللغة الرياضية باسم مُلمّات أو مزاعم)، وهي عبارات أصغر تساعدنا على إثبات النتيجة الرئيسة. غير أنّ البرهان ينبغي أن يُبنى على نحو يضمن أنّه يكون للقارئ في كلّ لحظة وبوضوح تامّ أيّ مرحلة نحن فيها من مراحل البرهان. وينبغي أن يستطيع القارئ تحديد دور كلّ جملة في البرهان وأيّ جزء تنتمي إليه. ونعرض الآن البرهان الرسميّ لـلمّة.

برهان

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا موجّهًا غير دوريّ، وn=∣V∣n=|V| عدد رؤوسه. نُثبت المُلمّة بالحَث على nn. الحالة الأساس هي n=0n=0 حيث لا توجد رؤوس، ولذلك تكون العبارة صحيحة بداهةً.[6] أمّا في حالة n>0n>0، فإنّنا نفترض فرضية الحَث وهي أنّ كلّ رسم بياني موجّه غير دوريّ G′G' ذو عدد رؤوس لا يتجاوز n−1n-1 له طبقيّة.

ونطرح المزعم التالي:

المزعم: يجب أن يحتوي GG على رأس vv درجته الداخلية صفر.

برهان المزعم: لنفرض خلاف ذلك، أي إنّ كلّ رأس v∈Vv\in V له جار وارد. ليكن v0v_0 رأسًا ما من GG، وليكن v1v_1 جيرًا واردًا لـ v0v_0، و v2v_2 جيرًا واردًا لـ v1v_1، وهكذا على هذا النحو nn خطوة حتى نبني قائمة v0,v1,…,vnv_0,v_1,\ldots,v_n بحيث لكلّ i∈[n]i\in [n] يكون vi+1v_{i+1} جيرًا واردًا لـ viv_i، أو بعبارة أخرى يكون الضلع vi+1→viv_{i+1} \rightarrow v_i حاضرًا في الرسم البياني. وبما أنّ في هذا الرسم البياني nn رؤوس فقط، فلا بدّ أن يتكرّر أحد الرؤوس الـn+1n+1 في هذا التسلسل، ومن ثمّ يوجد i<ji<j بحيث vi=vjv_i=v_j. لكنّ عندئذٍ يكون التسلسل vj→vj−1→⋯→viv_j \rightarrow v_{j-1} \rightarrow \cdots \rightarrow v_i دورة في GG، وهذا يناقض افتراضنا بأنّه غير دوريّ. (انتهى برهان المزعم)

وبناءً على المزعم، يمكننا أن نأخذ v0v_0 رأسًا ما درجته الداخلية صفر في GG، وليكن G′G' هو الرسم البياني الناتج عن إزالة v0v_0 من GG. ولدى G′G' عدد رؤوس يساوي n−1n-1، ومن ثمّ فبحسب فرضية الحَث له طبقيّة f′:(V∖{v0})→Nf':(V \setminus \{v_0\}) \rightarrow \N. ونعرّف f:V→Nf:V \rightarrow \N على النحو التالي:

f(v)={f′(v)+1v≠v00v=v0  .f(v) = \begin{cases}f'(v)+1 & v \neq v_0 \\ 0 & v=v_0 \end{cases}\;.

وندّعي أنّ ff طبقيّة صالحة، أي أنّه لكلّ ضلع u→vu \rightarrow v لدينا f(u)<f(v)f(u) < f(v). ولإثبات ذلك نقسّم إلى حالات:

  • الحالة 1: ‏u≠v0u \neq v_0، v≠v0v \neq v_0. في هذه الحالة الضلع u→vu \rightarrow v موجود في الرسم البياني G′G'، ومن ثمّ ففي ضوء فرضية الحَث لدينا f′(u)<f′(v)f'(u) < f'(v)، ما ينتج أنّ f′(u)+1<f′(v)+1f'(u)+1 < f'(v)+1.

  • الحالة 2: ‏u=v0u=v_0، v≠v0v \neq v_0. في هذه الحالة f(u)=0f(u)=0 و f(v)=f′(v)+1>0f(v) = f'(v)+1>0.

  • الحالة 3: ‏u≠v0u \neq v_0، v=v0v=v_0. لا يمكن أن تحدث هذه الحالة لأنّ v0v_0 ليس له جيران واردون.

  • الحالة 4: ‏u=v0,v=v0u=v_0, v=v_0. ولا يمكن أن تحدث هذه الحالة مرّة أخرى لأنّها تعني أنّ v0v_0 جاره لنفسه — أي إنّ هذا ينطوي على حلقة ذاتية (self loop)، وهي دورة من نوعٍ محظور في الرسم البياني غير الدوريّ.

وعليه، فإنّ ff طبقيّة صالحة لـ GG، وهذا يُتمّ البرهان.

توقّف وتأمّل

قراءة البرهان مهارة لا تقلّ أهمية عن كتابته. والواقع أنّها، كما تمامًا فهم الشيفرة، مهارة صعبة جدًّا بذاتها. ولذلك فإنّني أنصحك بشدّة بأن تعيد قراءة البرهان أعلاه، وتسأل نفسك عند كلّ جملة عمّا إذا كان الافتراض الذي تتضمّنه مبرَّرًا، وهل تُظهر هذه الجملة فعلًا ما تدّعي أنّه تُظهره. ومن العادات الجيّدة أيضًا أن تسأل نفسك، حين تقرأ برهانًا، عن كلّ متغيّر تصادفه (مثل uu و ii و G′G' و f′f' وغيرها في البرهان أعلاه) الأسئلة التالية: (1) ما نوعُ هذا المتغيّر؟ هل هو عدد؟ أم رسم بياني؟ أم رأس؟ أم دالة؟ و (2) ماذا نعرف عنه؟ هل هو عنصر اعتباطي في المجموعة؟ هل أثبتنا عنه بعض الحقائق؟، و (3) ما الذي نُحاول إثباته عنه؟.

الأصغرية والتفرّد

تكفل مبرهنة — الفرز الطوبولوجي بأنّ لكلّ رسم بياني موجّه غير دوريّ G=(V,E)G=(V,E) هناك طبقيّة ما f:V→Nf:V \rightarrow \N، لكنّ هذه الطبقيّة ليست بالضرورة متفرّدة (unique). مثلًا، إذا كانت f:V→Nf:V \rightarrow \N طبقيّة صالحة للرسم البياني، فإنّ الدالة f′f' المعرَّفة بـ f′(v)=2⋅f(v)f'(v) = 2\cdot f(v) طبقيّة صالحة أيضًا. غير أنّ الأمر ينتهي إلى أنّ الطبقيّة الأصغرية (minimal) متفرّدة. والطبقيّة الأصغرية هي التي يُسنَد فيها كلّ رأس إلى أصغر رقم طبقة ممكن. ونعرّف الآن الأصغرية رسميًّا ونطرح مبرهنة التفرّد:

مبرهنة — الطبقيّة الأصغرية متفرّدة

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا موجّهًا غير دوريّ. نقول إنّ طبقيّة f:V→Nf:V \rightarrow \N أصغرية (minimal) إذا كان لكلّ رأس v∈Vv \in V، فإن كان vv ليس له جيران واردون فإنّ f(v)=0f(v)=0، وإن كان لـ vv جيران واردون فإنّ هناك جيرًا واردًا uu لـ vv بحيث f(u)=f(v)−1f(u) = f(v)-1.

ولكلّ طبقيّتين f,g:V→Nf,g:V \rightarrow \N لـ GG، إذا كانت كلتا ff و gg أصغرية فإنّ f=gf=g.

يترتّب على تعريف الأصغرية في مبرهنة — الطبقيّة الأصغرية متفرّدة أنّنا لا نستطيع نقل أيّ رأس v∈Vv \in V إلى طبقة أدنى دون أن تصبح الطبقيّة غير صالحة. فإذا كان vv مصدرًا (أي درجته الداخلية صفر)، فإنّ الطبقيّة الأصغرية ff لا بدّ أن تضعه في الطبقة 00، وأمّا كلّ vv آخر، فإذا كان f(v)=if(v)=i، فلا نستطيع تعديل ذلك لوضع f(v)≤i−1f(v) \leq i-1، لأنّ هناك جيرًا واردًا uu لـ vv يحقّق f(u)=i−1f(u)=i-1. وتقول مبرهنة — الطبقيّة الأصغرية متفرّدة إنّ الطبقيّة الأصغرية ff متفرّدة بالمعنى أنّ كلّ طبقيّة أصغرية أخرى تساوي ff.

الفكرة هي إثبات المبرهنة بالحَث على الطبقات. إذا كانت ff و gg أصغرية، فيجب أن تتفقا على رؤوس المصدر، لأنّ كلًّا من ff و gg ينبغي أن تُسند هذه الرؤوس إلى الطبقة 00. ويمكننا بعدها أن نُبيّن أنّه إذا كانت ff و gg متفقتين حتى الطبقة i−1i-1، فإنّ خاصّية الأصغرية تقتضي أن تتفقا أيضًا في الطبقة ii. وفي البرهان الفعلي نستعمل حيلة صغيرة لتوفير الكتابة. فبدلًا من إثبات العبارة f=gf=g (أو بعبارة أخرى أنّ f(v)=g(v)f(v)=g(v) لكلّ v∈Vv\in V)، نُثبت العبارة الأضعف وهي أنّ f(v)≤g(v)f(v) \leq g(v) لكلّ v∈Vv\in V. (وهذه عبارة أضعف، لأنّ شرط أنّ f(v)f(v) أصغر من g(v)g(v) أو مساوٍ له ينتج عن شرط أنّ f(v)f(v) يساوي g(v)g(v).) غير أنّه، بما أنّ ff و gg ليسا سوى اسمين نضعهما لطبقيّتين أصغرَيين، فإنّ تغيير الاسمين «ff» و«gg» وحده يجعل البرهان نفسه يُظهر أيضًا أنّ g(v)≤f(v)g(v) \leq f(v) لكلّ v∈Vv\in V، ومن ثمّ أنّ f=gf=g.

برهان

لتكن G=(V,E)G=(V,E) رسمًا بيانيًا موجّهًا غير دوريّ، و f,g:V→Nf,g:V \rightarrow \N طبقيّتين أصغرَيتين صالحتين لـ GG. سنُثبت أنّ لكلّ v∈Vv \in V لدينا f(v)≤g(v)f(v) \leq g(v). ولأنّنا لم نفترض أيّ شيء في f,gf,g سوى أصغرّيتهما، فإنّ البرهان نفسه سيُبيّن أيضًا أنّ لكلّ v∈Vv\in V لدينا g(v)≤f(v)g(v) \leq f(v)، ومن ثمّ أنّ f(v)=g(v)f(v)=g(v) لكلّ v∈Vv\in V، وهذا هو ما احتجنا إلى إظهاره.

سنُثبت أنّ f(v)≤g(v)f(v) \leq g(v) لكلّ v∈Vv \in V بالحَث على i=f(v)i = f(v). الحالة i=0i=0 بديهية: فبما أنّ f(v)=0f(v)=0 في هذه الحالة، وجب أن تكون g(v)g(v) على الأقلّ f(v)f(v). أمّا في حالة i>0i>0، فبأصغرية ff، إذا كان f(v)=if(v)=i فيجب أن يوجد جار وارد uu ما لـ vv بحيث f(u)=i−1f(u) = i-1. ومن فرضية الحَث نحصل على g(u)≥i−1g(u) \geq i-1، وبما أنّ gg طبقيّة صالحة فيجب أن يكون g(v)>g(u)g(v) > g(u)، ما يعني أنّ g(v)≥i=f(v)g(v) \geq i = f(v).

توقّف وتأمّل

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

هذا الكتاب: الترميز والاصطلاحات

معظم الترميز الذي نستعمله في هذا الكتاب ترميز قياسي مستعمل في معظم النصوص الرياضية. أمّا النقاط الرئيسة التي نخالف فيها فهي:

  • نرقّم الأعداد الطبيعية N\N بدءًا من 00 (مع أنّ نصوصًا كثيرة أخرى، خاصّةً في علم الحاسوب، تفعل الشيء نفسه).

  • ونرقّم أيضًا المجموعة [n][n] بدءًا من 00، ومن ثمّ نعرّفها بأنّها {0,…,n−1}\{0,\ldots,n-1\}. وفي نصوص أخرى تُعرّف غالبًا بأنّها {1,…,n}\{1,\ldots, n \}. وعلى نحو مماثل، فإنّنا نرقّم سلاسلنا النصية بدءًا من 00، ومن ثمّ تُكتب السلسلة النصية x∈{0,1}nx\in \{0,1\}^n على هيئة x0x1⋯xn−1x_0x_1\cdots x_{n-1}.

  • إذا كان nn عددًا طبيعيًا فإنّ 1n1^n لا تساوي العدد 11، بل إنّها سلسلة نصية من nn واحدًا: 11⋯111\cdots 1 (أي سلسلة من nn من الرقم 1). وعلى نحو مماثل، فإنّ 0n0^n تشير إلى السلسلة النصية 00⋯000 \cdots 0 بطول nn.

  • الدوال الجزئية (partial) هي دوال ليست معرَّفة بالضرورة على كلّ المداخل. وحين نكتب f:A→Bf:A \rightarrow B فإنّ ذلك يعني أنّ ff دالة كليّة ما لم نُنوّه إلى خلاف ذلك. وحين نريد أن نؤكّد أنّ ff قد تكون دالة جزئية، فإنّنا سنكتب أحيانًا f:A→pBf: A \rightarrow_p B.

  • كما سنرى لاحقًا في المساق، فإنّنا سنصف مسائلنا الحوسبية غالبًا في إطار حساب دالةٍ منطقية (Boolean function) f:{0,1}∗→{0,1}f: \{0,1\}^* \rightarrow \{0,1\}. وبالمقابل، تصف كتبٌ دراسيةٌ أخرى المهمّة نفسها بأنّها الحكم على لغةٍ ما (deciding a language) L⊆{0,1}∗L \subseteq \{0,1\}^*. وهذان المنظوران متكافئان، لأنّ لكلّ مجموعة L⊆{0,1}∗L\subseteq \{0,1\}^* توجد دالة مقابلة FF بحيث F(x)=1F(x)=1 إذا وفقط إذا x∈Lx\in L. وحساب الدوال الجزئية يقابل المهمّة المعروفة في الأدبيات بأنّها حلّ مسألة وعدٍ (promise problem). ولأنّ ترميز اللغات شائع جدًّا في الكتب الدراسية الأخرى، فإنّنا سنُذكّر القارئ من حين لآخر بهذا التطابق.

  • نستعمل ⌈x⌉\ceil{x} و ⌊x⌋\floor{x} لمشغّلَي «السقف» (ceiling) و«الأرضية» (floor)، اللذين يقابلان «التقريب إلى الأعلى» أو «التقريب إلى الأسفل» لعدد إلى أقرب عدد صحيح. ونستعمل (xmod  y)(x \mod y) للدلالة على «باقي» قسمة xx على yy، أي أنّ (xmod  y)=x−y⌊x/y⌋(x \mod y) = x - y\floor{x/y}. وفي السياق الذي يُتوقّع فيه عدد صحيح، فإنّنا نُقرّب الكميات عادةً «بصمت» إلى عدد صحيح. مثلًا، إذا قلنا إنّ xx سلسلة نصية طولها n\sqrt{n}، فإنّ ذلك يعني أنّ xx طولها ⌈n ⌉\lceil \sqrt{n}\, \rceil. (ونُقرّب إلى الأعلى التزامًا بالاصطلاح، لكنّ في معظم هذه الحالات لن يُحدث الفرق إن قرّبنا إلى الأعلى أم إلى الأسفل.)

  • كما في معظم نصوص علم الحاسوب، فإنّنا نُعتمِد اللوغاريتم بالأساس 2. ولذلك فإنّ log⁡n\log n هي نفسها log⁡2n\log_2 n.

  • سنستعمل أيضًا التدوين f(n)=poly(n)f(n)=poly(n) اختصارًا لـ f(n)=nO(1)f(n)=n^{O(1)} (أي اختصارًا للقول إنّ هناك ثابتين a,ba,b بحيث f(n)≤a⋅nbf(n) \leq a\cdot n^b لكلّ nn كبير بما فيه الكفاية). وعلى نحو مماثل، سنستعمل f(n)=polylog(n)f(n)=polylog(n) اختصارًا لـ f(n)=poly(log⁡n)f(n)=poly(\log n) (أي اختصارًا للقول إنّ هناك ثابتين a,ba,b بحيث f(n)≤a⋅(log⁡n)bf(n) \leq a\cdot (\log n)^b لكلّ nn كبير بما فيه الكفاية).

  • كما هو شائع في الأدبيات الرياضية، فإنّنا نستعمل علامة النَّسْب (apostrophe) لإثراء مجموعتنا من المعرّفات. فعادةً إذا كان xx يشير إلى شيء ما، فإنّ x′x' و x′′x'' وغيرها تشير إلى أشياء أخرى من النوع نفسه.

  • ولتقليل «الحمل المعرفي» فإنّنا نستعمل كثيرًا ثوابت مستديرة مثل 10,100,100010,100,1000 في عبارات المبرهنات وفي أسئلة مجموعة التمارين. وحين ترى مثل هذا الثابت «المستدير»، فيمكنك عادةً أن تفترض أنّه لا أهمية خاصّة له وأنّه اختير عشوائيًّا. مثلًا، إن رأيت مبرهنة من الشكل «الخوارزمية AA تحتاج إلى 1000⋅n21000\cdot n^2 خطوة على الأكثر لحساب الدالة FF على مداخل طولها nn»، فمن المرجّح أنّ العدد 10001000 ثابت اعتباطي كبير بما فيه الكفاية، ويمكن إثبات المبرهنة نفسها بحدٍّ من الشكل c⋅n2c \cdot n^2 حيث cc ثابت أصغر من 10001000. وبالمثل، إذا طلبت منك مسألة إثبات أنّ كمية ما على الأقلّ n/100n/100، فمن المرجّح تمامًا أنّ الكمية في الحقيقة على الأقلّ n/dn/d حيث dd ثابت أصغر من 100100.

اصطلاحات أسماء المتغيّرات

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

---
caption: 'Conventions for identifiers in this book'
alignment: LL
table-width: 1/3
id: notationtable
---
*Identifier*	*Often denotes object of type*
$i$,$j$,$k$,$\ell$,$m$,$n$	Natural numbers (i.e., in $\mathbb{N} = \{0,1,2,\ldots \}$)
$\epsilon,\delta$	Small positive real numbers  (very close to $0$)
$x,y,z,w$	Typically strings in $\{0,1\}^*$ though sometimes numbers or other objects. We often identify an object with its representation as a string.
$G$	A _graph_. The set of $G$'s vertices is typically denoted by $V$. Often $V=[n]$. The set of $G$'s edges is typically denoted by $E$.
$S$	Set
$f,g,h$	Functions. We often (though not always) use lowercase identifiers for _finite functions_, which map  $\{0,1\}^n$ to $\{0,1\}^m$ (often $m=1$).
$F,G,H$	Infinite (unbounded input) functions mapping $\{0,1\}^*$ to $\{0,1\}^*$ or $\{0,1\}^*$ to $\{0,1\}^m$ for some $m$. Based on context, the identifiers $G,H$ are sometimes used to denote functions and sometimes graphs.
$A,B,C$	Boolean circuits
$M,N$	Turing machines
$P,Q$	Programs
$T$	A function mapping $\mathbb{N}$ to $\mathbb{N}$ that corresponds to a time bound.
$c$	A positive number (often an unspecified constant; e.g.,  $T(n)=O(n)$ corresponds to the existence of $c$ s.t. $T(n) \leq c \cdot n$ every $n>0$). We sometimes use $a,b$ in a similar way.
$\Sigma$	Finite set (often used as the _alphabet_ for a set of strings).

بعض العادات اللفظية (idioms)

تستعمل النصوص الرياضية في كثير من الأحيان اصطلاحات أو «عادات لفظية» (idioms) معيّنة.

ومن أمثلة هذه العادات التي نستعملها في هذا النص ما يلي:

  • «ليكن XX ...»، أو «ليشرِف XX إلى ...»، أو «ليكن X=…X= \ldots»:__ هذه كلّها طرائق مختلفة للقول إنّنا نُعرِّف الرمز XX ليشير إلى أيًّا كان التعبير الوارد في …\ldots. وحين يكون XX خاصّيةً (property) لأشياء ما، فقد نعرّف XX بأن نكتب شيئًا من قبيل «نقول إنّ …\ldots له الخاصّية XX إذا ...». ورغم أننا نحاول غالبًا تعريف المصطلحات قبل استعمالها، فإنّ جملة رياضية ما تكون أحيانًا أوضح إذا استعملنا مصطلحًا قبل تعريفه، وعندئذٍ نضيف «حيث XX هو ...» لتفسير كيفية تعريف XX في التعبير السابق.

  • الكمّاسات: تنطوي النصوص الرياضية على كمّاسات كثيرة مثل «لكلّ» و«يوجد». ونكتبها أحيانًا بالكلمات كما في «لكلّ i∈Ni\in\N» أو «يوجد x∈{0,1}∗x\in \{0,1\}^*»، وأحيانًا نستعمل الرموز الصوريّة ∀\forall و ∃\exists. ومن المهمّ أن تتعقّب أيّ متغيّر يُكمَّس وبأيّ طريقة تتبع الاعتماديات (dependencies) بين المتغيّرات. مثلًا، تعني قطعة الجملة مثل «لكلّ k>0k >0 يوجد nn» أنّ nn يمكن اختياره بطريقة تعتمد على kk. وترتيب الكمّاسات مهمّ. مثلًا، العبارة التالية صحيحة: «لكلّ عدد طبيعي k>1k>1 يوجد عدد أولي nn بحيث إنّ nn يقسم kk.» وبالمقابل، العبارة التالية خاطئة: «يوجد عدد أولي nn بحيث إنّ لكلّ عدد طبيعي k>1k>1 يقسم nn العددَ kk.»

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

  • (i.e.), (e.g.): تميل النصوص الرياضية إلى أن تحتوي على عدد كبير من هذه التعبيرات. فنستعمل XX (i.e., YY) في الحالات التي تكون فيها YY مكافئةً لـ XX، ونستعمل XX (e.g., YY) في الحالات التي يكون فيها YY مثالًا على XX (مثلًا، يمكن استعمال عبارات مثل «عدد طبيعي (أي، عدد صحيح غير سالب)» أو «عدد طبيعي (مثالًا، 77)»).

  • «إذن»، «لذلك»، «نحصل على أنّ»: وهذا يعني أنّ الجملة التالية تنبع من الجملة السابقة، مثل «الرسم البياني GG ذو nn رأسًا متّصل. لذلك يحتوي على n−1n-1 ضلعًا على الأقلّ.» ونستعمل أحيانًا «بالفعل» للدلالة على أنّ النص التالي يبرّر المزاعم الواردة في الجملة السابقة، مثل «للرسم البياني GG ذو nn رأسًا n−1n-1 ضلعًا على الأقلّ. بالفعل، هذا يتبع لأنّ GG متّصل.»

  • الثوابت: في علم الحاسوب، نهتمّ عادةً بكيفية تغيّر (scales) استهلاك خوارزمياتنا للموارد (مثل زمن التنفيذ) مع كميات معيّنة (مثل طول الدخل). ونشير إلى الكميات التي لا تعتمد على طول الدخل بأنّها ثوابت (constants)، ولذلك نستعمل كثيرًا عبارات مثل «يوجد ثابت c>0c>0 بحيث إنّ لكلّ n∈Nn\in \N تعمل الخوارزمية AA في c⋅n2c \cdot n^2 خطوة على الأكثر على مداخل طولها nn.» واللفظ «ثابت» بالنسبة إلى cc ليس ضروريًا تمامًا، لكنّه يُضاف للتأكيد على أنّ cc هنا عدد ثابت مستقلّ عن nn. والواقع أنّنا أحيانًا، لتقليل الحمل المعرفي، نستبدل cc ببساطة بعدد مستدير كبير بما فيه الكفاية مثل 1010 أو 100100 أو 10001000، أو نستعمل ترميز OO ونكتب «الخوارزمية AA تعمل في زمن O(n2)O(n^2).».

خلاصة

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

التمارين

تمرين — التعبيرات المنطقية

a. اكتب تعبيرًا منطقيًّا φ(x)\varphi(x) يتضمّن المتغيّرات x0,x1,x2x_0,x_1,x_2 والمشغّلات ∧\wedge (AND) و ∨\vee (OR) و ¬\neg (NOT)، بحيث يكون φ(x)\varphi(x) صادقًا إذا كانت أغلبية المداخل صادقة (True).

b. اكتب تعبيرًا منطقيًّا φ(x)\varphi(x) يتضمّن المتغيّرات x0,x1,x2x_0,x_1,x_2 والمشغّلات ∧\wedge (AND) و ∨\vee (OR) و ¬\neg (NOT)، بحيث يكون φ(x)\varphi(x) صادقًا إذا كان المجموع ∑i=02xi\sum_{i=0}^{2} x_i (مع اعتبار «صادق» =1=1 و«خاطئ» =0=0) فرديًّا (odd).

تمرين — الكمّاسات

استعمل الكمّاسات المنطقية ∀\forall (لكلّ) و ∃\exists (يوجد)، وكذلك ∧,∨,¬\wedge,\vee,\neg والعمليات الحسابية +,×,=,>,<+,\times,=,>,< لكتابة ما يلي:

a. تعبير φ(n,k)\varphi(n,k) بحيث إنّ لكلّ الأعداد الطبيعية n,kn,k، يكون φ(n,k)\varphi(n,k) صادقًا إذا وفقط إذا كان kk يقسم nn.

b. تعبير φ(n)\varphi(n) بحيث إنّ لكلّ عدد طبيعي nn، يكون φ(n)\varphi(n) صادقًا إذا وفقط إذا كان nn قوةً للعدد ثلاثة.

تمرين

صِف العبارة التالية بالكلمات الإنجليزية: ∀n∈N∃p>n∀a,b∈N(a×b≠p)∨(a=1)\forall_{n\in\N} \exists_{p>n} \forall{a,b \in \N} (a\times b \neq p) \vee (a=1).

تمرين — تدوين بناء المجموعات

صِف المجموعات التالية بالكلمات:

a. S={x∈{0,1}100:∀i∈{0,…,99}xi=x99−i}S = \{ x\in \{0,1\}^{100} : \forall_{i\in \{0,\ldots, 99\}} x_i = x_{99-i} \}

b. T={x∈{0,1}∗:∀i,j∈{2,…,∣x∣−1}i⋅j≠∣x∣}T = \{ x\in \{0,1\}^* : \forall_{i,j \in \{2,\ldots,|x|-1 \} } i\cdot j \neq |x| \}

تمرين — وجود دوالّ أحادية الحقن

لكلّ زوج من المجموعات الآتية (S,T)(S,T)، أثبت أو أبطِل العبارة التالية: هناك دالة أحادية الحقن ff تُسقط SS على TT.

a. ليكن n>10n>10، و S={0,1}nS = \{0,1\}^n و T=[n]×[n]×[n]T= [n] \times [n] \times [n].

b. ليكن n>10n>10، و SS هي مجموعة كلّ الدوال التي تُسقط {0,1}n\{0,1\}^n على {0,1}\{0,1\}. و T={0,1}n3T = \{0,1\}^{n^3}.

c. ليكن n>100n>100، و S={k∈[n]  ∣  k is prime}S = \{k \in [n] \;|\; k \text{ is prime} \}، و T={0,1}⌈log⁡n−1⌉T = \{0,1\}^{\ceil{\log n -1}}.

تمرين — مبدأ الاحتواء والطرد

a. لتكن A,BA,B مجموعتَين منتهيتين. أثبت أنّ ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A\cup B| = |A|+|B|-|A\cap B|.

b. لتكن A0,…,Ak−1A_0,\ldots,A_{k-1} مجموعات منتهية. أثبت أنّ ∣A0∪⋯∪Ak−1∣≥∑i=0k−1∣Ai∣−∑0≤i<j<k∣Ai∩Aj∣|A_0 \cup \cdots \cup A_{k-1}| \geq \sum_{i=0}^{k-1} |A_i| - \sum_{0 \leq i < j < k} |A_i \cap A_j|.

c. لتكن A0,…,Ak−1A_0,\ldots,A_{k-1} مجموعات جزئية منتهية من {1,…,n}\{1,\ldots, n\}، بحيث ∣Ai∣=m|A_i|=m لكلّ i∈[k]i\in [k]. أثبت أنّه إذا كان k>100nk>100n، فإنّ هناك مجموعتَين متمايزتَين Ai,AjA_i,A_j بحيث ∣Ai∩Aj∣≥m2/(10n)|A_i \cap A_j| \geq m^2/(10n)$.

تمرين

أثبت أنّه إذا كانت S,TS,T منتهيتين وF:S→TF:S \rightarrow T حقنة، فإنّ ∣S∣≤∣T∣|S| \leq |T|.

تمرين

أثبت أنّه إذا كانت S,TS,T منتهيتين وF:S→TF:S \rightarrow T مغطّية، فإنّ ∣S∣≥∣T∣|S| \geq |T|.

تمرين

أثبت أنّه لكلّ S,TS,T منتهيتين، هناك (∣T∣+1)∣S∣(|T|+1)^{|S|} دالة جزئية من SS إلى TT.

تمرين

لنفترض أنّ {Sn}n∈N\{ S_n \}_{n\in \N} متتالية بحيث S0≤10S_0 \leq 10، وأنّ n>1n>1 فإنّ Sn≤5S⌊n5⌋+2nS_n \leq 5 S_{\lfloor \tfrac{n}{5} \rfloor} + 2n. أثبت بالحَث أنّ Sn≤100nlog⁡nS_n \leq 100 n \log n لكلّ nn.

تمرين

أثبت أنّه لكلّ رسم بياني غير موجّه GG ذو 100100 رأس، إذا كانت درجة كلّ رأس لا تتجاوز 44، فإنّ هناك مجموعة جزئية SS من 2020 رأسًا على الأقلّ بحيث لا يكون رأسان في SS متجاورَين.

تمرين — ترميز OO

لكلّ زوج من الدوالّ F,GF,G أدناه، حدّد أيّ العلاقات التالية تتحقّق: F=O(G)F=O(G)، أو F=Ω(G)F=\Omega(G)، أو F=o(G)F=o(G)، أو F=ω(G)F=\omega(G).

a. F(n)=nF(n)=n، G(n)=100nG(n)=100n.

b. F(n)=nF(n)=n، G(n)=nG(n)=\sqrt{n}.

c. F(n)=nlog⁡nF(n)=n\log n، G(n)=2(log⁡(n))2G(n)=2^{(\log (n))^2}.

d. F(n)=nF(n)=\sqrt{n}، G(n)=2log⁡nG(n)=2^{\sqrt{\log n}}.

e. F(n)=(n⌈0.2n⌉)F(n) = \binom{n}{\ceil{0.2 n}}، G(n)=20.1nG(n) = 2^{0.1 n} (حيث (nk)\binom{n}{k} هو عدد المجموعات الجزئية ذات الحجم kk من مجموعة حجمها nn). انظر الحاشية للتلميح.[7]

تمرين

اذكر مثالًا لزوج من الدوالّ F,G:N→NF,G:\N \rightarrow \N بحيث لا تتحقّق ولا العلاقة F=O(G)F=O(G) ولا العلاقة G=O(F)G=O(F).

تمرين

أثبت أنّه لكلّ رسم بياني غير موجّه GG على nn رؤوس، إذا كان لـ GG nn أضلاع على الأقلّ فإنّ GG يحتوي على دورة.

تمرين

أثبت أنّه لكلّ رسم بياني غير موجّه GG ذو 10001000 رأس، إذا كانت درجة كلّ رأس لا تتجاوز 44، فإنّ هناك مجموعة جزئية SS من 200200 رأس على الأقلّ بحيث لا يكون رأسان في SS متجاورَين.

ملاحظات مرجعية

يشير العنوان «اعتذار الرياضياتي» إلى كتاب هاردي الكلاسيكي [@Hardy41]. وحتى حين يكون هاردي مخطئًا، فإنّ قراءته تستحقّ القراءة إلى حدٍّ بعيد.

هناك مصادر كثيرة على الإنترنت للخلفية الرياضية التي يحتاجها هذا الكتاب. وبخاصة، فإنّ ملاحظات محاضرات MIT 6.042 «الرياضيات لعلوم الحاسوب» [@LehmanLeightonMeyer] وافية جدًّا، ومقاطع الفيديو والواجبات الخاصّة بهذا المساق متاحة على الإنترنت. وبالمثل، فإنّ مساق Berkeley CS 70: «الرياضيات المتقطّعة ونظرية الاحتمال» لديه ملاحظات محاضرات وافية على الإنترنت.

ومن المصادر الأخرى للرياضيات المتقطّعة كتاب Rosen [@Rosen19discrete] وكتاب Jim Apsnes الإلكتروني [@AspensDiscreteMath]. ويقدّم Lewis وZax [@LewisZax19]، وكذلك الكتاب الإلكتروني لـFleck [@Fleck]، عرضًا ألطف لكثير من المادة نفسها. ويُعدّ Solow [@Solow14] مقدّمة جيّدة لقراءة البراهين وكتابتها. ويقدّم Kun [@Kun18] مقدّمة في الرياضيات موجّهة إلى القرّاء ذوي الخلفيات البرمجية. ولدى Stanford مساق CS 103 مجموعة ممتازة من النشرات عن تقنيات البراهين الرياضية والرياضيات المتقطّعة.

ابتكر الرياضياتيّ Sylvester عام 1878 لفظَ رسم بياني بالمعنى الوارد في تعريف — الرسوم البيانية غير الموجّهة، تشبيهًا بالرسوم الكيميائية المستعملة لتصوير الجزيئات. وهناك خلط مؤسف بين هذا المصطلح والاستعمال الأكثر شيوعًا للفظ «رسم بياني» بمعنى رسم البيانات، وبخاصة رسم دالة ما f(x)f(x) بدلالة xx. وإحدى طرائق ربط هذين المفهومين هي التمييز بين كلّ دالة f:A→Bf:A \rightarrow B وبين الرسم البياني الموجّه GfG_f على مجموعة الرؤوس V=A∪BV= A \cup B بحيث إنّ GfG_f يحتوي الضلع x→f(x)x \rightarrow f(x) لكلّ x∈Ax\in A. وفي الرسم البياني GfG_f المبنيّ بهذه الطريقة، يكون لكلّ رأس في AA درجة خروج تساوي واحدًا. وإذا كانت الدالة ff أحادية الحقن فإنّ لكلّ رأس في BB تكون درجة الدخول على الأكثر واحدًا. وإذا كانت الدالة ff مغطّية فإنّ لكلّ رأس في BB تكون درجة الدخول على الأقلّ واحدًا. وإذا كانت ff تقابلًا فإنّ لكلّ رأس في BB تكون درجة الدخول مساوية تمامًا للواحد.

اقتباس كارل بوميرانس مأخوذ من الصفحة الرئيسية لـ Doron Zeilberger.


  1. الحرف Z يرمز إلى الكلمة الألمانية «Zahlen» التي تعني «الأعداد». ↩︎

  2. لعددين طبيعيين xx وaa، فإنّ xmod  ax \mod a (اختصارًا لـ"modulo") تدلّ على باقي (remainder) قسمة xx على aa. أي أنّها العدد rr في {0,…,a−1}\{0,\ldots,a-1\} بحيث x=ak+rx = ak +r لأجل عدد صحيح kk. ونستعمل أحيانًا أيضًا التدوين x=y  (mod  a)x = y\; (\mod a) للدلالة على أنّ xmod  ax \mod a تساوي ymod  ay \mod a. ↩︎

  3. من الممكن، وأحيانًا مفيد، أن نفكّر في الرسم البياني غير الموجّه على أنه الحالة الخاصّة من الرسم البياني الموجّه التي تملك خاصّيةً خاصة، هي أنّه لكلّ زوج u,vu,v إمّا كان الضلعان (u,v)(u,v) و(v,u)(v,u) حاضرين معًا أو لم يكن أيٌّ منهما حاضرًا. غير أنّ هناك فرقًا جوهريًا في كثير من السياقات بين الرسوم البيانية غير الموجّهة والموجّهة، ولذلك فإنّ الأفضل عادةً التفكير فيها بوصفها فئتين منفصلتين. ↩︎

  4. في هذا الكتاب نضع المتغيّر المربوط بالكمّاس في حاشية سفلية، ولذلك نكتب ∀x∈SP(x)\forall_{x\in S}P(x). أمّا نصوصٌ كثيرة أخرى فلا تستعمل تدوين الحاشية هذا، فتكتب العبارة نفسها على هيئة ∀x∈S,  P(x)\forall x\in S, \; P(x). ↩︎

  5. اختصار QED هو من عبارة "quod erat demonstratum" اللاتينية، أي «ما كان ينبغي إثباته» أو «ذات الشيء الذي كان مطلوبًا بيانه». ↩︎

  6. استعمال n=0n=0 كحالة أساس صحيح منطقيًّا، لكنّه قد يكون مربكًا. إن وجدتَ حالة n=0n=0 البديهية مربكة، فيمكنك دائمًا أن تتحقّق مباشرةً من العبارة عند n=1n=1، ثمّ تستعمل n=0n=0 و n=1n=1 معًا كحالتَي أساس. ↩︎

  7. إحدى طرائق ذلك هي استعمال تقريب ستيرلين لدالة مضروب المعامل. ↩︎