(בעצם זה כפל של כל הגורמים שהחזקות שלהם יביאו לחזקה ) .
ייצוג פולינומים
ייצוג מקדמים
נגדיר כוקטור המקדמים .
על ייצוג זה מאוד נוח לבצע את פעולת ההצבה והחיבור בזמן ליניארי למספר המקדמים . כמו כן נשים לב שאכן יש פונקצייה חח״ע ועל בין פולינום למערך כזה.
ההוכחה לזה פשוטה :
נגיד על ידי :
זאת פונקצייה על כי לכל פולינום שנבחר מדרגה חסומה נוכל לבנות וקטור מקדמים כזה (פשוט לשים אם יש חזקות שלא נמצאות).
זאת פונקצייה חח״ע כי פולינום מדרגה חסומה יהיו שווים רק אם המקדמים שלהם שווים משמע הקלטים של הפונקצייה (הוקטורים עצמם) שווים גם כן.
נשים לב שהכפלת שני פולינומים שמיוצגים על ידי המקדמים ייקח זמן. (כל מקדם יופל בכל המקדמים של הוקטור השני ולבסוף נסכום הכל).
ייצוג דגימת הנקודות
נוכל לייצג את הפולינום מדרגה חסומה על ידי קבוצה של זוגות סדורים שכל זוג מייצג נקודה ואת ערך הפולינום בהצבת הנקודה.
ברור מאליו ש .
נוכיח שגם כאן יש התאמה חח״ע ועל בין הייצוג לבין הפולינום. כדי להוכיח זאת נשים שבעת הצבת ערך כלשהו ב המקדמים יישארו אותו דבר ולכן נוכל לייצג כל הצבה כזאת כשורה מטריציונית:
כעת , נסמן את וקטור המקדמים כ ויתקיים :
כאשר זה וקטור הפתרונות.
מטריצה זו ידועה בשם Vandermonde matrix.
כעת, אם נוכיח שהיא הפיכה נוכל להגיע לוקטור המקדמים על ידי
וזאת אכן תהיה פונקצייה חח״ע ועל כיוון שאם המטריצה הפיכה משמעות הדבר שיש פתרון יחיד למערכת. (באופן דומה יכלנו להגדיר את הפונקצייה שלנו להיות ההעתקה ליניארית שמייצגת את המטריצה הזאת וזאת תהיה העתקה הפיכה).
נוכל להפוך את מטריצת ונדרמונה למטריצה הפיכה בשלבים הבאים :
כלומר להפחית את השורה הראשונה מכל האחרות , זה יגרום לעמודה הראשונה להתאפס חוץ מהאיבר הראשון. כעת :
נשים לב שהסקלר שמוציאים נכנס בחישוב של הדטרמיננטה
וכעת נוכל לעשות זאת עבור כל שורה ועמודה , באופן כללי הפעולות שנעשה יהיו באופן הבא :
סך הכל נקבל מטריצה משולשית תחתונה עם איברי כל הסקלרים שהוצאנו נקבל שהדטרמיננטה היא מכפלת איברי האלכסון שזה במקרה זה ועם כל הסקלרים זה יצא
ובגלל שאמרנו שכל האיברים בייצוג נקודות שונים אחד מהשני אז הדטרמיננטה שונה מ ולכן המטריצה הפיכה.
מעבר בין ייצוג מקדמים לנקודות
נבחר ערכים שונים ונציב אותם ב . כיוון שכל הצבה דורשת סכימה של מקדמים כפול הערך שהצבנו ואנחנו מבצעים זאת עבור כל ערך שבחרנו. זמן הריצה של פעולת המעבר תהיה .
מעבר בין ייצוג נקודות למקדמים
תהליך זה נקרא אינטרפולציה. ובזכות מטריצת ונדרמונדה שדיברנו עליה תהליך זה מוגדר היטב על הפולינום המיוצג בנקודות. הראנו שיש פונקצייה חח״ע ועל בין הנקודות לבין פולינום מדרגה חסומה כי המטריצה הפיכה. לכן המעבר יסתמך על המטריצה ההופכית והמשוואה
כדי להגיע למקדמים .
האלגוריתם שבו השתמשנו למציאה ההופכית (גאוס ז׳ורדן) + בניית המשוואה ייקח והפתרון , לא בעיה להראות זאת אבל ניתן להכנס לקישור להסבר מעמיק.
אלגוריתם המעבר במקרה הזה ייקח .
הסיבה שזה היא כי גם למונה וגם למכנה מבצעים פעולות כל פעם. ופעולת הסכימה גם היא חסומה ב כלומר סך הכל חסום ב .
פעולות בתצוגת נקודות חיבור : במצב שבוא שני פולינומים מיוצגים על ידי אותם ערכי אז החיבור לוקח
זה נובע ישירות מהגדרת חיבור פולינומים.
כפל : באופן דומה אם קיבלנו מצב כמו הנ״ל אז
זה גם נכון מהגדרת הכפל אבל ההבדל הוא שכאן נצטרך לבחור נקודות זהות ל ו כדי לייצג את . הזמן עדיין ליניארי אבל התנאי נהיה ״כבד״ יותר.
הצבה : אם הנקודה שנרצה להציב היא אחת מהנקודות שיש לנו אז נצטרך רק לבצע חיפוש שבמקרה הטוב הוא תלוי איך שמרנו את הנקודות. במידה ולא, עדיף לעשות אינטרפולצייה.
נשים לב: בשלושת הפעולות אם התנאים שציינתי לא מתקיימים נרצה לעשות אינטרפולציה כלומר מעבר למקדמים ב .
כרגע התהליכים שאנחנו מכירים הם כאלה:
כלומר על פניו נראה שכדאי לנו להשאר עם מקדמים וזהו. נראה שיש שיטות לייעל את התהליכים הרשומים למילה.
כפל מהיר של פולינמום בייצוג מקדמים.
נניח ש הוא חזקה של (נוכל להניח זאת כי במצב שהוא לא פשוט נשלים אותו להיות חזקה של עם מקדמי ) .
נגדיר
כעת נחלק את הפולינומים באופן הבא
כאשר-
נגדיר את מכפלתם להיות
כעת נוכל לחשב את ארבעת המכפלות שיצרנו שהם בעצם פולינומים מדרגה חסומה באופן ריקורסיבי. החיבור של הכל הוא ליניארי וחסום ב והנוסחה הריקורסיבית תיראה כך :
לפי משפט המאסטר האלגוריתם חסום ב .
נוכל לייעל את האלגוריתם אם נשים לב ש:
ויתקיים :
ובהצבת בביטוי למעלה נקבל
כלומר נוכל לחשב את שלושת הפילונים בצורה ריקורסיבית במקום ארבעה, (החיבור פולינומים וכל זה נעשה בזמן ליניארי ) וכן מבצעים פחות פעולות ריקורסיביות :
כעת זמן הריצה הינו .
אז מה יש לנו עכשיו?
אומנם צמצמנו את הכפל בתצוגת מקדמים אבל לא הגענו למקרה הטוב שאנחנו מקבלים במקרה שבו מבצעים כפל בתצוגת נקודות.
על פניו נראה שפעולת ההמרה ממקדמים לדגימה ואז כפל לא יעזור לגם במצב שבו ערכים הנקודות שרוצים להציב בשתי הפולינומים הם זהים בגלל שאינטרפולציה זה החסום ב . עם זאת נראה שאכן ישנו אלגוריתם שמייעל את התהליך הזה לזמן ריצה החסום ב .
FFT
עבור פולינום מדרגה חסומה . נרצה לעבור מתצוגת המקדמים לנקודות על ידי דגימת ערכים שונים והצבת ב .
נחלק את הפולינום ל
כעת יתקיים :
נשים לב גם ש
יש לנו שני פולינום עם דרגה חסומה .
נראה כי נוכל לחשב ריקורסיבית את הפולינומים שבנינו ואז לבצע פעולות כפל וחיבור בזמן ליניארי כך שבסך הכל נקבל נוסחת נסיגה
הקריאות האלו יוצרות 2 בעיות עיקריות
לא מובטח ש למרות שבלי העלאה בריבוע הם היו שונים.
הקטנו את דרגת הפולינום החסומה בריקורסיה אבל מספר האיקסים נשאר אותו דבר ולכן הבעיה הריקורסיבית לא פותרת את המקרה שהדרגה החסומה של הפולינום ומספר ה שווה אלא מצב בו הם שונים. כלומר אנחנו עדיין נצטרך לחשב ערכים בסופו של דבר.
כדי לפתור את הבעיה הנ״ל נגדיר ונוכיח מספר טענות :
תכונת הנגדיות החלשה
יהי חזקה של 2, נאמר שוקטור של נקודות יקיים את תכונת הנגדיות החלשה אם:
כלומר מעין תמונה מראה עם סימן הפוך למשל : מקיים את תכונת הנגדיות החלשה.
איך זה מקדם אותנו?
אכן אנחנו נרצה להציב ערכי שונים אבל בגלל קיום תכונת הנגדיות החלשה אנחנו יכולים לצמצם את המערך בחצי ו גם את מספר ההצבות שנצטרך לעשות כי בהעלה בריבוע נקבל מערך סימטרי לחלוטין גם בסימן.
עם זאת , תכונת הנגדיות החלשה עבור וקטור לא מבטיח שכשנפעיל את הריקורסייה פעם נוספת נקבל שוב וקטור שיקיים תכונה זו. למשל בוקטור הנ״ל שנתנו בחציתו לשתיים והעלאה בריבוע נקבל $$(25,1,9,4)$$ וקטור זה כבר לא מקיים את התכונה שרצינו. לכן הבעיה לא נפתרה לגמרי.
תכונת הנגדיות החזקה
יהי חזקה של 2, נאמר שוקטור של נקודות יקיים את תכונת הנגדיות החזקה אם:
הוקטור מקיים את תכונת הנגדיות החלשה וגם הוקטור כלומר העלאת חציו השמאלי של הוקטור בריבוע, מקיים את תכונת הנגדיות החזקה.
ההגדרות שלנו אכן פותרות את הבעיות שהצגנו למעלה, אבל עכשיו צריך למצוא סדרה מספרים שתקיים את הנ״ל
מספרים מרוכבים וFFT
בוא ננסה לעשות reverse engineering לבעיה שלנו.
נניח והיינו עם איבר אחד בפולינום מדרגה חסומה וערך ה שנרצה לחשב הוא .
קריאה אחת לפני היינו צריכים לחשב פולינום מדרגה חסומה בשתי נקודות כי לקחנו את חצי המערך השמאלי והעלנו אותו בריבוע. במצב זה יתקיים הוא הוקטור של הערכים במציבים. מה שזה אומר שקריאה אחת לפני הוקטור מייצג פולינום מדרגה חסומה עם הערכים כלומר .
במילים, לכל מתקיים שהעלאת בחזקת גם הוא יהיה שורש יחידה מסדר .
הוכחה פשוטה-
על מעגל היחידה .
אנקדוטה : שורשי היחידה מהווים חבורה חילופית ביחס לפעולת הכפל.
וגם
ובאופן כללי
כלומר יש מעין מחזוריות כזאת על מעגל היחידה בהתאם ל .
טענה : וקטור שורשי היחידה מסדר מקיים את תכונת הנגדיות החזקה . הוכחה - שלב א נוכיח קודם שהוא מקיים את תכונת הנגדיות החלשה.
שלב ב נסתכל על הוקטור:
צריך להוכיח שוקטור זה מייצג את שורשי היחידה מסדר . (כלומר העלאה בריבוע של החצי הראשון של שורשי היחידה מסדר ) .
שזה שורש יחידה מסדר .
שלב ג נוכיח את תכונת הנגדיות החזקה באינדוקצייה על באשר הוא חזקה מדויקת של . בסיס : מקיים מהגדרה. צעד : נניח שהטענה נכונה לכל ונוכיח עבור .
הוקטור של שורשי היחידה מסדר מקיים את תכונת הנגדיות החלשה כפי שהראנו, כעת ניקח את חציו השמאלי ונעלה בריבוע וזה לפי מה שהוכחנו מייצג את שורשי היחידה מסדר ולפיכך הם בעצמם מקיימים את תכונת הנגדיות החזקה לפי הנחת האינדוקצייה.
נשים לב שקיבלנו במתנה את העובדה ש שורשי היחידה מסדר הם ערכים שונים .
האלגוריתם FFT
כעת משמצאנו סדרת מספרים שתקיים את התנאים שלנו נוכל לכתוב אלגוריתם פסודו לבעיה שלנו
הסבר :
נרצה לחשב את ערכי הפולינום על ידי הצבת שורשי היחידה מסדר . האלגוריתם יחזיר וקטור
כאשר
מקרה בסיס לריקורסיה- וקטור בגודל , במקרה זה מחזירים את המקדם היחיד בוקטור כיוון שאין מה להציב עבורו זה פולינום קבוע.
בכל מצב אחר נפעיל את האלגוריתם על על מנת לחשב את הפולינום בהצבת שורשי היחידה מסדר . כלומר הקריאה הריקורסיבית מחזירה:
באופן דומה :
עכשיו ניתן לחשב את הערכים
לפי הנוסחא שבנינו ונוסחת הנגדיות החלשה.
בגלל התכונות הנ״ל ניצחנו את הבעיות שהיו לנו כשחשבנו על האגוריתם הזה מלכתחילה . על כל תת וקטור שמאלי נצטרך להציב רק חצי מהערכים כדי לקבל את החצי השני.
זמן ריצה:
באופן הזה זמן הריצה אכן תואם את הנוסחה הריקורסיבית ונקבל
inverse FFT
נניח שהעברנו שני פולינומים מייצוג מקדמים לייצוג דגימה על ידי , והכפלנו את שניהם בזמן ליניארי (כי משתמשים בשורשי היחידה שזה אותם נקודות). כעת קיבלנו פולינום בתצוגת נקודות. כעת נרצה להעביר את לייצוג מקדמים:
יש לנו
ואם אנחנו זוכרים מתקיים
כאשר הוא וקטור המקדמים.
נשים לב שזה בעצם עמודה ושורה שכולם .
כדי למצוא את וקטור המקדמים נשאלת השאלה מהי הפונקצייה ההופכית יתקיים כי :
נשים לב שבגלל שמדובר בחבורה אז קיים ההופכי ואמרנו כבר מהו למעלה זה בעצם פשוט כלומר עדיין מדובר בשורש יחידה מסדר .
גם זאת מטריצה ונדרמונדה ולכן תהליך ההמרה לכיוון השני הוא גם .
נוכיח שזאת אכן המטריצה ההופכית -
ראשית ארצה להוכיח טענת עזר :
נסמן את מטריצה ונדרמונדה עם שורשי היחידה מסדר כ ונרצה להוכיח שכאשר מציבים במקום את נקבל
האלמנט ה של המטריצה יהיה לפי כפל מטריצות :
כעת יתקיים שבכל נקודה שבה נקבל כיוון שאנחנו סוכמים סך הכל פעמים.
אפשר להסתכל על זה גם כסדרה חשבונית ונקבל
אחרת, אנחנו יודעים שלכל איבר בשורשי יחידה יש אחד שיבטל אותו בסכום ולכן נקבל . כלומר קיבלנו את .
מה שאומר ש
שזה בידיוק מה שרשמנו למעלה.
כעת רק נרצה לתאר בהליך פסודו קוד את האלגוריתם שמטרתו תהיה לבצע אינטרפולצייה הפוכה, ממצב של תצוגה לפי נקודות למצב של תצוגה לפי מקדמים :
IFFT([A(w^0), A(w^1),....,A(w^n-1)]):
return FFT(A(w^n),A(w^n-1),...., A(w))) / n
הרעיון הוא שהדרך להגיע לוקטור המקדמים באמצעות ההופכית שהראנו שגם היא מטריצת ונדרמונדה עם שורשי יחידה מסדר ולכן נוכל לנצל את התכונה הזאת כדי להפעיל את אלגוריתם כאשר מתייחסים למקדמים בסדר הפוך (כפי שהם מסודרים במטריצה ).
שימוש ב FFT
כעת משלמדנו על איך האלגוריתם עובד נרצה להסתכל עליו כמעין קופסה שחורה כדי לפתור בעיות אחרות.
דרך א : נוסיף מקדמי לפולינום כדי להשוות בדרגות ולאחר מכן נריץ fft. דרך ב: כפל פולינומים בשיטה הנאיבית דרך ג : נבדוק ובהתאם לזה נריץ את האלגוריתם הטוב.
נרצה פתרון ב . במבנה נתונים היינו נעזרים בחלוקת המבנה כדי לעשות אלגוריתם כלשהו בזמנים שכאלה. נעשה את אותו דבר על הפולינום.
נניח כי אחרת, פשוט נשלים את עם מקדמי עד שהתנאי יתקיים (השלמה של לכל היותר איברים).
כעת הפולינום ייראה כך:
כעת , נגדיר
זאת חלוקה שמכסה את הפולינום ונוכל לסמנו ככה:
כעת חילקנו את הפולינום מדרגה חסומה ל פולינומים מדרגה חסומה ונוכל להכפיל כל אחד מהם ב באמצעות .
זמן ריצה : האלגוריתם מבצע פעולות כפל של פולינומים שדרגתפ חסומה ב סך הכל זמן הריצה
בנוסף נדרשת סכימה של התוצאות ב שהוא פולינום מדרגה ויש תתי פולינומים לסכום כלומר הסכום הוא בזמן ליניארי .
שימו לב: פעולת כפל של פולינום בפולינום היא בסה"כ הזזה של כל מקדם בפולינום להיות המקדם בםולינום המכפלה. לכן, זמן חישוב המכפלה הוא לינארי במספר המקדמים השונים מ־0 של P.
בעיית חישוב מרחקי האמינג בין טקסט לתבנית
הגדרה : בעית התאמת המחזורות Pattern Matching - קלט - מחרוזת באורך ומחרוזת באורך שמייצגת תבנית. פלט- כל המקומות ב ש מופיע בהם.
הגדרה : Hamming Distance - לשתי מחרוזות באורך זהה מרחק ההאמינג של הוא מספר האינדקסים בהם שונים כלומר:
לדוגמה :
הגדרה : בעיית חישוב מרחקי האמינג בין טקסט לתבנית קלט - מחרוזת באורך ומחרוזת באורך פלט - $$\forall_{i\in [0, n-m]} : Ham(P, T[i+1\dots i+m])$$
כאשר כלומר הא״ב הבינארי.
אלגוריתם Fischer Paterson
נסמן את הטקסט באופן הבא ואת התבנית מאפשר לבצע כפל של פולינומים בזמן ליניארי. ננסה להסתכל על על כפל בצורה מופשטת המתארת פעולה בינארית בין שתי אובייקטים ומחזירה מספר. כפל פולינומים דומה לכפל של מספרים מרובה הספרות. אפשר להסתכל על ספרה כמקדם של הבסיס בחזקת למשל עבור המספר הספרה היא המקדם של כמו בפולינום . נשים לב שהייצוג של חישוב מספרים בכפל ארוך גם הוא יעבוד במקרה של פולינומים. זה לא משנה ש FFT מחשב את התוצאה באמצעי שאינו כפל ארוך מה שחשוב זה רק עניין הייצוג. מה שיקרה בפועל באלגוריתם שלנו זה שנבין אין זה נראה בייצוג של כפל ארוך ולאחר מכן נשתמש ב FFT אחרי שנעביר את המספר הבינארי לייצוג פולינומי בשיטת מקדמים.
נסתכל על כפל ארוך בין שני מספרים/פולינומים המייצגים את הטקסט והתבנית.
נכפול את ב כשהסימון הזה מייצג את היפוך סדר האותיות. למשל אם נסתכל על הפולינומים ונכפול אותם.
הסיבה שכופלים בסדר הפוך היא בגלל איך שעובד חישוב המקדם ה בפולינום המכפילה. כפי שנאמר למעלה המקדם זה וההתקדמות הזאת אחורה אינה טובה לנו כדי לתאר התאמת מחרוזת כפולינום. נרצה שההיסט תמיד יהיה ממוקם כמו שצריך ובreverse זה מה שקורה.
נשים לב שבכל אחת משלוש העמודות האמצעיות אנו נקבל סכום של מכפלת אותיות מקבילות בתבנית ובטקסט, כאשר שמים את התבנית מול הטקסט בהיסטים שונים. אלה יתנו את המקדם במיקום מסויים. הסכום לכאורה אמור לתאר את מספר ההתאמות בטקסט בהיסט מסויים.
נרצה שהסכימה הזו תהיה משמעותית אנחנו נדאג לכך שהסכום יהיה בדיוק מספר המקומות בהם התבנית מתאימה לטקסט.
לצורך כך, נרצה שה"כפל" בין שני תווים יקיים אם ו אם .
בטבלה זה ייראה כך
היינו יכולים לעשות כפל בצורה הטריוויאלית ולחשב את הפעולה הנ״ל שרצינו בזמן ואז את הבדיקה הנ״ל בזמן . אבל אנחנו רוצים זמן יותר טוב מזה באמצעות אלגוריתם . הבעיה היא שהאלגוריתם הזה תומך בכפל פולינומים כאשר הכפל מוגדר ככפל רגיל בשדה המרוכבים ולא באופן שתיארנו אותו עכשיו (כלומר יהיה לנו בעיות עם מחרוזות שנראות ככה למשל).
כדי להתגבר על הבעיה הזאת נפריד את החישוב לשני חישובים.
רצינו לספור את כל המקומות בהם תו התבנית זהה לתו בטקסט בהיסט המתאים. כל מקום כזה עונה בידיוק על אפשרות אחת מתוך השניים
בשביל הראשון נוכל להשתמש בפועל הכפל הרגילה בין שני מקדמים
בגלל שזאת פעולת הכפל הרגילה, נוכל להשתמש באלגוריתם באופן מיידי.
למקרה השני נזדקק לפעולה הבאה :
כדי לקבל פעולה כזאת באמצעות הכפל הרגיל פשוט נהפוך את הביטים בטקסט ואת הביטים בתבנית ובמצב זה נקבל בידיוק את מה שרצינו
סך הכל נצטרך לעשות שתי פעולות וסכימה של תוצאותיהן, נדע כמה התאמות יש בין התבנית לטקסט בכל היסט. נשים לב שאת ההתאמות נבדוק במקדמים עד בגלל שרק במצבים האלה אין ״זליגה״ של היסט של מאורך המחרוזת . המקדם ה בפולינום התוצאה, ייתן לנו את מספר ההתאמות כאשר ההיסט התחיל באינדקס .
לבסוף כל מה שצריך זה לקחת את המספר ההתאמות ולחסר אותו מאורך התבנית כדי לקבל את מספר אי ההתאמות, שזה בידיוק מרחק האמינג. כעת צריך לבדוק האם באחד האינדקסים מספר אי ההתאמות הוא 0 ואז אכן מצאנו התאמה.
סך הכל זמן הריצה עם האלגוריתם מהתרגיל הקודם.
מרחק האמינג על א״ב גדול יותר
נראה גם כיצד ניתן לחשב את מרחק האמינג על א״ב מהצורה
בדומה לבעיית המרחק הרגילה, נגדיר את הטקסט כפולינום וגם את התבנית . המשמעות היא שלכל בגבולות של אורכי הטקסט והתבנית בהתאמה יתקיים ש הוא המקדם של הפולינום ב ו יהיה ב . כלומר ייצוג לפי מקדמים.
נשים לב שטבלת הכפל הרגילה תיתן לנו
T/P
0
1
2
0
0
0
0
1
0
1
2
2
0
2
4
זה לא ממש עוזר לנו להבין האם יש התאמה בדומה לכפל הרגיל כאשר הא״ב היה רק .
באלגוריתם המקורי מה שעשינו היה להחליף בין 1 ל 0 על ידי פעולת . כעת מה שנעשה הוא פשוט 3 החלפות ל0 כדי שכל החלפה נקבל התאמה לספרה אחרת, כלומר אם באלגוריתם המקורי עשינו פעמיים לכל ספרה. כעת נעשה 3 פעמים.
בכפל הראשון נגדיר את ואז נקבל התאמה עבור הספרה 1.
בפעם השנייה נגדיר את ו ואז נקבל התאמה עבור הספרה
לבסוף נגדיר ואת כדי לקבל התאמה עבור הספרה 2.
נזכיר שכופלים כל פעם ונשים לב שאת ההחלפות הנ״ל עושים גם על וגם על למעשה אפשר לבטא את כפל הפולינומים שנעשה באופן כללי על ידי:
כאשר הם המחרוזות לאחר ההחלפה של כל התווים ל פרט ל.
כעת קיבלנו 3 פולינום והאלגוריתם נשאר אותו דבר, מכאן, מבצעים סכימה באינדקסים בהם אין גלישה של התבנית עד ונקבל את מספר ההתאמות,
כל אינדקס נחסר מ כדי לקבל את מספר אי ההתאמות.
זמן הריצה זהה לזמן ריצה המקורי שהוא . הסיבה שזה הוא בגלל שהכפלנו פולינומים מדרגות שונות.
3sum
קלט: מערך של מספרים שלמים.
פלט: flag האם קיימים שלושה מספרים כך ש .
א. בזמן ריצה - נשתמש באלגוריתם שכולל מיון של המערך ולאחר מכן נרוץ על איברי המערך ולכל איבר נבדוק האם קיימים זוג איברים שהסכום שלהם ייתן את . זה יקרה על ידי החזקת מצביע בתחילת המערך וסופו (נזכיר שהוא ממויין בשלב זה) ואם הסכום גדול מידי נזיז אחורה את המצביע לסוף המערך אחרת נזיז ימינה את הפוינטר שבתחילת המערך.
ב. על ידי שימוש ב : (זה יעבוד בהינתן שמספר האיברים חסום בגודל מאוד גדול למשל )
נייצר מערך באורך שכולו אפסים. כעת, לכל נכניס . נוכל להתייחס למערך הזה כפולינום בצורת מקדמים למשל עבור המערך הפולינום יהיה .
כעת נסמן שהגענו אליו באמצעות כפל של בעצמו עם . זמן הריצה הזה ייקח .
כעת נוכל פשוט לרוץ על איברי המערך ולבדוק האם . במצב זה המשמעות היא שהיו שתי חזקות שסכומם יצא . כלומר בצורה כללית יותר אם קיימים שסכומם ייתן משמעות הדבר שקיים בפולינום איבר מהצורה ששניהם שייכים ל . אם זה לא מתקיים נחזיר false.
שאלת הקורדינטות
בהינתן שתי קבוצות שכל אחת מהן מכילה נקודה דו מימדית מ וגם בקבוצה זה תמיד יהיה ובקבוצה זה תמיד יהיה .
נגדיר שזה הקטע המחבר את . כמו כן, נגדיר את הקבוצה
כמו כן בדומה לסעיף הקודם נניח שערכי חסומים מלמעלה על ידי . נרצה למצוא אלגוריתם שמחשב את מספר נקודות החיתוך השונות ב עם ציר ה .
כדי לפתור את זה נשתמש בשיטה מהתרגיל הקודם כלומר נייצג את על ידי פולינום באמצעות השמה של באינדקס . באופן פורמלי :
נגדיר בידיוק אותו דבר על וכעת נבנה פולינום חדש . את זה נעשה בעזרת האלגוריתם . התשובה תהיה מספר המקדמים השונים מ 0 ב
למה זה נכון?
נשים לב שבגלל הנתון של החסמים בציר ה אנחנו מקבלים שלכל 2 נקודות כאשר אחת מ והשנייה מ יתקיים שהחיתוך עם ציר ה היא בידיוק באמצע הישר הזה. כלומר, שיעור ה של נקודת המפגש תהיה . המשמעות היא שהפתרון טמון בעובדה שאנחנו מחפשים בעצם את בעיית על כלומר אנחנו מחפשים ערכי שקיימים שיתנו את הסכום הנ״ל. זה יהיה שקול ללחפש ישירות ו כך ש כיוון שאלו מספרים שלמים חסומים ולכן אם מצאנו מספר שסכומו ייתן אז בהכרח יהיה בתחום והוא יתאים לנו.
נוכל לטעון אם כן, שקיים בתחום שציינו שיקיים את זה אמ״מ במקדם של בפולינום שציינו יהיה שונה מ0.
זה נובע מהוכחת הנכונות של בעיית . אם קיים סכום כזה אז המקדמים של יהיו . ובכפל פולינומים נקבל כלומר בפולינום בייצוג מקדמים יהיה באינדקס את הערך . זמן הריצה הוא .