В числе Бернулли ( в частности, вторые числа Бернулли) определяются следующим рекурсивным определением:
Где обозначает комбинацию .
Если в m
качестве входных данных задано неотрицательное целое число , выведите десятичное представление ИЛИ уменьшенную дробь для m
второго числа Бернулли. Если вы выводите десятичное представление, у вас должно быть как минимум 6 десятичных знаков (цифр после десятичной точки) точности, и оно должно быть точным при округлении до 6 десятичных знаков. Например, для m = 2
, 0.166666523
является приемлемым, потому что округляет до 0.166667
. 0.166666389
не приемлемо, потому что округляет до 0.166666
. Конечные нули могут быть опущены. Научные обозначения могут использоваться для десятичных представлений.
Вот входные и ожидаемые выходные данные m
до 60 включительно, в научной записи, округленные до 6 десятичных знаков и в виде сокращенных дробей:
0 -> 1.000000e+00 (1/1)
1 -> 5.000000e-01 (1/2)
2 -> 1.666667e-01 (1/6)
3 -> 0.000000e+00 (0/1)
4 -> -3.333333e-02 (-1/30)
5 -> 0.000000e+00 (0/1)
6 -> 2.380952e-02 (1/42)
7 -> 0.000000e+00 (0/1)
8 -> -3.333333e-02 (-1/30)
9 -> 0.000000e+00 (0/1)
10 -> 7.575758e-02 (5/66)
11 -> 0.000000e+00 (0/1)
12 -> -2.531136e-01 (-691/2730)
13 -> 0.000000e+00 (0/1)
14 -> 1.166667e+00 (7/6)
15 -> 0.000000e+00 (0/1)
16 -> -7.092157e+00 (-3617/510)
17 -> 0.000000e+00 (0/1)
18 -> 5.497118e+01 (43867/798)
19 -> 0.000000e+00 (0/1)
20 -> -5.291242e+02 (-174611/330)
21 -> 0.000000e+00 (0/1)
22 -> 6.192123e+03 (854513/138)
23 -> 0.000000e+00 (0/1)
24 -> -8.658025e+04 (-236364091/2730)
25 -> 0.000000e+00 (0/1)
26 -> 1.425517e+06 (8553103/6)
27 -> 0.000000e+00 (0/1)
28 -> -2.729823e+07 (-23749461029/870)
29 -> 0.000000e+00 (0/1)
30 -> 6.015809e+08 (8615841276005/14322)
31 -> 0.000000e+00 (0/1)
32 -> -1.511632e+10 (-7709321041217/510)
33 -> 0.000000e+00 (0/1)
34 -> 4.296146e+11 (2577687858367/6)
35 -> 0.000000e+00 (0/1)
36 -> -1.371166e+13 (-26315271553053477373/1919190)
37 -> 0.000000e+00 (0/1)
38 -> 4.883323e+14 (2929993913841559/6)
39 -> 0.000000e+00 (0/1)
40 -> -1.929658e+16 (-261082718496449122051/13530)
41 -> 0.000000e+00 (0/1)
42 -> 8.416930e+17 (1520097643918070802691/1806)
43 -> 0.000000e+00 (0/1)
44 -> -4.033807e+19 (-27833269579301024235023/690)
45 -> 0.000000e+00 (0/1)
46 -> 2.115075e+21 (596451111593912163277961/282)
47 -> 0.000000e+00 (0/1)
48 -> -1.208663e+23 (-5609403368997817686249127547/46410)
49 -> 0.000000e+00 (0/1)
50 -> 7.500867e+24 (495057205241079648212477525/66)
51 -> 0.000000e+00 (0/1)
52 -> -5.038778e+26 (-801165718135489957347924991853/1590)
53 -> 0.000000e+00 (0/1)
54 -> 3.652878e+28 (29149963634884862421418123812691/798)
55 -> 0.000000e+00 (0/1)
56 -> -2.849877e+30 (-2479392929313226753685415739663229/870)
57 -> 0.000000e+00 (0/1)
58 -> 2.386543e+32 (84483613348880041862046775994036021/354)
59 -> 0.000000e+00 (0/1)
60 -> -2.139995e+34 (-1215233140483755572040304994079820246041491/56786730)
Ссылочная реализация (в Python 3):
def factorial(n):
if n < 1:
return 1
else:
return n * factorial(n - 1)
def combination(m,k):
if k <= m:
return factorial(m)/(factorial(k) * factorial(m - k))
else:
return 0
def Bernoulli(m):
if m == 0:
return 1
else:
t = 0
for k in range(0, m):
t += combination(m, k) * Bernoulli(k) / (m - k + 1)
return 1 - t
правила
- Это код-гольф , поэтому выигрывает самый короткий код в байтах
- Вы не можете использовать какие-либо функции, встроенные или включенные во внешнюю библиотеку, которые вычисляют либо числа Бернулли, либо полиномы Бернулли.
- Ваш ответ должен давать правильные результаты для всех входов до 60 включительно.
Leaderboard
Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Ответы:
Юлия,
2320 байтСохранено 3 байта благодаря Алексу А.
Он использует ту же формулу , как мое решение Mathematica и решение PARI / GP .
источник
n->n>0?-zeta(1-n)n:1
zeta(n)
выдает ошибку, когдаn
отрицательное целое число. Я использую Julia 0.2.1 на Linux.Mathematica,
40282322 байтаИспользуя знаменитую формулу n * ζ (1− n ) = - B n , где ζ - дзета-функция Римана .
Одинаковой длины:
Исходное решение, 40 байт, с использованием производящей функции чисел Бернулли .
источник
Юлия, 58 байт
Это создает рекурсивную функцию,
B
которая принимает целое число и возвращаетBigFloat
(то есть с плавающей запятой высокой точности).Ungolfed:
источник
Минколанг 0,14 , 97 байт
Сначала я попытался сделать это рекурсивно, но мой переводчик, как он сейчас разрабатывает, на самом деле не может этого сделать. Если вы попытаетесь выполнить рекурсию из цикла for, она начнет новую рекурсию. Поэтому я пошел на табулирование ... у которого были проблемы с точностью. Так что я сделал все с дробями. Без встроенной поддержки дробей. [ вздох ]
Попробуй это здесь. Бонус: в массиве есть все дроби для каждого предыдущего числа Бернулли!
Пояснение (немного)
Третья строка отвечает за,
1/2
еслиm
равно 1, а0/1
еслиm
нечетное число больше 1. Вторая строка рассчитываетсяB_m
по формуле суммирования, приведенной в вопросе, и полностью с помощью числителей и знаменателей. В противном случае это было бы намного короче. Первая половина первой строки выполняет некоторую бухгалтерию и выбирает, выполнять ли вторую или третью строку, а вторая половина делит числитель и знаменатель на их GCD (если применимо) и сохраняет эти значения. И выводит ответ в конце.источник
Python 2, 118 байт
Сохранено 6 байтов благодаря xsot .
Сохранено
610 больше из-за Питера Тейлора .Использует следующую идентичность:
где A n - это n- й переменный номер , который можно формально определить как число чередующихся перестановок в наборе размера n , деленное пополам (см. также: A000111 ).
Используемый алгоритм был первоначально дан Кнутом и Бакгольцем (1967) :
Python 2, 152 байта
Печатает точное дробное представление, необходимое для значений больше 200 или около того.
источник
range(2,n)
наrange(n-2)
вы можете сократитьn-k+1
доn+~k
. Кроме того , есть причина использовать>>1
вместо/2
? Наконец, тривиальное улучшение, но вы можете сэкономить несколько байтов с помощью псевдонимовrange
.>>1
с/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. И вычисление может быть сделано для того же количества символов, что иa=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
умный; 1 не нужно выделять, потому что все остальные нечетные значения в любом случае равны нулю. Альтернативные вычисления на самом деле на 4 байта короче с инверсией битов, но также по некоторым причинам значительно медленнее.range
и пропустили одну итерацию, чтобы сделать умный способ сократить инициализацию. Путь теперь вы отщепляются четные и нечетные индексы очень хорошо, и позволяет дополнительную экономию, потянув знак в определениеa
:a=[(-1)**(n/2),n<2]*n
. Затем возвращаемое значение+(n<1)or-n/(2.**n-4**n)*a[1]
. У вас также есть запятая точка с запятой в конце строки 2.PARI / GP,
5223 байтаИспользуя знаменитую формулу n * ζ (1− n ) = - B n , где ζ - дзета-функция Римана .
Исходное решение, 52 байта, с использованием производящей функции чисел Бернулли .
источник
zeta
функция вычисляется с использованием чисел Бернулли, на самом деле.bernfrac
иbernreal
это 8 байт каждый , и они уже функционирует, поэтому нет необходимости вn->
. Но +1 за хорошее решение.Python 3, 112 байт
Изменить: я убрал этот ответ. Если вы хотите увидеть все другие способы, которыми я думал, чтобы ответить на этот вопрос в Python 2 и 3, посмотрите в ревизиях.
Если я не использую таблицу поиска (и вместо этого использую памятку), мне удается получить рекурсивное определение до 112 байт! WOO! Обратите внимание, что
b(m)
возвращаетFraction
. Как обычно, количество байтов и ссылка для тестирования .И функция, которая использует справочную таблицу и возвращает всю таблицу дробей от
b(0)
доb(m)
, включительно.источник
1.
вместо1.0
..0
изs
полностью, потому что это быстро станет поплавком позже.p=v=1;exec('[...];p+=1'*k)
вместо вашего внутреннего цикла?CJam,
69 49 3433 байтаОнлайн демо
Благодаря Cabbie407 , чей ответ позволил мне узнать об алгоритме Акияма – Танигава.
рассечение
источник
PARI / GP, 45 байт
Используя ту же формулу, что и в моем Python-ответе , с A n, сгенерированным через polylog.
Тестовый скрипт
Запустите
gp
, в командной строке вставьте следующее:источник
Mathematica,
524842 байтаБезымянная функция, которая использует буквальное определение.
источник
Sign@#
необходимо?Sign@#
он по-прежнему возвращает правильный ответ для 0.Python 2,
132130 байтЭто всего лишь гольф-версия эталонной реализации.
Это немного медленно на практике, но может быть значительно ускорено с запоминанием:
Вы можете попробовать эту версию онлайн на Ideone .
источник
gawk4, 79 байт
Код 77 байтов + 2 байта для
-M
флагаЭто реализация алгоритма Акияма – Танигава со страницы Википедии.
Возникли проблемы с «правилом 6-десятичных цифр», поскольку при этом выводится целое число, а затем 6 цифр, но здесь нет списка для сравнения результатов.
Недостатком является то, что это печатает знак минус перед все
0.000000
время, но я не думаю, что это неправильно.Пример использования
Выход от 0 до 60
источник
printf"%e"
работать?0.00000
они очень маленькие и не равны нулю.GolfScript, 63 байта
Демо онлайн .
Используя ту же формулу, что и мой ответ Python .
Тестовый скрипт
Ссылка apphb истечет на это. Если у вас не установлен GolfScript локально, я рекомендую использовать анархический интерпретатор гольфа (используйте форму, выберите GolfScript, вставьте, отправьте).
источник
Perl, 101 байт
Считая Шебанг как три, ввод берется из стандартного ввода.
Используя ту же формулу, что и мой ответ Python .
Образец использования
Демо онлайн .
источник
R, 93 байта
Не совсем оригинально как решение. Если есть комментарии, пожалуйста, не стесняйтесь!
Ungolfed:
источник
if
/else
и используя вместо этогоm>0
цикл1:m-1
.На самом деле ,
4645 байт (не конкурирующих)Я собирался сделать Серьезный / Фактический ответ в течение нескольких месяцев, и теперь я могу. Поскольку в нем используются команды, которых серьезно не было в ноябре 2015 года, это неконкурентоспособно. Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Редактировать: В феврале 2017 года было обновлено «Фактически», которое изменило, какие литералы функций какие. Обычно это просто неконкурентоспособность для любого задания, написанного до февраля, но так как этот ответ уже неконкурентен, я все равно отредактировал этот ответ. Наслаждаться.
Здесь используется явное определение чисел Бернулли в Википедии.
Ungolfing
источник
Рубин,
6661 байтЭто Ruby-версия моего ответа на Python.
Поскольку он использует
Rational
в своих ответах, я вполне уверен, что это работает до 60, но у меня были проблемы с запуском дажеb[24]
, поэтому я снова реализовал таблицу поиска для868180 байт.источник
J, 10 байт
Вычисляет n- е число Бернулли, находя n- й коэффициент экспоненциальной производящей функции x / (1 - e -x ).
использование
Если для ввода задано целое число или число с плавающей точкой в качестве аргумента, оно выведет число с плавающей точкой. Если задано расширенное целое число, помеченное суффиксом
x
, оно выведет либо расширенное целое число, либо рациональное, два расширенных целых числа, разделенныхr
.объяснение
источник
Аксиома,
134147 байтразгрызть и проверить
источник
APL (NARS), 83 символа, 166 байтов
Ввод как целочисленный вывод как большой рациональный
источник
Haskell, 95 байт
Это реализует явное определение чисел Бернулли, изложенных на странице Википедии .
источник
Perl 6, 83 байта
Более быстрое 114-байтовое решение:
источник
Javascript, 168 байт
Установите переменную 'k' на желаемое число Бернулли, и результат будет c [0] вместо a [0]. (числитель и знаменатель)
Образец использования
Не такой маленький, как другие, но единственный, который я написал, приближается. См. Https://marquisdegeek.com/code_ada99 для моих других (не для гольфа) попыток.
источник
Аксиома, 57 байт
код для теста и результатов
нужно отметить, что эта функция не та, что написана выше, а
t*%e^t/(%e^t-1))
с% e Euler costantисточник
Pyth , 22 байта
Попробуйте онлайн!
Определяет функцию, которая вызывается как
y<number>
, напримерyQ
.источник