עמודת ספרה לכל קשת, בלי נשאות

VC ≤p SUBSET-SUM

VC≤pSUBSET-SUM\mathrm{VC}\le_p\mathrm{SUBSET\text{-}SUM}, ולכן SUBSET-SUM\mathrm{SUBSET\text{-}SUM} היא NP-שלמה.

הבנייה

הרעיון. נבנה מספרים שאפשר לחשוב עליהם כשורות בטבלה: עמודה מיוחדת אחת בשם dd, ועוד עמודה אחת לכל קשת. שורת קודקוד "מדווחת" באילו קשתות הוא נוגע; שורת קשת היא וקטור יחידה. סכום היעד דורש בדיוק 22 בכל עמודת קשת ובדיוק KK בעמודה dd. הקסם: הדרישה "בדיוק 22" ניתנת לסיפוק אם ורק אם לפחות אחד משני קצות הקשת נבחר.

האלגוריתם. על קלט G=(V,E)G=(V,E) ו-K∈NK\in\mathbb N, נסמן m=∣E∣m=|E| ו-E={e1,…,em}E=\{e_1,\dots,e_m\}:

  1. אם K>∣V∣K>|V|, החלף את KK ב-∣V∣|V|.
  2. לכל v∈Vv\in V מספר ava_v בן m+1m+1 ספרות: הספרה השמאלית ביותר היא 11, והספרה ה-(j+1)(j+1) היא 11 אם v∈ejv\in e_j ואחרת 00.
  3. לכל e∈Ee\in E מספר aea_e בן m+1m+1 ספרות: הספרה השמאלית היא 00, והספרה ה-(j+1)(j+1) היא 11 אם ורק אם e=eje=e_j.
  4. סכום יעד SS: הספרות השמאליות מייצגות את KK, וכל יתר הספרות שוות 22.
  5. החזר את הרשימה {av}∪{ae}\{a_v\}\cup\{a_e\} ואת SS.

באלגברה: av=10m+∑j=1m[ v∈ej ]⋅10 m−j,aei=10 m−i,S=K⋅10m+∑j=1m2⋅10 m−j.a_v=10^{m}+\sum_{j=1}^{m}[\,v\in e_j\,]\cdot10^{\,m-j},\qquad a_{e_i}=10^{\,m-i},\qquad S=K\cdot10^{m}+\sum_{j=1}^{m}2\cdot10^{\,m-j}.

על צעד 0. ההגדרה של VC\mathrm{VC} מדברת על כיסוי בגודל לכל היותר KK, ואילו הבנייה כופה בעמודה dd סכום של בדיוק KK. הפער אינו מזיק: (א) הוספת קודקודים לכיסוי משאירה אותו כיסוי, ולכן אם קיים כיסוי בגודל ≤K\le K ו-K≤∣V∣K\le|V| אפשר להשלים לגודל בדיוק KK; (ב) אם K>∣V∣K>|V| אז (G,K)∈VC(G,K)\in\mathrm{VC} תמיד, ולכן ההחלפה אינה משנה את התשובה.

המחשה

בנייה מודרכת

כיסוי קודקודים → סכום תת-קבוצה

שלב 1 מתוך 8
G = P₅: |V| = 5, m = |E| = 4K = 3
מסלול הקלט לצד תרשים של סכומי עמודות הקשתותמשמאל מסלול בן חמישה קודקודים וארבע קשתות, כשעל כל קשת תג המציין כמה מקצותיה נבחרו. מימין עמודה אחת לכל עמודת קשת, מפוצלת לחלק שתרמו הקודקודים הנבחרים ולחלק שתרם מספר הקשת עצמה, על רקע קווי עזר ביעד 2, במקסימום 3 ובסף הנשאות 10.G — גרף הקלטסכומי עמודות הקשתות cⱼe₁e₂e₃e₄v₁v₂v₃v₄v₅02310e₁e₂e₃e₄
מספר קודקוד a_v
שורה לכל מספר שנבנה; עמודה אחת ל־d ועמודה לכל קשת; השורות האחרונות הן סכומי העמודות וסכום היעד.
מספרde₁e₂e₃e₄ערך
צעד 0 — "לכל היותר K" הופך ל"בדיוק K"אם K > |V| מחליפים את K ב־|V|. כיסוי בגודל ≤ K תמיד אפשר להשלים לגודל K בדיוק, ולכן כפיית K בעמודה d אינה מזיקה.

נכונות — שני הכיוונים

VC ∈ ⟹ SUBSET-SUM ∈

למה 4.1 (אי-נשאות) — הצעד שבלעדיו כלום לא עובד. תהי II תת-קבוצה כלשהי של המספרים שנבנו, ונסמן U=I∩{av}U=I\cap\{a_v\} (מזוהה עם קבוצת קודקודים) ולכל jj cj=∣{v∈U:v∈ej}∣+[ aej∈I ].c_j=\bigl|\{v\in U:v\in e_j\}\bigr|+[\,a_{e_j}\in I\,]. אזי (1) 0≤cj≤30\le c_j\le3; (2) ∑x∈Ix=∣U∣⋅10m+∑jcj10m−j\sum_{x\in I}x=|U|\cdot10^m+\sum_j c_j 10^{m-j}, וזהו בדיוק הייצוג העשרוני — החיבור אינו נושא באף עמודת קשת; (3) ∑jcj10m−j<10m\sum_j c_j10^{m-j}<10^m.

הוכחה. (1) לקשת eje_j יש בדיוק שני קצוות, ולכן לכל היותר שני מספרי קודקוד נושאים 11 בעמודה jj, ובנוסף בדיוק מספר קשת אחד; סך האחדות ≤3\le3. (2) פתיחת הסכום וקיבוץ לפי חזקות 1010; היות cj≤3≤9c_j\le3\le9 ספרה חוקית מבטיח שאין העברה שמאלה. (3) ∑j3⋅10m−j=10m−13<10m\sum_j 3\cdot10^{m-j}=\frac{10^m-1}{3}<10^m. □\square

מסקנה 4.2 (קריטריון הספרות). ∑x∈Ix=S\sum_{x\in I}x=S אם ורק אם ∣U∣=K|U|=K וגם cj=2c_j=2 לכל jj. הוכחה של ⇒\Rightarrow: נסמן L=∑jcj10m−jL=\sum_j c_j10^{m-j} ו-L′=∑j2⋅10m−jL'=\sum_j2\cdot10^{m-j}; שניהם ב-[0,10m)[0,10^m). מההנחה (∣U∣−K)⋅10m=L′−L(|U|-K)\cdot10^m=L'-L, כאשר אגף ימין קטן בערך מוחלט מ-10m10^m ואגף שמאל כפולה שלמה של 10m10^m — לכן שניהם אפס. □\square

הכיוון. נניח (G,K)∈VC(G,K)\in\mathrm{VC}; לאחר צעד 0 מתקיים K≤∣V∣K\le|V|, ולכן קיים כיסוי U⊆VU\subseteq V עם ∣U∣=K|U|=K בדיוק. נסמן I1={au∣u∈U}I_1=\{a_u\mid u\in U\}.

בעמודה dd כל אחד מהם תורם 11, ובחרנו בדיוק KK קודקודים — התרומה KK, בדיוק כמו ב-SS.

יהי jj. מכיוון ש-UU כיסוי, לפחות אחד מקצות eje_j ב-UU; ומכיוון שיש רק שני קצוות, לכל היותר שניים. לכן סכום העמודה הוא 11 או 22.

נגדיר I2I_2: לכל jj שסכום עמודתו יצא 11, נוסיף את aeja_{e_j}. המספר aeja_{e_j} מוסיף 11 בדיוק לעמודה jj ואפס לכל עמודה אחרת (כולל dd), ולכן הוא "מתקן" מ-11 ל-22 בלי לגעת בשום מקום אחר. הוא אינו יכול לתקן מ-00 ל-22 — וזה מדויק: המצב 00 לא ייתכן כאן דווקא מפני ש-UU כיסוי.

קיבלנו cj=2c_j=2 לכל jj ו-∣U∣=K|U|=K, ולפי מסקנה 4.2 סכום המספרים ב-I1∪I2I_1\cup I_2 הוא בדיוק SS.

SUBSET-SUM ∈ ⟹ VC ∈

נניח שקיימת תת-קבוצה II של המספרים שנבנו שסכומה בדיוק SS. נסמן, כמו בלמה 4.1, U=I∩{av}U=I\cap\{a_v\} (מזוהה עם קבוצת קודקודים). לפי מסקנה 4.2, ∣U∣=K,cj=∣{v∈U:v∈ej}∣+[ aej∈I ]=2לכל 1≤j≤m.|U|=K,\qquad c_j=\bigl|\{v\in U:v\in e_j\}\bigr|+[\,a_{e_j}\in I\,]=2\quad\text{לכל }1\le j\le m .

יהי jj. המחובר [ aej∈I ][\,a_{e_j}\in I\,] הוא לכל היותר 11, שכן יש מספר אחד בלבד המתאים לקשת eje_j ולכן אפשר לבחור אותו לכל היותר פעם אחת. לכן ∣{v∈U:v∈ej}∣=2−[ aej∈I ]  ≥  1.\bigl|\{v\in U:v\in e_j\}\bigr|=2-[\,a_{e_j}\in I\,]\;\ge\;1 .

כלומר לכל קשת eje_j יש לפחות קצה אחד ב-UU, ולכן UU הוא כיסוי בקודקודים של GG. גודלו ∣U∣=K≤K|U|=K\le K, ומכאן (G,K)∈VC(G,K)\in\mathrm{VC}.

סיבוכיות הרדוקציה

זמןO(|x|²)
מקוםO((|V| + m)·m)
גודל הפלטO((|V| + m)·m + log K) digits

לולאה אחת על הקודקודים ואחת על הקשתות, כשלכל אחד נכתב מספר בן m+1m+1 ספרות; בנוסף נכתב SS. בדיקת "האם v∈ejv\in e_j" היא O(1)O(1) ברשימות שכנויות, ולכן זמן החישוב פרופורציוני לגודל הפלט.

הערה שנאמרה רק ברמז, והיא הלב של השיעור: הערך של כל מספר שנבנה הוא בסדר גודל 10m10^{m} — מעריכי בגודל הקלט. זו אינה בעיה, כי הרדוקציה נדרשת לרוץ בזמן פולינומי וכתיבת מספר כזה עולה רק m+1m+1 ספרות. הרדוקציה חוקית בדיוק מפני שמותר לה לייצר מספרים בעלי ערך אדיר באורך ייצוג צנוע — וזו אותה הבחנה בין ערך לאורך ייצוג, מן הצד השני שלה.

מה זה קונה

SUBSET-SUM\mathrm{SUBSET\text{-}SUM} היא NP-שלמה. מכאן ממשיכה השרשרת המספרית: SUBSET-SUM≤pPARTITION≤pBIN-PACKING\mathrm{SUBSET\text{-}SUM}\le_p\mathrm{PARTITION}\le_p\mathrm{BIN\text{-}PACKING}.

מלכודות

  • בלי אי-הנשאות אין הוכחה. אילו סכום עמודה כלשהי היה מגיע ל-1010 או יותר, הוא היה מעביר 11 שמאלה, וסכום כולל שנראה נכון היה יכול להתקבל מצירוף עמודות שגוי לגמרי — למשל 1010 אחדות בעמודה אחת "מתחזות" לספרה 11 בעמודה שכנה. כל הטיעון נשען על כך ששוויון סכומים גורר שוויון בכל ספרה בנפרד. (למעשה כל בסיס ≥4\ge4 היה מספיק; בסיס 1010 נבחר מטעמי נוחות בלבד.)

  • KK נכתב כבלוק של ספרות ולא כספרה בודדת. מספר הקודקודים הנבחרים ∣U∣|U| עשוי להיות 1010 או יותר, ואז "הספרה" השמאלית איננה ספרה. הטיעון של מסקנה 4.2 אינו מניח דבר על ∣U∣|U| — הוא רק מנצל שכל מה שמתחת ל-10m10^m אינו מגיע ל-10m10^m.

  • הרדוקציה בונה מספרים מהגרף ומ-KK בלבד ואינה מחפשת כיסוי. אותו "חטא כבד" שנפסל ב-3COL≤p4COL\mathrm{3COL}\le_p\mathrm{4COL} חוזר כאן: אסור לנסח את הבנייה במונחים של הפתרון.

השרשרת

נשענת על

משמשת בהמשך ל

מאיפה זה נקרא

  • כיוון ⇐\Leftarrow אינו כתוב בסיכום הכתוב, ובהרצאה הוא נאמר בעל פה בלבד עם ההערה "אתם רוצים באמת להרגיש שאתם מבינים את זה — תכתבו את זה". הכתיבה כאן היא ההשלמה.