בתורת הסיבוכיות, **NP ביניים** היא מחלקת כל בעיות ההכרעה במחלקה  NP שאינן נמצאות ב-P וגם אינן NP-שלמות (NPC). המחלקה של בעיות אלו נקראת NPI. נשים לב שאם P=NP, אזי NPI היא ריקה.
הכיוון השני גם כן נכון, כלומר אם {\displaystyle P\neq NP}, אזי NPI **אינה** ריקה. תוצאה לא טריוויאלית זו נובעת מ**משפט לדנר**, שהוכח בשנת 1975 על ידי ריצ'רד לדנר. משפט לדנר קובע שאם {\displaystyle P\neq NP}, אזי NPI אינה ריקה.

אמנם משפט לדנר בונה שפה מלאכותית לצורך ההוכחה, אך בעיות מפורסמות רבות, כגון בעיית הפירוק לגורמים והלוג הדיסקרטי נחשדות להיות ב-NPI.

משפט לדנר
---------

משפט לדנר קובע שאם המחלקות P ו-NP שונות אחת מהשנייה, אזי קיימת שפה שאינה NP-שלימה ואינה ב-P.

נוכיח את המשפט בשתי דרכים שונות. שתי הדרכים משתמשות בשיטת **הוכחה בלכסון**. 

### הוכחה עם חירור SAT

תהיינה {\displaystyle \{M\_{i}\}\_{i=1}^{\infty }} כל המכונות הפולינומיות אשר רצות לכל היותר בזמן {\displaystyle |x|^{i}} כל אחת, ותהיינה באופן דומה {\displaystyle \{f\_{i}\}\_{i=1}^{\infty }} כל הפונקציות הפולינומיות שרצות בזמן לכל היותר {\displaystyle |x|^{i}}. נשים לב שכל המכונות הפולינומיות וכל הפונקציות הפולינומיות נמצאות כאן.

נגדיר שפה - 

{\displaystyle A=\{x|x\in SAT\ \ {\text{and }}f(|x|){\text{ is even}}\}}
ברור שאם הפונקציה f חשיבה בזמן פולינומי אזי {\displaystyle A\in NP}.

נגדיר את הפונקציה f כך: 
{\displaystyle f(0)=f(1)=2}. עבור {\displaystyle n\geq 1} נגדיר את {\displaystyle f(n+1)}:

אם {\displaystyle log^{f(n)}(n)\geq n} אז נשאיר את {\displaystyle f(n+1)=f(n)}

אחרת יש לנו שני מקרים: 

* {\displaystyle f(n)=2i} (כלומר ערך **זוגי**), נבדוק האם קיים קלט x, {\displaystyle |x|\leq log(n)} כך ש-

1. {\displaystyle M\_{i}(x)} **מקבלת** את x וגם {\displaystyle f(|x|)} אי-זוגי או {\displaystyle x\notin SAT}, או
2. {\displaystyle M\_{i}(x)} **דוחה** את x וגם {\displaystyle f(|x|)} זוגי או {\displaystyle x\in SAT}

אם קיים כזה x, אזי {\displaystyle f(n+1)=f(n)+1}. אחרת {\displaystyle f(n+1)=f(n)}.
* {\displaystyle f(n)=2i+1} (כלומר ערך **אי זוגי**), נבדוק האם קיים קלט x, {\displaystyle |x|\leq log(n)} כך ש-

1. {\displaystyle x\in SAT} וגם מתקיים {\displaystyle f(|f\_{i}(x)|)} אי-זוגי או {\displaystyle f\_{i}(x)\notin SAT}
2. {\displaystyle x\notin SAT} וגם {\displaystyle f(|f\_{i}(x)|)} זוגי וגם {\displaystyle f\_{i}(x)\notin SAT}

אם קיים כזה x, אזי בדומה למקודם, {\displaystyle f(n+1)=f(n)+1}. אחרת {\displaystyle f(n+1)=f(n)}.
עכשיו נסביר מדוע זה עובד.

ראשית כל נשים לב שאין קשר בין הפונקציות {\displaystyle f\_{i}} לפונקציה {\displaystyle f}

מתקיים שהסדרה של המכונות הפולינומיות שלנו **לא יכולות** לפתור את SAT, מכיוון שהנחנו ש- {\displaystyle P\neq NP}, ולכן יש גם אינסוף xים שהמכונה נכשלת עליהם, כלומר לכל מספר טבעי n קיים x באורך גדול או שווה ל-n שהמכונה נכשלת עליו. לכן אם המכונה **מקבלת** את x אבל x בכלל לא ב-SAT, אז מתקיים שהמכונה הזאת כבר לא תוכל להכריע את השפה שהגדרנו A, מכיוון ש-x יהיה בשפה A (שהרי {\displaystyle f(n)} זוגי וגם x לא ב-SAT).

באופן אנלוגי נותנים את התנאי השני. אם המכונה לא מקבלת את x אבל x **כן** ב-SAT, אז מצאנו שוב x שהמכונה {\displaystyle M\_{i}} נכשלת עליו. אחרי שהבנו איך הבניה מפרידה את SAT מכל מכונה פולינומית, נסביר בקצרה את העניין עם הפונקציה {\displaystyle f}. השימוש בפונקציה הזו נועד כדי שנוכל לסנן עוד מילים מהשפה, כדי שהיא לא תהיה NPC (שלמה). לכן בכל תנאי, במקום לדרוש המילה תהיה או לא תהיה ב-SAT, אנחנו דורשים שהמילה תהיה או לא תהיה ב-A, כלומר מוסיפים את הדרישה ש-{\displaystyle f(|x|)} זוגי. ברור שנמצא x כזה, כי הנחנו ש-{\displaystyle P\neq NP}, אז אין לכל מכונה פולינומית יש קלט x עבורו היא מחזירה תשובה לא נכונה.

עתה סיימנו להוכיח רעיונית שהשפה A אינה נמצאת ב-P. נרצה להוכיח שהשפה גם אינה NPC, כלומר **לא קיימת** רדוקציה פולינומית מ-SAT אל A.
כמו שהגדרנו מקודם, יש לנו רשימה של כל הפונקציות הפולינומיות הקיימות. אם השפה A היא אכן NPC אזי אחת מהפונקציות היא רדוקציה פולינומית מ-SAT אל A. לכן אנחנו מחפשים עבור כל פונקציה {\displaystyle f\_{i}} קלט x עבורו הפונקציה לא מהווה רדוקציה ל-A (וכתוב למעלה איך עושים את זה פורמלית בדיוק). כעת נותר להוכיח שהתנאים לבסוף מתקיימים, כלומר שאין איזה i עבורו {\displaystyle f\_{i}} **כן** מהווה רדוקציה ל-SAT. לכל פונקציה {\displaystyle f\_{i}} שהיא רדוקציה ל-SAT, מההנחה ש {\displaystyle P\neq NP} אורך הפלט של הפונקציה f\_{i} גדל, ולכן בסופו של דבר נגיע ל-{\displaystyle |f\_{i}(x)|} מספיק גדול שיהיה אי-זוגי ונגרום לכך ש-{\displaystyle f\_{i}} לא תהיה רדוקציה טובה.

  

הדרישה שאם {\displaystyle log^{f(n)}(n)\geq n} אז {\displaystyle f(n+1)=f(n)} נועדה כדי שבכל שלב נוכל להשתמש בפונקציות {\displaystyle f(|f\_{i}(x)|)}
בסך הכל הוכחנו בחלק הראשון ש-A לא ב-P, ובחלק השני שאין רדוקציה פולינומית מ-SAT ל-A, ולכן הפונקציה A נמצאת ב-NPI, כדרוש.

### הוכחה עם ריפוד SAT

נגדיר את {\displaystyle \{M\_{i}\}\_{i=1}^{\infty },\{f\_{i}\}\_{i=1}^{\infty }} כמקודם.

נגדיר שפה {\displaystyle L=\{\phi 01^{f(n)-|n|-1}|\phi \in SAT\land |\phi |=n\}}

אנחנו נשאיר את {\displaystyle f(n)=n^{i}} עד שנקיים את התנאי ה-i, ואז נקדם את {\displaystyle f(n)} להיות {\displaystyle f(n)=n^{i+1}}

כעת נתאר אלגוריתם לחישוב {\displaystyle f(n)}. נתחיל עם {\displaystyle i=1}. לכל n נבצע את הפעולות הבאות: {\displaystyle f(n)=n^{i}}. נבדוק האם קיים קלט {\displaystyle |x|\leq log(n)}, כך שמתקיים:

1. {\displaystyle M\_{i}(x)} מקבל את x, אבל x\notin L
2. {\displaystyle M\_{i}(x)} דוחה את x, אבל x\in L

במידה ויש כזה x, נגדיר {\displaystyle i=i+1}. אחרת לא נשנה את i ונעבור ל-n הבא.

מכיוון שאנחנו בודקים רק עבור {\displaystyle |x|\leq log(n)} ניתן לחשב את f בזמן פולינומי

ברור שהבנייה לא נתקעת על i מסוים, מכיוון שבמקרה כזה הייתה רדוקציה טריוויאלית מ-SAT ל-L, אבל המכונות {\displaystyle M\_{i}} הן פולינומיות, וזה סותר את ההנחה {\displaystyle P\neq NP}.

לכן מילאנו את התנאי שהשפה L אינה פולינומית. כעת נניח שיש פונקציה {\displaystyle f\_{j}(\cdot )} עושה רדוקציה פולינומית מ-SAT ל-L. נרצה להראות שזה גורר ש-SAT פתירה בזמן פולינומי (וכנגד ההנחה שלנו, כמובן)

הוכחה. מאחר ש {\displaystyle f\_{j}(x)} רצה לכל היותר בזמן {\displaystyle |x|^{j}}, מתקיים {\displaystyle |f\_{j}(\phi )|\leq |\phi |^{j}}. חייב להיות {\displaystyle n\_{0}} כך שלכל {\displaystyle n\geq n\_{0}} מתקיים {\displaystyle f(n)=n^{k},k>j}. מכיוון ש-{\displaystyle n\_{0}} קבוע, אפשר פשוט לפתור את כל הבעיות מאורך קטן או שווה לו בזמן אקספוננציאלי. 

עכשיו נניח שיש לנו נוסחה {\displaystyle \phi } כך ש{\displaystyle |\phi |\geq n\_{0}}. אם {\displaystyle f\_{j}(\phi )} לא בטווח של f, אז {\displaystyle f\_{j}(\phi )\notin L\implies \phi \notin SAT}. אחרת, {\displaystyle f\_{j}(\phi )=\psi 01^{f(m)-m-1}} כש-{\displaystyle m=|\psi |} ו{\displaystyle \phi \in SAT} אם ורק אם {\displaystyle \psi \in SAT}. עד כה השגנו ש{\displaystyle f(m)\leq f\_{j}(\phi )<|\phi |^{j}}. אז {\displaystyle |\psi |=m\leq |\phi |^{j/k}} אם {\displaystyle f(m)=m^{k}}. מאחר ש{\displaystyle |\phi |>n\_{0}} מתקיים {\displaystyle {\ce {k>j}}} אז {\displaystyle |\psi |<|\phi |}. אם {\displaystyle |\psi |\leq n\_{0}} אז אפשר לבדוק אם \psi  ב-SAT ולכן גם אפשר לבדוק אם \phi  ב-SAT. אחרת נריץ את האלגוריתם רקורסיבית (לא יותר מ-n פעמים) מכיוון שגודל הפלט גדל בין הרצה להרצה, וכל ריצה מתבצעת בזמן פולינומי.

בעיות חשודות להיות ב-NPI
------------------------

### תורת המספרים ואלגברה

* בעיית הפירוק לגורמים
* בעיית הלוג הדיסקרטי
* בעיית איזומורפיזם בין גרפים וחוגים

### תורת המשחקים

* מציאת המנצח במשחק זוגיות

### אלגוריתמים בגרפים

* בעיית איזומורפיזם בין גרפים

### למידת מכונה

* מציאת מימד VC של בעיה

לקריאה נוספת
------------

* Michael Sipser, **Introduction to the Theory of Computation**, Thompson, 1996

הערות שוליים
------------

1. ↑  אם היה נשאר קבוע אז היה פותר את SAT בזמן פולינומי
2. ↑  לא הגדלנו את הפונקציה כל הזמן הזה
3. ↑  הפלט של {\displaystyle f\_{i}(x)} הוא לכל היותר באורך {\displaystyle |x|^{i}}, ומדרך הפעולה ברור ש-{\displaystyle i<n}
4. ↑  מכיוון שאי אפשר לכתוב אורך יותר מהזמן המוקצב למכונה שמחשבת את הפונקציה