Объясните однострочник Python
Решил задачку на HackerRank. Задачка такова: на вход подается число n, нужно вывести число Фибоначчи с порядковым номером n
В дискуссиях нашел вот такой пример:
fib = lambda n:pow(2<<n,n+1,(4<<2*n)-(2<<n)-1)%(2<<n)
print(fib(int(input())))
Результат у этого кода правильный, но как он работает я решительно не понимаю
Ответы (1 шт):
Автор решения: aleksandr barakin
→ Ссылка
lambda n:pow(2<<n,n+1,(4<<2*n)-(2<<n)-1)%(2<<n)
по поводу синтаксических конструкций:
- синтаксис выражения lambda:
"lambda" [параметры] ":" выражение. т.е.: n— это параметрpow(2<<n,n+1,(4<<2*n)-(2<<n)-1)%(2<<n)— выражениеpow(base, exp[, mod])— синтаксис функции, которая производит возведениеbaseв степеньexpс опциональным делением по модулю наmod(т.е., получаем остаток от деления наmod).2<<n— это аргументbasen+1— это аргументexp(4<<2*n)-(2<<n)-1— это аргументmodx<<y— операция бинарного сдвига, эквиватент:x * 2 ** y, а для2<<nэквивалет:2 ** (n + 1).4<<2*n— операция сдвига имеет более низкий приоритет, чем умножение, потому эквивалент:4 * 2 ** (2 * n), или иначе:2 ** (2 * n + 2)
теперь по поводу общего смысла выражения:
остаток от деления 2(n+1)(n+1) на 2(2*n+2)-2(n+1)-1 делим ещё раз на 2(n+1}, результатом будет остаток от второго деления.
математический же смысл
стоит услышать из уст автора первоначальной:
An integer formula for Fibonacci numbers. by Paul Hankin
и промежуточной версий:
Fun with Fibonacci numbers. by Fare Rideau