Объясните однострочник 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 — это аргумент base
  • n+1 — это аргумент exp
  • (4<<2*n)-(2<<n)-1 — это аргумент mod
  • x<<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

отчасти схожие вопросы:

→ Ссылка