Числа Фибоначчи
Числа Фибоначчи начинаются с f(1) = 1
и f(2) = 1
(некоторые входят , f(0) = 0
но это не имеет никакого отношения к этой проблеме. Тогда для n > 2
, f(n) = f(n-1) + f(n-2)
.
Соревнование
Ваша задача - найти и вывести n
-е положительное число, которое может быть выражено как произведение чисел Фибоначчи. Вы можете выбрать 0 или 1, в зависимости от того, что вам больше подходит, но вы должны указать это в своем ответе.
Кроме того, ваш ответ должен вычислить сотый срок за разумное время.
Testcases
n result corresponding product (for reference)
1 1 1
2 2 2
3 3 3
4 4 2*2
5 5 5
6 6 2*3
7 8 2*2*2 or 8
8 9 3*3
9 10 2*5
10 12 2*2*3
11 13 13
12 15 3*5
13 16 2*2*2*2 or 2*8
14 18 2*3*3
15 20 2*2*5
16 21 21
17 24 2*2*2*3 or 3*8
18 25 5*5
19 26 2*13
20 27 3*3*3
100 315 3*5*21
Ссылки
code-golf
number-theory
fibonacci
Дрянная Монахиня
источник
источник
7
не может быть выражено как произведение чисел Фибоначчи. Следовательно,1
первое требуемое число - это1
,2
есть2
, ...,6
есть6
, но7
есть8
.corresponding product
" только для разъяснения. Ваш код должен только вывести "result
".Ответы:
Желе ,
26242321 байтПопробуйте онлайн!
Как это устроено
источник
Юлия, 79 байт
Попробуйте онлайн!
Задний план
В « Продвинутых задачах и решениях» H-187: Фибоначчи - это квадрат , предлагающий показывает, что
где L n обозначает n- е число Лукаса , и это - наоборот - если
тогда n - это число Фибоначчи, а m - это число Лукаса.
Как это устроено
Мы определяем бинарный оператор
<|
для наших целей. Он не определен в последних версиях Julia, но все еще распознается синтаксическим анализатором как оператор.Когда вызывается только с одним аргументом ( n ),
<|
инициализирует k как 1 . Хотя n положительно, оно вычитает ! K ( 1, если k - произведение чисел Фибоначчи, 0, если нет) из n и рекурсивно вызывает себя, увеличивает k на 1 . Как только n достигает 0 , желаемое количество продуктов найдено, поэтому<|
возвращается предыдущее значение k , то есть ~ -k = k - 1 .Унарный оператор
!
, переопределенный как тест для числовых произведений Фибоначчи, выполняет свою задачу следующим образом.Если k = 1 , k является произведением чисел Фибоначчи. В этом случае мы возвращаем возвращаемое значение
any(...)
до степени ~ -k = k - 1 = 0 , поэтому результат будет равен 1 .Если k> 1 , результатом будет значение
any(....)
, которое будет возвращать true тогда и только тогда, когда предикат√(5i^2+[4,-4])%1∋k%i<!(k÷i)
возвращает true для некоторого целого числа i, такого что 2 ≤ i ≤ k .Цепные условия в предикате выполняются, если
k%i
принадлежит√(5i^2+[4,-4])%1
иk%i
меньше, чем!(k÷i)
.√(5i^2+[4,-4])%1
берет квадратный корень из 5i 2 + 4 и 5i 2 - 4 и вычисляет их вычеты по модулю 1 . Каждый модуль равен 0, если соответствующее число является идеальным квадратом, и положительное число меньше 1 в противном случае.Поскольку
k%i
возвращает целое число, оно может принадлежать массиву модулей только в том случае, если k% i = 0 (т. Е. K делится на i ) и хотя бы один из 5i 2 + 4 и 5i 2 - 4 является идеальным квадратом (т. Е. я - число Фибоначчи).!(k÷i)
рекурсивно вызывает 1 с аргументом k ÷ i (целочисленное деление), которое будет больше 0, если и только если k ÷ i является произведением чисел Фибоначчи.По индукции ,! имеет желаемое свойство.
источник
Python, 90 байт
Основная функция
g
выводит произведениеk
Фибоначчи, 1-индексированное. Это вычисляетсяg(100)
как315
почти мгновенно. Это происходит с общим рекурсивным рецептом подсчета чисел вn
поискахk
экземпляров, которые удовлетворяют функцииf
. Каждый такой экземпляр понижает необходимое количество,k
пока не достигнет0
.Вспомогательная функция
f
проверяет число на наличие произведения Фибоначчи. Он рекурсивно генерирует числа Фибоначчи в своих необязательных аргументахa
иb
. Он выводит «да», если выполняется одно из следующих условий:n<2
, Это подразумеваетn==1
тривиальное произведение)n%a<f(n/a)
, Это требуетn%a==0
иf(n/a)==True
, т. Е.n
Это кратное число Фибоначчиa
, и устранение этого фактора по-a
прежнему дает продукт Фибоначчи.n-a>0<f(n,b,a+b)
, эквивалентноn>a and f(n,b,a+b)
. Проверяет, что текущее число Фибоначчи, которое тестируется, по меньшей мереn
, не работает , и работает большее число Фибоначчи. Спасибо Деннису за 2 сохраняющих байта, использующих вместо неравенства короткое замыканиеand
.Функция
g
может быть на один байт корочеif
g(k)
всегда самое большееk*k
, что я не уверен, асимптотически верно. Границы2**k
достаточно, но тогда онаg(100)
занимает слишком много времени. Может быть, вместо этогоg
можно сделать рекурсивный изf
.источник
g(k)
превышает,k*k
когдаk = 47000
и выше.Perl 6 ,
9593 байта(0 основанный индекс)
Тест:
Объяснение:
источник
Python 3,
175170148 байтСпасибо @Dennis за -22 байта
Принимает ввод из STDIN и печатает в STDOUT. Это одноиндексное. Вычисление 100-го члена занимает примерно одну десятую секунды.
Как это устроено
Попробуйте это на Ideone
источник
Python 2,
120107 байтПроверьте это на Ideone .
Как это устроено
Мы инициализируем F как кортеж (2, 3) (первые два числа Фибоначчи больше 1 ), k как 0 и n как целое число, считанное из STDIN.
Пока n положительно, мы делаем следующее:
Дозапись следующее число Фибоначчи, вычисляется как F [K] + Ж [-1] , то есть, сумма двух последних элементов F до кортежа F .
Инкремент к .
Вычтите g (k) из n .
g возвращает 1 тогда и только тогда, когда k является произведением чисел Фибоначчи, поэтому, когда n достигает 0 , k является n- м числом Фибоначчи, и мы печатаем его в STDOUT.
г достигает своей цели следующим образом.
Если k равно 1 , это произведение чисел Фибоначчи, и
1/k
мы уверены, что мы возвращаем 1 .Если к больше чем 1 , мы называем
g(k/i)
рекурсивно для всех чисел Фибоначчи I в F .g(k/i)
рекурсивно проверяет, является ли k / i произведением числа Фибоначчи. Еслиg(k/i)
возвращается 1 и i делит k равномерно, k% i = 0 и условиеk%i<g(k/i)
выполняется, поэтому g вернет 1 тогда и только тогда, когда существует число Фибоначчи, такое, что k является произведением этого числа Фибоначчи и другого произведения чисел Фибоначчи.источник
JavaScript (ES6), 136
Таким образом, довольно медленно играю в гольф, вычисляя термин 100 за 8 секунд на моем ПК.
Меньше гольфа и быстрее (избегая
eval
)Тестовое задание
источник
Haskell, 123 байта
Очень ленивый, бесконечный!
Возможно, это не самый короткий путь, но мне пришлось попробовать этот подход, обобщение довольно известного метода для вычисления списка чисел Хэмминга.
f
список чисел Фибоначчи, начинающийся с 2. Для краткости скажем, что lol (список списков) - это бесконечный список упорядоченных бесконечных списков, упорядоченных по их первым элементам.m
это функция для объединения LOL, удаления дубликатов. Он использует две вспомогательные функции инфикса.?
вставляет бесконечный отсортированный список в лол.#
удаляет значение из lol, которое может появиться в качестве заголовка первых списков, повторно вставляя оставшийся список с помощью?
.Наконец,
l
список чисел, являющихся произведением чисел Фибоначчи, определяется как 1, за которым следует объединение всех списков, полученных умножениемl
на число Фибоначчи. В последней строке указывается требуемая функция (как обычно, без привязки к имени, поэтому не копируйте ее как есть), которая используется!!
для индексации в списке, что делает функцию индексированной 0.Нет проблем с вычислением 100-го или 100-тысячного числа.
источник
Шелуха , 13 байт
Обратите внимание, что Husk новее этой задачи. Однако эта и самая полезная функция для этого гольфа (
Ξ
) не были созданы с учетом этой проблемы.Попробуйте онлайн!
Более эффективная версия для 14 байтов:
Попробуйте онлайн!
источник
Python 2,
129128125123121 байтПроверьте это на Ideone .
источник