dask писал(а):
maxal писал(а):
На самом деле,
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
вычислять необязательно. Вместо этого можно воспользоваться формулой
![$F_{m+n} = F_{m+1} F_{n} + F_{m} F_{n-1}$ $F_{m+n} = F_{m+1} F_{n} + F_{m} F_{n-1}$](https://dxdy-01.korotkov.co.uk/f/8/a/8/8a86e555e3fcfcc2c49c2214f80171c582.png)
и удваивать индекс чисел Фибоначчи до тех пор, пока не будет получено число
![$F_{2^k}$ $F_{2^k}$](https://dxdy-03.korotkov.co.uk/f/e/f/8/ef8413c9d5bd0c84555e3cdcef0fc7fb82.png)
большее заданного, затем вычислить
![$F_{2^{k-1} + 2^{k-2}$ $F_{2^{k-1} + 2^{k-2}$](https://dxdy-03.korotkov.co.uk/f/6/0/0/600daea0285147fde86e23d1589a32b882.png)
(по той же формуле) и т.д. По сути - это будет вариант дихотомии (двоичного поиска) на числах Фибоначчи.
Все же получается последовательный перебор.
Где же это последовательный?
![$F_{2^k}$ $F_{2^k}$](https://dxdy-03.korotkov.co.uk/f/e/f/8/ef8413c9d5bd0c84555e3cdcef0fc7fb82.png)
(и все промежуточные степени) вычисляется за
![$O(k)$ $O(k)$](https://dxdy-02.korotkov.co.uk/f/1/c/8/1c8ca3cc214952a67b2f68bfaf0225aa82.png)
арифметических операций. Каждое последующее число Фибоначчи при дихотомии - за O(1) операций каждое, и весь поиск займет
![$O(k)$ $O(k)$](https://dxdy-02.korotkov.co.uk/f/1/c/8/1c8ca3cc214952a67b2f68bfaf0225aa82.png)
шагов.
Нетрудно видеть, что
![$k=O(\log\log n)$ $k=O(\log\log n)$](https://dxdy-02.korotkov.co.uk/f/1/c/1/1c1771e928e5c9ea3f74f14961f0c7bf82.png)
(если точнее, то что-то типа
![$k=\lceil\log_2 \log_{\phi} n\sqrt{5}\rceil$ $k=\lceil\log_2 \log_{\phi} n\sqrt{5}\rceil$](https://dxdy-02.korotkov.co.uk/f/d/f/8/df86d74946e7a1df8887b73b9b53a90282.png)
). Вот и получается, что суммарная сложность такого поиска равна
![$O(\log\log n)$ $O(\log\log n)$](https://dxdy-04.korotkov.co.uk/f/f/9/a/f9a253710e335d4230a1989131b148f682.png)
арифметических операций.
Если умножение чисел длины
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
производить за
![$O(m\log m)$ $O(m\log m)$](https://dxdy-02.korotkov.co.uk/f/1/0/f/10fcd14ec9b043c604b088f89400d7aa82.png)
машинных операций (понятно, что сложение и сравнение также вписываются в эту оценку), то суммарную сложность можно оценить величиной
![$O(\log n(\log\log n)^2)$ $O(\log n(\log\log n)^2)$](https://dxdy-04.korotkov.co.uk/f/b/7/1/b71d79144c7352ba9f410e050c215c1282.png)
машинных операций.
Никаких логарифмов вычислять не нужно, вся работа сводится к операциям сложения, умножения и сравнения целых чисел (примерно той же длины что и
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
).
Добавлено спустя 15 минут 34 секунды:
Так как придется хранить всего лишь
![$O(k)$ $O(k)$](https://dxdy-02.korotkov.co.uk/f/1/c/8/1c8ca3cc214952a67b2f68bfaf0225aa82.png)
чисел, то расход памяти в данном алгоритме можно оценить как
![$O(\log n\log\log n)$ $O(\log n\log\log n)$](https://dxdy-02.korotkov.co.uk/f/5/e/8/5e8c299055de31856fc1003ef0fe05a082.png)
битов.
Добавлено спустя 17 минут 1 секунду:
P.S. Лучше работать не напрямую с числами Фибоначчи, а с матрицами вида
Понятно, что произведение матриц такого вида опять же является матрицей такого вида.