בקצרה
- מרחיבים את אוסף השפות שאנחנו יודעים שהן ב-NP בשתי בעיות גרפים: CLIQUE (קיימת קליקה בגודל ?) ו-IS = Independent Set (קיימת קבוצה בלתי תלויה בגודל ?). כל אחת מוכחת בדרך אחרת — האחת דרך מכונה אי-דטרמיניסטית, השנייה דרך verifier — כך שנראה את שתי ההגדרות השקולות של NP בפעולה.
- מוכיחים שמותר מכאן ואילך לכתוב פסאודו-קוד במקום מכונת טיורינג: זמן על מכונת טיורינג שקול פולינומית לזמן על מכונת RAM, והרזולוציה שמעניינת אותנו ("פולינומי / לא פולינומי") גסה מספיק כדי לא להבחין בהפרש.
- מגדירים את הכלי המרכזי של כל שארית הקורס: רדוקציה בזמן פולינומי . הכיוון קריטי — אומר ש- היא לפחות קשה כמו , כי אלגוריתם ל- פותר גם את .
- מוכיחים (ובאותה רדוקציה גם ) על ידי מעבר לגרף המשלים, כולל הנימוק למה ניסיונות נאיביים יותר — למחוק את כל הקשתות או להוסיף את כל הקשתות — נכשלים.
- מגדירים NP-קשה ("כל שפה ב-NP נרדקת אליי") ו-NP-שלמה ("NP-קשה וגם שייכת ל-NP"). זהו בדיוק ההבדל בין שני המושגים, והוא נבדק במבחנים.
- מוכיחים את משפט ההעברה: אם היא NP-קשה ו- אז גם היא NP-קשה. זהו המשפט שהופך את החיים לאפשריים — בלעדיו כל הוכחת NP-קושי הייתה מחייבת לטפל בכל שפה ב-NP מחדש.
רקע ותלויות
השיעור הזה יושב כולו על ההגדרות שנבנו בשיעורים 4–6, ומשתמש בהן בלי לחזור עליהן. לכן נציג אותן כאן במלואן.
מחלקות הזמן (ראו שיעור 4). לכל פונקציה , המחלקה היא אוסף השפות שניתן להכריע במכונת טיורינג דטרמיניסטית בזמן , ומכאן
NP — ההגדרה הבסיסית (ראו שיעור 6). באופן מקביל, היא אוסף השפות שמכונה אי-דטרמיניסטית מכריעה בזמן , ו- "מכריעה" עבור מכונה אי-דטרמיניסטית פירושו: אם ורק אם קיימת ריצה של על שמקבלת; אם אז כל הריצות דוחות; וכל ריצה אפשרית עוצרת, ובזמן פולינומי באורך הקלט.
NP — ההגדרה השקולה עם verifier (ראו שיעור 6). אם ורק אם קיימת מכונת טיורינג דטרמיניסטית שרצה בזמן פולינומי, וקיים פולינום , כך שלכל : המכונה נקראת מוודא בזמן פולינומי (polynomial-time verifier) עבור . שימו לב לניסוח המדויק: אינה מכריעה את — היא מכריעה שפה של זוגות. שני התנאים שהיא צריכה לקיים הם "לקלטים בקבוצה יש עדות קצרה שמשכנעת אותה" ו"קלטים שאינם בקבוצה — אי אפשר לרמות אותה עליהם". שתי ההגדרות הוכחו שקולות בשיעור 6.
רדוקציות מחישוביות. בחישוביות אמרנו ש- נרדקת ל- אם קיימת פונקציה חשיבה־מלאה כך ש-; שקול לכך, קיימת מכונת טיורינג שעוצרת על כל קלט ומקיימת את התכונה הזו. גם ראינו שם ש- ו- סגורות כלפי מטה תחת רדוקציות, ושהיחס טרנזיטיבי (ההוכחה: שרשור מכונות / הרכבת פונקציות). כל מה שנעשה כאן הוא להוסיף לדרישה הסמנטית הזו דרישת יעילות.
מודל החישוב — למה מותר לעבור לפסאודו-קוד. ניתן להוכיח כי הזמן על מכונת טיורינג שקול פולינומית לזמן על מכונת RAM (Random Access Memory) — המודל שבו מותר לגשת ישירות לתא בזיכרון בלי לצעוד אליו, כלומר בדיוק המודל שבו נכתב פסאודו-קוד בקורסי מבני נתונים ואלגוריתמים. בחישוביות עניינה אותנו שקילות סמנטית ("מה אפשר לחשב"); בסיבוכיות אנחנו מוסיפים על הסמנטיקה גם את היעילות, ואומרים שהמודלים שקולים עד כדי פולינום. מכאן:
כל עוד הרזולוציה שמעניינת אותנו היא "האם הסיבוכיות היא עבור כלשהו", כלומר "פולינומי או לא פולינומי", אפשר לעבוד בפסאודו-קוד.
אם פתרתי בעיה בזמן פולינומי בפסאודו-קוד, אני יכול לפתור אותה בזמן פולינומי גם במכונת טיורינג. ייתכן שהפולינום יגדל — אבל הפולינום עצמו לא מעניין אותנו, רק היותו פולינום. המסננת שדרכה אנחנו עובדים גסה מאוד, ולכן אפשר לעבוד באיזה מודל שנוח. מכאן ואילך רוב הקורס ייכתב בשפה של אלגוריתמים, לא של מכונות.
מוסכמה על גרפים. מכאן ואילך "גרף" פירושו תמיד גרף פשוט ולא מכוון, אלא אם נאמר אחרת. גרף נכתב , וקשת בין ל- נסמן . כשמדובר בקלט לבעיית הכרעה, הוא כמובן קידוד של הגרף; לא נעסוק בקידוד עצמו, רק נדרוש שיהיה סביר (כלומר שהגודל שלו יהיה פולינומי במספר הקדקודים והקשתות).
הגדרות
הגדרה 1: קליקה
יהי גרף. קבוצה נקראת קליקה (clique) כאשר לכל שונים מתקיים .
אינטואיציה. קליקה היא קבוצת קדקודים ש"כולם מחוברים לכולם" — תת-גרף שלם. חשבו על קבוצת אנשים ברשת חברתית שכל שניים בה מכירים זה את זה.
מופע. בגרף עם ו-, הקבוצה היא קליקה (בגודל 2), וכך גם כל קשת בודדת. הקבוצה היא קליקה טריוויאלית, וגם .
אי-מופע. באותו גרף, אינה קליקה: . שימו לב שדי בזוג אחד חסר כדי להרוס את התכונה.
הגדרה 2: השפה CLIQUE
כלומר, הקלט הוא זוג ואנחנו צריכים להכריע האם בגרף קיימת קליקה בגודל .
מופע. בגרף שהודגם בשיעור — משולש שאליו מחוברים עוד קדקודים — הזוג שייך ל-CLIQUE, כי שלושת קדקודי המשולש הם קליקה בגודל 3.
אי-מופע. עבור אותו גרף בדיוק, : כל ארבעה קדקודים שנבחר — יימצאו בהם שניים שאין ביניהם קשת.
הגדרה 3: קבוצה בלתי תלויה
יהי גרף ותהי . הקבוצה נקראת בלתי תלויה (independent set) כאשר לכל שונים מתקיים .
אינטואיציה. זו קבוצת קדקודים שאין ביניהם אף קשת. חשבו על קבוצת משימות שאף שתיים מהן אינן מתנגשות.
הערה: זה לא בדיוק "ההפך מקליקה", והלקטור עצר על כך במפורש. ההגדרה של קליקה היא "לכל שני איברים יש קשת"; השלילה הלוגית שלה היא "קיימים שניים שאין ביניהם קשת". לעומת זאת ההגדרה כאן היא "לכל שניים אין קשת" — טענה חזקה בהרבה. אי אפשר לשלול "לכל" ולקבל "לכל". הקשר האמיתי בין שני המושגים אינו שלילה אלא מעבר לגרף המשלים, וזה בדיוק תוכן משפט 3.
מופע. ב- שלמעלה, בלתי תלויה: .
אי-מופע. אינה בלתי תלויה, כי .
הגדרה 4: השפה IS
השפה מזכירה מאוד את CLIQUE — רק שבמקום "יש קשת" נדרש "אין קשת".
הגדרה 5: רדוקציה בזמן פולינומי
תהיינה שפות. רדוקציה בזמן פולינומי מ- ל- היא מכונת טיורינג (דטרמיניסטית, חד-סרטית סטנדרטית) המקיימת:
- רצה בזמן פולינומי בגודל הקלט;
- לכל קלט :
- אם אז , וגם
- אם אז .
אם קיימת רדוקציה כזו נסמן .
אינטואיציה, וזה החלק שחייבים לא להתבלבל בו. תנאי 2 שקול ל- — הרדוקציה ממירה קלטים של לקלטים של תוך שימור התשובה. המשמעות המעשית: אם יש בידי מכונה שמכריעה את , אני יכול להכריע את — בהינתן אריץ את הרדוקציה (זמן פולינומי), אקבל , ואשאל את המכריע של . לכן
אם , אז "אינה קשה מ-" עד כדי פולינום.
כלומר היא הבעיה הקשה יותר, ולא להפך. הסימון נבחר בדיוק כדי לקודד את זה, וה- הקטנה מציינת שההמרה עצמה חסומה בפולינום. זו נקודת הכשל הנפוצה ביותר בשיעור הזה ובכל מה שבא אחריו.
מה רדוקציה איננה. רדוקציה אינה פותרת אף אחת מהבעיות. בזמן בניית הרדוקציה איני יודע — ואיני יכול לדעת בזמן פולינומי — האם הקלט שקיבלתי שייך ל- או לא. ההמרה חייבת לעבוד "בעיוורון". רק בשלב ההוכחה, שהוא לא-אלגוריתמי, אני מרשה לעצמי להניח "נניח , אז קיימת...".
הבדל מחישוביות. בחישוביות דרשנו רק את תנאי 2 (הסמנטיקה); זמן הריצה לא עניין אותנו כלל, רק שהמכונה תעצור. כאן אנחנו מוסיפים על הסמנטיקה גם את היעילות.
הגדרה 6: NP-קשה
תהי שפה. נקראת NP-קשה (NP-hard) כאשר לכל שפה מתקיים .
אינטואיציה. קשה לפחות כמו כל בעיה ב-NP: לו ידענו לפתור את בזמן פולינומי, היינו יודעים לפתור בזמן פולינומי כל בעיה ב-NP, ומקבלים . שימו לב לכיוון: הרדוקציות מגיעות מכל שפה ב-NP אל .
הערה על ההגדרה. עצמה אינה נדרשת להיות ב-NP. שפה NP-קשה יכולה להיות קשה הרבה יותר — למשל בלתי כריעה לחלוטין.
הגדרה 7: NP-שלמה
תהי שפה. נקראת NP-שלמה (NP-complete) כאשר:
- היא NP-קשה, וגם
- .
ההבדל בין השתיים בשורה אחת. NP-קשה = "לפחות קשה כמו כל דבר ב-NP". NP-שלמה = NP-קשה ובנוסף שייכת בעצמה ל-NP, כלומר היא הבעיה הקשה ביותר בתוך NP. תנאי (2) הוא שהופך את לנציגה של המחלקה ולא רק לחסם עליון עליה.
הערה: מי שלמד חישוביות בקורס שבו לא ניתן שם למושג "-קושי" — למד בדיוק את התכונה הזו, פשוט בלי לתת לה שם: במקום להגדיר "-קשה" בנפרד, נכתב תנאי הרדוקציה ישירות בתוך הגדרת ה--שלמות. אין כאן שום הבדל מהותי, רק פירוק ההגדרה לשני מרכיבים.
משפטים והוכחות
משפט 1:
ההוכחה מתבצעת לפי ההגדרה הבסיסית של NP, באמצעות מכונה אי-דטרמיניסטית. כפי שהוסבר ברקע, מותר לנו לתאר אלגוריתם ולא מכונה.
האלגוריתם. על קלט , כאשר גרף ו-:
- באופן אי-דטרמיניסטי בחר קבוצה כך ש-.
- לכל שונים: אם — דחה.
- קבל.
שימו לב שרק שלב 1 אי-דטרמיניסטי; שלבים 2–3 הם לולאה דטרמיניסטית לגמרי. מכונה אי-דטרמיניסטית רשאית להכיל חלקים דטרמיניסטיים, וגם רשאית לפזר את הבחירות האי-דטרמיניסטיות שלה לאורך הריצה ולא לרכז את כולן בהתחלה.
נכונות — כיוון ראשון. יהי גרף ויהי . נניח . אזי, לפי ההגדרה, קיימת כך ש- וגם קליקה ב-. חשוב לתת שם לאובייקט הזה כדי שנוכל להתייחס אליו בהמשך. כעת, קיימת עבור האלגוריתם ריצה אפשרית שבה הוא בוחר בשלב 1 בדיוק את . בריצה זו, לכל שונים מתקיים (כי קליקה), ולכן התנאי בשלב 2 לעולם אינו מתקיים, האלגוריתם אינו דוחה, ומגיע לשלב 3 ומקבל. לכן קיימת ריצה מקבלת.
נכונות — כיוון שני. נניח . את המשמעות של זה יש לנסח על הזוג לפני שמדברים על האלגוריתם: כעת: בכל ריצה אפשרית של האלגוריתם הוא בוחר בשלב 1 קבוצה בגודל ; לפי הנוסח שלמעלה אינה קליקה ב-, כלומר קיימים שונים עם ; כשהלולאה בשלב 2 תגיע לזוג הזה היא תדחה. לכן כל ריצה אפשרית דוחה.
הערה: בהרצאה נאמר בקצרה "לכל ריצה אפשרית לא יימצא מתאים", והמרצה עצר את הכיתה ודרש קודם את האפיון של הזוג עצמו. זה לא קפדנות לשמה: אם מדלגים על השלב הזה, קל להחליק בין "האלגוריתם לא מצא" (טענה על האלגוריתם) לבין "לא קיים" (טענה על הקלט), וזו בדיוק השגיאה שהופכת הוכחות מסוג זה למעגליות.
ניתוח זמן ריצה. על קלט :
- בחירת דורשת צעדים: במקרה הגרוע צריך לעבור על כל קדקוד ולהחליט אם הוא בקבוצה או לא.
- הלולאה בשלב 2 עוברת על כל הזוגות מתוך , כלומר זוגות.
- בלי הגבלת הכלליות : אם אפשר לדחות מיד (אין קדקודים). לכן .
סך הכול , ובפרט פולינומי בגודל הקלט. לכן .
הערה על החסם — נקודה עדינה שעלתה בשתי המסירות. המספר מקודד בבינארית ותופס ביטים. לכן אלגוריתם שעושה צעדים עושה מספר צעדים מעריכי בגודל הקידוד של ! אם היה מגיע לבדו כקלט, שום דבר כאן לא היה פולינומי. מה שמציל אותנו הוא שלצד מגיע גם הגרף: אחרי הצמצום , כל חסם ב- הופך לחסם ב-, ו- הוא כן לינארי בגודל הקידוד של הקלט. במילים אחרות — "הגרף משלם את המחיר של ". בכל ניתוח זמן ריצה של בעיות מהסוג הזה חייבים לבטא את הכול כפונקציה של גודל הקלט, ולא של הפרמטרים המספריים שבתוכו.
הערה על עצירה: בשיעור נשאל אם לא היינו צריכים להוכיח בנפרד שהאלגוריתם עוצר בכל ריצה. המרצה תחילה הסכים, ובהמשך חזר בו והבהיר: מאחר שניתחנו את זמן הריצה לכל ריצה אפשרית והראינו שהוא חסום בפולינום, העצירה נובעת מכך ואין צורך בטיעון נפרד.
משפט 2:
הפעם נוכיח דרך ההגדרה השקולה, עם verifier. אפשר היה כמובן להעתיק את הוכחת משפט 1 ולהחליף בשלב 2 את התנאי ב-; אנחנו בוחרים בדרך השנייה כדי לתרגל את שתי ההגדרות.
המוודא. על קלט עם גרף, , ועדות :
- ודא ש- (אחרת דחה).
- לכל שונים: אם — דחה.
- קבל.
האלגוריתם דטרמיניסטי לחלוטין. אין בו שום בחירה: הקבוצה מגיעה מבחוץ. זהו בדיוק ההבדל בין שתי ההגדרות — האם אני עושה את הבחירה באופן אי-דטרמיניסטי, או שמישהו חיצוני (שיש לו "כוחות על") עושה אותה ומגיש לי את התוצאה, ואני רק מוודא. אם קיימת בחירה נכונה, אותו מישהו יבחר נכון.
נכונות. נראה שלכל גרף ולכל :
() נניח . אזי קיימת כך ש- ו- בלתי תלויה ב-. את ניתן לקודד במחרוזת של ביטים — ביט לכל קדקוד, "בפנים / בחוץ" — וזה פולינומי (ואף לינארי) בגודל הקלט. על העדות הזו האלגוריתם עובר את שלב 1 (הגודל נכון), ואינו דוחה בשלב 2 (כי לכל שני קדקודים שונים ב- אין קשת), ולכן מקבל.
() נראה את הניגוד: נניח . אז לכל , אם אז אינה בלתי תלויה ב-, כלומר קיימים בה שונים עם , והאלגוריתם דוחה בשלב 2. ואם האלגוריתם דוחה כבר בשלב 1. לכן לכל עדות כלשהי האלגוריתם דוחה, ובפרט אין עדות מקבלת.
הערה — למה בכלל טרחנו לומר "פולינומי בגודל הקלט" על העדות? זו לא פדנטיות. תנאי אורך העדות הוא חלק בלתי נפרד מהגדרת ה-verifier, והוא מה שמונע רמאות. דוגמה נגדית שניתנה בשיעור: אפשר לבנות "מוודא" ל-SAT שמקבל נוסחה יחד עם טבלת האמת המלאה שלה, ופשוט קורא את התשובה מהטבלה. המוודא הזה אכן מוודא נכון — אבל טבלת האמת היא מעריכית בגודל הנוסחה, ולכן הבנייה חסרת ערך ואינה מוכיחה . הדרישה "עדות באורך " היא בדיוק מה שפוסל אותה. אצלנו העדות היא ביטים בלבד — לינארי — ולכן הכול תקין.
ניתוח זמן ריצה. על קלט :
- הבדיקה דורשת צעדים (פשוט ספירת האיברים).
- הלולאה דורשת צעדים, שוב לפי .
סך הכול — פולינומי. לכן .
משפט 3:
כיוון הטענה. אנחנו טוענים שאלגוריתם ל-CLIQUE פותר גם את IS. איננו טוענים דבר על הקושי של אף אחת מהן בפני עצמה, ואיננו מכריעים כאן אף אחת מהן.
איך מגיעים לרדוקציה — הניסיונות שנכשלו. הקלט של IS הוא זוג , והפלט צריך להיות גם הוא זוג "גרף ומספר", כי זה הפורמט של קלטי CLIQUE. השאלה היא איזה גרף.
- הצעה ראשונה בכיתה: "נמחק את קשתות הקליקה". נפסלה מיד — אני לא יודע למצוא קליקה. כל העניין הוא שאיני יודע לפתור את הבעיה; אם הייתי יודע, לא הייתי צריך רדוקציה. (אותה מלכודת הופיעה בחישוביות: ברדוקציה מ- ל- לא יכולנו לבדוק אם הקלט ב-; היינו צריכים להעביר את התכונה בלי לדעת.)
- הצעה שנייה: "נמחק את כל הקשתות מהגרף". אז הפלט לעולם אינו ב-CLIQUE (עבור ) — לא משנה מה היה הקלט. זה הורס את כיוון ה"אם".
- ההצעה המשלימה: "נוסיף את כל הקשתות". אז הפלט תמיד ב-CLIQUE, ללא קשר לקלט. זה הורס את הכיוון השני.
המסקנה שהוציא מכך המרצה היא הלב של השיעור: הרדוקציה חייבת לקיים אם ורק אם, ולכן כל פעולה שמייצרת פלט קבוע-מראש מקלקלת אחד הכיוונים. צריך פעולה שמשמרת את המבנה — לא מוסיפה הכול ולא מוחקת הכול, אלא מחליפה: איפה שהייתה קשת נוריד, ואיפה שלא הייתה נוסיף. זהו הגרף המשלים.
הרדוקציה. על קלט כאשר גרף ו-:
- בנה את הגרף המשלים של , כאשר
- החזר .
נשאר ללא שינוי.
ניתוח זמן ריצה. על קלט : בניית הגרף המשלים דורשת צעדים — עוברים על כל זוג קדקודים (יש כאלה), בודקים אם הקשת קיימת ומכניסים ל- בהתאם. סך הכול , ובפרט פולינומי. (בהחלט לא ניסינו להיות יעילים; לצורך הרדוקציה מספיק "פולינומי".)
נכונות — כיוון ראשון: .
יהי גרף ויהי . נניח . אזי קיימת כך ש- וגם בלתי תלויה ב-.
נתבונן באותה בתוך (מותר — לשני הגרפים אותה קבוצת קדקודים ). אז וגם . נותר להראות ש- קליקה ב-. יהיו שונים. מכיוון ש- בלתי תלויה ב-, מתקיים . לפי הגדרת המשלים, כל זוג קדקודים שונים שאינו קשת ב- הוא קשת ב-; לכן . מכאן ש- קליקה ב-, ולכן .
נכונות — כיוון שני: .
נניח . אזי קיימת כך ש- וגם קליקה ב- (שימו לב: חייבים לומר "ב-" ולא סתם "קליקה" — יש כאן שני גרפים).
נתבונן באותה בתוך . אז וגם . יהיו שונים. מכיוון ש- קליקה ב- מתקיים , ולפי הגדרת המשלים . מכאן ש- בלתי תלויה ב-, ולכן .
סיכום. האלגוריתם רץ בזמן פולינומי ומקיים , ולכן הוא רדוקציה בזמן פולינומי, כלומר .
הערה על מבנה ההוכחה. ההגדרה של רדוקציה דורשת שני תנאים ( ו-). מותר, ולרוב נוח יותר, להוכיח במקום התנאי השני את הניגוד שלו: . זה מה שעשינו. שני הניסוחים שקולים. תמיד לעבוד עם השלד של ההגדרה — "מה הנחתי, מה אני צריך להוכיח" — לפני שמפרקים את ההגדרות; השלד הוא המעקה ששומר על ההוכחה.
משפט 4:
טענה. אותה רדוקציה בדיוק — המעבר לגרף המשלים — היא גם רדוקציה בכיוון ההפוך.
הרדוקציה. על קלט עם גרף: החזר .
זמן ריצה. זהה: .
נכונות. המפתח הוא שהמשלים הוא אינוולוציה: , כי .
() נניח , כלומר קיימת בגודל שהיא קליקה ב-. יהיו שונים; אז , ולכן , כלומר בלתי תלויה ב-. לכן .
() נניח , כלומר קיימת בגודל בלתי תלויה ב-. יהיו שונים; אז , ולכן , כלומר קליקה ב-. לכן .
הערה: בהרצאה זה נאמר בקיצור — "באופן דומה אפשר להראות רדוקציה בכיוון ההפוך; למעשה אותה רדוקציה עצמה" — והפירוט כאן. המסקנה: שתי הבעיות שקולות תחת . אחת מהן ב- אם ורק אם השנייה ב-; אחת מהן NP-שלמה אם ורק אם השנייה NP-שלמה.
משפט 5: טרנזיטיביות של
טענה. לכל שלוש שפות : אם וגם אז .
הוכחה. תהיינה רדוקציה בזמן פולינומי מ- ל- ו- רדוקציה בזמן פולינומי מ- ל-. יהיו פולינומים החוסמים את זמני הריצה שלהן בהתאמה; בלי הגבלת הכלליות שניהם מונוטוניים עולים. נגדיר את כשרשור: על קלט , הרץ על , קבל , הרץ על והחזר . (במונחי פונקציות: הרכבה, .)
סמנטיקה. לכל : , כאשר השקילות הראשונה היא נכונות והשנייה נכונות (מופעלת על הקלט ). לכן .
זמן ריצה — כאן נמצא כל החידוש לעומת חישוביות. השלב הראשון עולה . השלב השני עולה , ולכן צריך לחסום את . מכונה שרצה צעדים אינה יכולה לכתוב יותר מ- תווים, ולכן (עד כדי תוספת , אם נספור גם את הקלט ההתחלתי — עדיין פולינומי). מכאן שסך זמן הריצה חסום על ידי וזהו פולינום ב-, כי הרכבה של פולינומים היא פולינום וסכום של פולינומים הוא פולינום. לכן היא רדוקציה בזמן פולינומי מ- ל-.
הערה: בהרצאה הוכרז שהמשפט יוכח בשיעור הבא, וניתנה רק תמצית הרעיון ("הניתוח הסמנטי בדיוק כמו בחישוביות; זמן הריצה נובע מכך שהרכבת פולינומים היא פולינום"); הפירוט המלא כאן. הסיכום מציין את הטענה כתרגיל.
משפט 6: סגירות כלפי מטה תחת
טענה. המחלקות , ו- סגורות כלפי מטה תחת רדוקציות בזמן פולינומי. במפורש, עבור : ובאותו אופן עבור ועבור .
שימו לב לכיוון. הרדוקציה היא מ- אל-, ומה שמסיקים הוא על — הבעיה ה"קלה" יותר. זהו בדיוק תוכן ההגדרה: אם היעד קל, גם המקור קל. הכיוון ההפוך (" ו- ⟹ ") שגוי, ואם הוא היה נכון היינו מקבלים ש- טריוויאלית.
הוכחה עבור . נניח ו-. תהי מכונה דטרמיניסטית המכריעה את בזמן פולינומי, ותהי רדוקציה מ- ל- בזמן פולינומי. נגדיר מכונה : על קלט , חשב , ואז הרץ את על והחזר את תשובתה.
נכונות. מקבלת את מקבלת את .
זמן ריצה. (מכונה שרצה צעדים אינה יכולה לכתוב פלט ארוך יותר), ולכן הזמן הכולל חסום על ידי — פולינום. לכן .
עבור ההוכחה זהה מילה במילה, למעט ש- היא מכונה אי-דטרמיניסטית פולינומית; יורשת ממנה את האי-דטרמיניזם, וכל ריצה שלה נמשכת צעדים לכל היותר. אם ורק אם אם ורק אם קיימת ריצה מקבלת של על אם ורק אם קיימת ריצה מקבלת של על .
עבור אותו שרשור, אלא שכעת סופרים מקום: הרדוקציה רצה בזמן פולינומי ולכן צורכת גם מקום פולינומי ומייצרת פלט באורך פולינומי, ו- צורכת מקום פולינומי באורך הפלט הזה — כלומר פולינומי ב-.
הערה: גם משפט זה הוכרז בהרצאה כדחוי לשיעור הבא, והסיכום מציין אותו כטענה "ללא הוכחה" ומפנה לתרגיל. הרעיון המרכזי שנאמר בעל פה — "הרכבה של פולינומים היא פולינום" — הוא בדיוק מה שכתוב כאן במלואו. הרשימה אינה ממצה; אלו המחלקות שיעניינו אותנו.
משפט 7: משפט ההעברה של NP-קושי
טענה. תהיינה שפות. אם היא NP-קשה וגם , אז היא NP-קשה.
הוכחה. נניח ש- היא NP-קשה וגם . לפי הגדרה 6, כדי להוכיח ש- היא NP-קשה עלינו להראות שלכל מתקיים .
תהי (חייבים לתת לה שם, כדי שנוכל להתייחס אליה בהמשך).
- היא NP-קשה, ולכן — לפי ההגדרה, מופעלת על — מתקיים . (שימו לב לכיוון: מ- אל-, לא להפך.)
- נתון .
- ממשפט 5 (טרנזיטיביות היחס ) נקבל .
מאחר ש- הייתה שרירותית, הראינו שלכל שפה ב-NP קיימת רדוקציה בזמן פולינומי ממנה אל . זו בדיוק הגדרה 6, ולכן היא NP-קשה.
למה המשפט הזה חיוני. להוכיח מאפס שבעיה היא NP-קשה זה מורכב: ההוכחה חייבת להתחיל ב"תהי " — ואני לא יודע כלום על . היא יכולה להיות בעיה בגרפים, בעיה על נוסחאות CNF, בעיה על מספרים, כל דבר. ועליי לבנות רדוקציה ממנה אל , בלי לדעת עליה דבר. משפט 7 אומר: מספיק לעשות את זה פעם אחת. ברגע שיש בידי בעיה אחת שידוע שהיא NP-קשה, כדי להראות ש- נוספת היא NP-קשה מספיק להראות רדוקציה מהבעיה שכבר יש לי אליה — ואין צורך לחזור להגדרה.
זו בדיוק התוכנית להמשך: בשיעור הבא נוכיח את משפט Cook–Levin, שאומר ש- היא NP-קשה — זו ה"בעיה הראשונה" שנעבוד קשה כדי להשיג. משם והלאה נעשה רדוקציות מ- אל בעיות נוספות, ומהן אל בעיות נוספות, וכל בעיה חדשה מצטרפת למאגר ומותר להשתמש גם בה כנקודת מוצא. כך "מעשירים את עולם הבעיות ה-NP-קשות".
דוגמאות ותרגילים מהשיעור
דוגמה 1: הכרעה ידנית ב-CLIQUE
בשיעור הוצג גרף ונשאלו שתי שאלות עליו. נשחזר את הרעיון על גרף קונקרטי: , — משולש על , ואליו נגררת שרשרת .
- ? כן. : , ו-.
- ? לא. יש רק 5 קדקודים, כלומר קבוצות אפשריות; בכל אחת מהן נמצא זוג לא-מחובר. למשל ב- חסרה ; ב- חסרה ; ב- חסרה ; ב- חסרה ; ב- חסרה .
שימו לב שאותו גרף בדיוק נותן קלט חיובי ושלילי בהתאם ל- — הוא חלק מהקלט, וזה בדיוק מה שיהפוך את הניתוח לרגיש בהמשך.
דוגמה 2: מעקב מלא אחרי הרדוקציה, בשני הכיוונים
זהו התרגיל המרכזי. ניקח את המסלול :
חישוב הגרף המשלים. כל הזוגות האפשריים הם : מחסרים את ומקבלים
כיוון . נבדוק את הקלט עבור IS.
- הקלט אכן ב-IS: הקבוצה מקיימת , ו-, , . לכן .
- מפעילים את הרדוקציה: עם שלמעלה. לא השתנה.
- בודקים את הפלט: אותה — , , , ולכן קליקה ב- ו-. ✓
כיוון (הכיוון השני של אותה רדוקציה, ובו זמנית הדגמה של משפט 4). ניקח כעת את כקלט ל-CLIQUE.
- הקלט ב-CLIQUE: היא קליקה ב- כפי שראינו. למעשה זו הקליקה היחידה בגודל 3 ב-: לזוג אין קדקוד שלישי משותף ( אבל ; אבל ; ), ולזוג חסר .
- מפעילים את הרדוקציה: — חוזרים בדיוק ל- המקורי, כי המשלים הוא אינוולוציה.
- בודקים: בלתי תלויה ב-. ✓
בדיקת קלט שלילי (חובה — אחרת לא הראינו "אם ורק אם"). ניקח .
- : הקבוצה הבלתי תלויה המקסימלית ב- היא בגודל 3. כל קבוצה של 4 קדקודים מתוך 5 חייבת להכיל שני קדקודים סמוכים במסלול (למשל מכילה את ; מכילה את ; וכן הלאה).
- והפלט: — הקליקה המקסימלית ב- היא בגודל 3, כפי שספרנו בשלב 1 למעלה.
שני הצדדים "לא", כנדרש. הרדוקציה שומרת גם על תשובות שליליות — וזו בדיוק הדרישה שהצעות "מחק הכול / הוסף הכול" נכשלו בה.
תרגיל 3 (מהשיעור): למה האלגוריתם הנאיבי ל-CLIQUE אינו פולינומי?
השאלה. נניח שאני מכריע את CLIQUE דטרמיניסטית על ידי מעבר על כל תת-הקבוצות בגודל . מה זמן הריצה, ולמה אין די בכך?
פתרון. מספר הקבוצות הוא , ולכן זמן הריצה הוא . נחסום מלמטה: כי מדובר במכפלה של גורמים מהצורה , וכל אחד מהם לפחות .
למה זה לא פולינום? פולינום הוא "משתנה בחזקת קבוע". כאן המעריך הוא — ו- מגיע כחלק מהקלט, כלומר אינו קבוע. אין שום קבוע שעבורו הביטוי הזה חסום על ידי , כי החזקה עצמה גדלה עם הקלט.
הערה חשובה: מכאן לא נובע ש-. נובע רק שהאלגוריתם הספציפי הזה אינו פולינומי. השאלה אם CLIQUE ב- פתוחה, ושקולה (כפי שיתברר) לשאלת מול .
תרגיל 4 (מהשיעור): מימוש הבחירה האי-דטרמיניסטית ברמת המכונה
בשלב 1 של האלגוריתם במשפט 1 כתבנו "בחר באופן אי-דטרמיניסטי קבוצה בגודל ". איך זה נראה בפועל?
פתרון (מהמסירה השנייה). אפשר לנסות בדרך "מתוחכמת" — לבחור קדקוד, אחר כך קדקוד שלא נבחר, וכך איטרציות — אבל אז צריך לנהל את הזיכרון של מי כבר נבחר. הרבה יותר פשוט לבחור באופן הכי גס, ולתקן אחר כך. מכונה עם שני סרטים:
- כתוב באופן אי-דטרמיניסטי מספרים, כל אחד בין ל-, על הסרט השני.
- התייחס אליהם כאל קדקודים ב-.
- אם קיים קדקוד שנבחר יותר מפעם אחת — דחה (הבחירה לא ייצרה קבוצה בגודל ).
- אם קיימים שני קדקודים מבין הנבחרים שאין ביניהם קשת ב- — דחה.
- אחרת — קבל.
ניתוח. שלב 1: כתיבת מספרים בין ל- עולה , שוב תוך שימוש ב- — וכאן זה קריטי, כי אחרת מספר הצעדים היה מעריכי באורך הקידוד הבינארי של . שלב 3: לכל אחד מ- המספרים סורקים את השאר, . שלב 4: עוברים על כל זוג נבחרים ולכל זוג סורקים את רשימת הקשתות, . סך הכול חסום ב- — לא הפולינום הטוב ביותר, אבל פולינום, וזה כל מה שנדרש.
בהמשך הקורס לא נרד לרמת פירוט זו; נכתוב "ננחש קבוצת קדקודים" ונמשיך. אבל כדאי שהמימוש יישאר ברקע כדי לדעת שהוא באמת אפשרי ויעיל.
תרגיל 5: ניתוח זמן ריצה חלופי לרדוקציה
בסיכום נכתב שבניית הגרף המשלים עולה ; במסירה השנייה נאמר . מי צודק?
פתרון: שניהם, וההבדל הוא בייצוג. אם הגרף נתון במטריצת שכנויות, בדיקת "האם " עולה , ולכן מעבר על כל הזוגות עולה . אם הגרף נתון ברשימת קשתות ואנחנו סורקים אותה עבור כל זוג, נשלם . שניהם פולינומיים, ולכן לצורך הטענה אין הבדל — וזו בדיוק הסיבה שמותר לנו להתרשל בפרטי המימוש. זהו יישום ישיר של "המסננת גסה מאוד".
תרגיל 6 (מהסיכום): הוכיחו את טענת הסגירות ואת הטרנזיטיביות
התרגיל מופיע בסיכום כשורה אחת; הפתרונות המלאים כתובים למעלה — משפט 5 (טרנזיטיביות) ומשפט 6 (סגירות). בשני המקרים הרעיון הסמנטי מועתק מהוכחות החישוביות המקבילות (שרשור מכונות / הרכבת פונקציות), והחלק החדש היחיד הוא ניתוח זמן הריצה, שנשען על שתי עובדות: (א) מכונה שרצה צעדים כותבת פלט באורך לכל היותר, ולכן אורך הביניים חסום פולינומית; (ב) הרכבה של פולינומים היא פולינום. מומלץ לחזור על הוכחות אלו מקורס החישוביות לפני השיעור הבא.
הערות מהשיעור
-
[00:10:08] המעבר לפסאודו-קוד הוא היתר, לא ויתור. "כל זמן שהרזולוציה שמעניינת אותנו היא זמן ריצה פולינומי — אפשר לעבור לפסאודו-קוד." הפולינום עצמו יכול לגדול במעבר בין המודלים, אבל מכיוון שמה שמעניין אותנו הוא רק "פולינומי או לא", זה לא משנה באיזה מודל עובדים. זה יהיה נכון כמעט לכל שארית הקורס.
-
[00:16:00] הקידוד נעלם מהתמונה — בכוונה. מכאן ואילך נכתוב "קלט: זוג " בלי לפרט את הקידוד. עדיין מדובר בקידוד, ועדיין הוא חייב להיות סביר, אבל הוא לא מעניין אותנו יותר.
-
[00:28:49] המלכודת של . נשאלה שאלה מצוינת מהכיתה: הקלט מכיל גם את , וכדי לקודד את צריך רק ביטים — אז איך נחשב פולינומי? התשובה: עצמו גדול מאוד ביחס לגודל הקידוד שלו, אבל בגלל שהגרף נמצא לידו בקלט, הגרף "משלם את המחיר". יחד עם ההנחה , הכול חוזר להיות פולינומי בגודל הקלט. אם היה מגיע לבדו — הניתוח היה קורס. שווה לזכור: כשמספר מופיע כפרמטר בקלט, תמיד לשאול אם החסם מבוטא ביחידות הנכונות.
-
[00:31:27] → [00:46:25] חזרה מהצהרה. נשאל אם צריך להוכיח בנפרד שהאלגוריתם עוצר בכל ריצה. תחילה נאמר "אתה צודק ב-100%", ולאחר מכן המרצה חזר בו: "ברגע שזמן הריצה הוא פולינומי בכל ריצה, אני לא צריך את זה בנפרד." שתי התשובות אינן שגויות — הראשונה זהירה מדי. במבחן: אם ניתחתם זמן ריצה לכל ריצה אפשרית, אין צורך בטיעון עצירה נפרד.
-
[00:33:34] "זה לא בדיוק ההפך מקליקה." אזהרה מפורשת נגד הטעות הנפוצה ביותר בהגדרות: השלילה של "לכל שניים יש קשת" היא "קיימים שניים שאין ביניהם קשת", ולא "לכל שניים אין קשת". שלילת כמת "לכל" אינה משאירה "לכל".
-
[00:49:04] העדות חייבת להיות קצרה, וזה לא טכני. "אני רוצה להימנע מדברים כמו: הנה מוודא, והוא באמת מוודא — אבל הוא קיבל witness גדול מדי." הדוגמה שניתנה: מוודא ל-SAT שמקבל את טבלת האמת המלאה של הנוסחה, שגודלה מעריכי. חסם האורך הפולינומי הוא מה שמונע מההגדרה להתמוטט.
-
[00:58:20] → [01:00:25] הדרך אל הגרף המשלים. ההצעות "נמחק את כל הקשתות" ו"נוסיף את כל הקשתות" נדחו לא כי הן טיפשות, אלא כי כל אחת מהן שוברת בדיוק כיוון אחד של ה"אם ורק אם". זו הדגמה מדויקת של מה שרדוקציה צריכה: לא פונקציה שמייצרת פלט "טוב", אלא פונקציה שמשמרת מבנה. שווה לחשוב על כך בכל פעם שנתקעים בבניית רדוקציה: איזה כיוון ההצעה שלי שוברת?
-
[00:58:50] הקבלה לחישוביות. "כשעשינו רדוקציה מ- ל- לא יכולנו לבדוק אם הקלט ב-; היינו צריכים להעביר את התכונה בלי לדעת." אותה מחשבה בדיוק חלה כאן — הרדוקציה עיוורת לתשובה.
-
[01:03:35] "פה הקבוצה לא נתונה לנו." בלבול שעלה בכיתה: בהוכחת הרדוקציה תלמידה חיפשה את הקבוצה כאילו היא חלק מהקלט, כמו ב-verifier של משפט 2. ההבהרה: בהוכחה מותר לומר "קיימת " ולעבוד איתה — זו טענה מתמטית, לא שלב אלגוריתמי. ההבחנה בין "מה האלגוריתם עושה" ל"מה אני מוכיח" היא המקור השכיח ביותר לבלבול בשיעור הזה. במסירה השנייה [01:25:54] נאמר אותו דבר במפורש: "בזמן בניית הרדוקציה לא ידעתי אם זה שייך או לא שייך; בזמן ההוכחה אני מניח כיוון אחד ומראה את השני."
-
[01:05:48] "תמיד לעבוד עם השלד של ההוכחה — זה המעקה ששומר עליכם." לפני שמפרקים הגדרות: מה הנחתי? מה בדיוק אני צריך להוכיח? רק אז לפתוח את ההגדרות. בהמשך אותה הוכחה נאמר לתלמידה שהתחילה מהפירוק: "זה כבר ה'איך אני מוכיח', לא 'מה אני רוצה להוכיח'."
-
[01:07:24] כשיש שני גרפים — חובה לציין באיזה. לא "קליקה", אלא "קליקה ב-"; לא "קבוצת הקשתות", אלא "". בהוכחת רדוקציה בין בעיות גרפים זהו מקור קבוע לשגיאות.
-
[01:22:29] ההבדל בין הקורסים. למי שלמד חישוביות במסלול שבו לא הוגדר "-קשה": את התכונה למדתם, פשוט לא נתתם לה שם. אין הבדל מהותי.
-
[01:26:48] למה בכלל צריך את משפט 7. להוכיח NP-קושי לפי ההגדרה מחייב לטפל בשפה שרירותית ב-NP — "אני לא יודע כלום על ה- הזאת" — ולכן זה מורכב. משפט 7 מאפשר לעשות את העבודה הקשה פעם אחת (Cook–Levin, שיעור הבא) ואז להתקדם ברדוקציות. "ברגע שיש לי עוד בעיה NP-קשה, אני יכול לעשות גם ממנה רדוקציה."
פערים בין הסיכום להקלטה
-
מקור: עמוד 2 בסיכום. הפער: בהגדרת קבוצה בלתי תלויה נכתב ככל הנראה "לכל שונים מתקיים ", בעוד שההגדרה של קליקה בעמוד 1 משתמשת נכון ב-. הניסוח עם היה אומר שאין בגרף אף קשת כלל. ההכרעה: תוקן ל- בהגדרה 3; זו ההגדרה שנאמרה בשתי ההקלטות. ייתכן גם שמדובר בשגיאת קריאה שלי בכתב היד — לכן נרשם ב-
open_questions. -
מקור: הקלטה 13, [00:33:00]. הפער: התמלול האוטומטי מוריד את השלילה וכותב " תיקרא בלתי תלויה כאשר לכל שונים הקשת בגרף". ההכרעה: ארטיפקט תמלול. במשפט הבא המרצה עצמו אומר "פה אני דורש שלכל שניים אין קשת", והסיכום מסכים. נכתב .
-
מקור: הסיכום מול הקלטה 13. הפער: הסיכום מציג את טענות הסגירות והטרנזיטיביות כ"טענה ללא הוכחה" ומוסיף "תרגיל: להוכיח"; בהקלטה נאמר שהן יוכחו בשיעור הבא, וניתן רק הרעיון המרכזי ("הרכבה של פולינומים היא פולינום"). ההכרעה: ההוכחות נכתבו כאן במלואן (משפטים 5 ו-6), עם סימון מפורש שבהרצאה הן נדחו.
-
מקור: הקלטה 13, [01:15:16]. הפער: הכיוון מוזכר במשפט אחד — "אותה רדוקציה למעשה היא רדוקציה גם בכיוון ההפוך" — ואינו מופיע כלל בסיכום. ההכרעה: נכתב כמשפט 4 עם הוכחה מלאה, כולל האינוולוציה שהמשפט נשען עליה; מסומן כשחזור.
-
מקור: הסיכום (עמ' 4) מול הקלטה 14 ([01:19:52]). הפער: הסיכום מעריך את בניית הגרף המשלים ב-; המסירה השנייה מעריכה . ההכרעה: אין סתירה — ההבדל הוא בייצוג הגרף (מטריצת שכנויות מול רשימת קשתות). שני החסמים פולינומיים, ולכן שניהם מספיקים; שניהם מובאים, עם ההסבר, בתרגיל 5.
-
מקור: הקלטה 14 בלבד ([00:44:46]–[00:49:07]). הפער: ניתוח החסם התחתון לאלגוריתם הנאיבי, וההסבר מדוע "משתנה בחזקת משתנה" אינו פולינום, אינם מופיעים בסיכום ולא במסירה השנייה. ההכרעה: נכללו כתרגיל 3, כולל האזהרה שמכאן לא נובע .
-
מקור: הקלטה 14 בלבד ([00:50:14]–[00:59:31]). הפער: המימוש המפורש של הבחירה האי-דטרמיניסטית (כתיבת מספרים ואז פסילת חזרות) והניתוח שלו אינם בסיכום. ההכרעה: נכללו כתרגיל 4.
-
מקור: הקלטה 13 בלבד ([00:57:50]–[01:00:25], [00:28:49], [00:49:04]). הפער: הדיון בניסיונות הכושלים לבניית הרדוקציה, מלכודת הקידוד הבינארי של , והדוגמה הנגדית של טבלת האמת כ-witness — כולם חסרים בסיכום ובמסירה השנייה. ההכרעה: נכללו, כי הם ההסבר למה עומד מאחורי ההגדרות, ולא רק להגדרות עצמן.
-
מקור: הקלטה 14, [00:00:00]–[00:39:20]. הפער: כשליש מהקובץ עוסק בהגדרת SAT ובהוכחה ש- (בשתי הגרסאות), כולל דיון טכני באורך העדות ( מול ). זהו חומר של שיעור 6. ההכרעה: לא נכלל כאן; רק ההערה הכללית על אורך העדות שימשה כדוגמה נגדית בהערה שאחרי משפט 2. סומן ב-
coverage: partial. -
מקור: הגדרת הרדוקציה. הפער: הסיכום והקלטה 13 מגדירים רדוקציה כמכונה ; הקלטה 14 מגדירה אותה כפונקציה הניתנת לחישוב בזמן פולינומי. ההכרעה: ההגדרות שקולות (פונקציה חשיבה = קיימת מכונה שמחשבת אותה); הובאה גרסת הסיכום, עם ההסבר של המסירה השנייה מדוע לרוב נוח יותר להגדיר את הפונקציה ישירות דרך המכונה ולא בשני שלבים.
סיכום ונקודות למבחן
מה חייבים לדעת בעל פה
| מושג | ההגדרה, בשורה |
|---|---|
| קליקה | שלכל בה |
| קבוצה בלתי תלויה | שלכל בה |
| קיימת TM דטרמיניסטית פולינומית עם | |
| NP-קשה | |
| NP-שלמה | NP-קשה וגם |
התוצאות
- , .
- ו-, שתיהן על ידי .
- טרנזיטיבי.
- , , סגורות כלפי מטה תחת .
- NP-קשה ו- NP-קשה.
מלכודות סטנדרטיות
- הפיכת כיוון הרדוקציה. אומר ש- קשה לפחות כמו . הסגירות היא " ו- ⟹ " — הרדוקציה נכנסת אל הקלה. אם כתבתם את זה הפוך, קיבלתם , וזה סימן אזהרה.
- NP-קשה ≠ NP-שלמה. שפה NP-קשה אינה חייבת להיות ב-NP, ואפילו לא כריעה. תמיד לבדוק את שני התנאים.
- "ההפך מקליקה". קבוצה בלתי תלויה אינה שלילת קליקה. הקשר הוא הגרף המשלים.
- רדוקציה שפותרת את הבעיה. אם בתיאור הרדוקציה שלכם מופיע "נמצא את הקליקה" או "נבדוק אם הקלט בשפה" — הרדוקציה לא חוקית. היא חייבת לפעול בלי לדעת את התשובה.
- הוכחת כיוון אחד בלבד. רדוקציה דורשת אם ורק אם. הוכחה שרק "כן ⟹ כן" חסרה חצי.
- חסמים בפרמטרים במקום בגודל הקלט. אינו תשובה; צריך להסביר למה זה , ולשם כך צריך את .
- witness ארוך מדי. אם העדות אינה חסומה פולינומית באורך הקלט, ההוכחה ש- אינה תקפה.
צ'ק-ליסט: אחרי השיעור הזה סטודנט צריך לדעת
- להוכיח שבעיית גרפים נתונה שייכת ל-NP, בשתי הדרכים (מכונה אי-דטרמיניסטית / verifier), כולל ניתוח זמן ריצה מלא כפונקציה של גודל הקלט.
- לנסח רדוקציה בזמן פולינומי בשלושה חלקים: תיאור האלגוריתם, ניתוח זמן הריצה, והוכחת נכונות בשני הכיוונים.
- להסביר מדוע הרדוקציה עובדת, ומדוע ניסיונות נאיביים (מחיקת/הוספת כל הקשתות) נכשלים.
- לקבוע נכון, בהינתן , מי הבעיה הקשה יותר ומה נובע ממה.
- להבחין בין NP-קשה ל-NP-שלמה, ולהסביר את התפקיד של משפט 7 בהעשרת אוסף הבעיות ה-NP-קשות.
- לעקוב אחרי גרף קונקרטי קטן דרך הרדוקציה, בשני הכיוונים, כולל קלט שלילי.
לקראת השיעור הבא. נוכיח את משפט Cook–Levin: היא NP-קשה (ולמעשה NP-שלמה, שכן הוכח בשיעור 6). זו תהיה "הבעיה הראשונה", והיא נקודת המוצא לכל הרדוקציות שיבואו. מומלץ לחזור לפני כן על הוכחת משפט הרדוקציה ועל הוכחת הטרנזיטיביות מקורס החישוביות — ההוכחות כאן בנויות עליהן, בתוספת ניתוח הזמן.
הסיכום המקורי בכתב יד: גיא סופר.
