במאמר זה אני מתאר את הכפל של שני פולינומים בזמן O (nlogn) . זה משתמש באלגוריתם טרנספורמציה מהירה של פורייה (FFT).
ריבסט מתאר
הספר "מבוא לאלגוריתמים" מאת קורמן, לייזרסון וריבסט מתאר את הכפל של שני פולינומים בזמן O (nlogn). כאן, אתאר גרסה של השיטה בה השתמשו.
ראשית, צחצוח על כמה יסודות:
1. A (x) = a_0 + a_1 (x) + a_2 (x ^ 2) +..... + a_ (n-1) (x ^ (n-1)) הוא פולינום של דרגה n-1.
2. כפל הפולינומים A (x) ו- B (x) כלומר C (x) = A (x) B (x) לוקח זמן O (n ^ 2).
3. מציאת A (p) היא באמצעות החלפת p במקום x בפולינום: A (p) = a_0 + a_1 (p ^ 2) +..... + a_ (n-1) (p ^ (n -1)). זה לפי הכלל של הורנר הוא: A (p) = a_0 + p (a_1 + p (a_2 +..... + p (a_ (n-1))...). זה לוקח O (n).
צורת מקדם: (a_0, a_1, a_2,....., a_ (n-1)). צורת נקודת ערך: {(x_0, y_0), (x_1, y_1),... (x_n-1, y_n-1)}, כאשר y (x_i) = A (x_i).
טפסים לוקחים
5. המרה מצורות מקדם לנקודת ערך נקבעת ל- O (n ^ 2) אפילו בשימוש ב"כלל הורנר "מכיוון שצריך למצוא את הערך A (x) בנקודות n.
6. שורש nth מורכב של אחדות הוא מספר מורכב w * כזה ש w * ^ n = 1.
השורש ה-עיקרי
7. שורשי האחדות n הם: w ^ 0, w ^ 1, w ^ 2,...., w ^ n-1. w = e ^ (2 * pi * i / n) נקרא השורש העיקרי של האחדות וכל שורשי n הם כוחות של w זה.
8. מחזוריות: w ^ (k + n) = w ^ k.
עם רקע אנחנו יכולים להתחיל.
גב סמוי
להכפלת שני הפולינומים A (x) ו- B (x) הניתנים בצורות שיתופיות, אנו ממירים אותם תחילה לצורות ערך נקודתיות. הכפל בצורה נקודתית לוקח O (n). ואז אנו מסתירים בחזרה לצורה השיתופית. עם זאת, המרה מ- Co-יעיל לנקודת ערך לוקח O (n ^ 2) כאמור ב 5. אבל בבחירת הנקודות x_0, x_1,..... x_ (n-1) בזהירות, אנו יכולים להשיג זאת. ב- O (nlogn).
נקודות אלה אשר אנו עומדים לבחור יהוו את שורשי האחדות התשיעית. זה מה שהוא Transform Fourier Fourier (DFT).
תנאים מוזרים
כעת, A (x) = a_0 + a_1 (x) + a_2 (x ^ 2) +..... + a_ (n-1) (x ^ (n-1)). ניתן לפצל את זה לשני פולינומים: הראשון שמכיל את המונחים הראשונים n / 2 והשני שמכיל את המונחים השני / השני. הספר "מבוא לאלגוריתמים" מתאר את הפיצול כמונחים אחידים ומשונים. כאן אנו יכולים להגיע לאותה תוצאה, אך באופן שונה במקצת.