בהמשך לפעם הקודמת, אם מבקשים מאיתנו לכתוב קוד שמחשב את המספר הפיבונאצ’י הnי, בד”כ נכתוב משהו כזה:
|
|
זה מחשב את המספר הפיבונאצ’י הnי בסיבוכיות $ O \left(n\right) $.
מסתבר שגם כאן אפשר לחשב בצורה יותר מהירה: יהי $ \varphi $ מספר המקיים $ \varphi^2 = \varphi + 1 $ (למשוואה זו קוראים משוואת חתך הזהב ולאיבר החיובי המקיים משוואה זו קוראים חתך הזהב)
אזי מסתבר כי $ \varphi^n = F_n \cdot \varphi + F_{n - 1} $ כאשר $ F_n $ הוא מספר הפיבונאצ’י הn. (הוכחה פשוטה באינדוקציה)
כעת מתקיים:
$ \varphi^{n + m} = F_{n + m} \cdot \varphi + F_{n + m - 1} = \\ \varphi^{n + m} = \varphi^n \cdot \varphi^m = \\ \left(F_n \cdot \varphi + F_{n - 1} \right) \cdot \left(F_m \cdot \varphi + F_{m - 1} \right) = \\ F_n \cdot F_m \cdot \varphi^2 + F_{n - 1} \cdot F_m \cdot \varphi + F_n \cdot F_{m - 1} \cdot \varphi + F_{n - 1} \cdot F_{m - 1} = \\ F_n \cdot F_m \cdot \varphi + F_n \cdot F_m + F_{n - 1} \cdot F_m \cdot \varphi + F_n \cdot F_{m - 1} \cdot \varphi + F_{n - 1} \cdot F_{m - 1} = \\ (F_n \cdot F_m + F_{n - 1} \cdot F_m + F_n \cdot F_{m - 1}) \cdot \varphi + (F_n \cdot F_m + F_{n - 1} \cdot F_{m - 1}) $
כלומר
$ F_{n + m} \cdot \varphi + F_{n + m - 1} = \\ (F_n \cdot F_m + F_{n - 1} \cdot F_m + F_n \cdot F_{m - 1}) \cdot \varphi + (F_n \cdot F_m + F_{n - 1} \cdot F_{m - 1})$ $ F_{n + m} = F_n \cdot F_m + F_{n - 1} \cdot F_m + F_n \cdot F_{m - 1} \\ F_{n + m - 1} = F_n \cdot F_m + F_{n - 1} \cdot F_{m - 1} $
אפשר לחשב בצורה דומה למה שראינו פעם שעברה את הפיבונאצ’י הn ע"י הסחבות עם ארבע זוגות של מספרים (הנוכחי והקודם של התוצאה והנוכחי והקודם של החזקה הנוכחית של 2).
אבל מאחר ויותר נוח לעבוד כמו בני אדם עם חזקה של מספר בודד, אפשר ליצור struct שמייצג זוג מספרי פיבונאצ’י:
|
|
כעת נוכל לחשב את הפיבונאצ’י הn בצורה דומה לפעם הקודמת: אנחנו מחשבים את $ \varphi^n $ בעזרת המחלקה של FibonacciPair בצורה דומה לזו של פעם קודמת:
|
|
נראה לי שזה אולי טיפה יותר מפתיע ממה שראינו פעם קודמת… מספר הפיבונאצ’י ה$ n $ ב$ \log{n} $!
המשך יום פיבונאצ’י טוב.