Числа Бернуллі


23

Номери Бернуллі (конкретно, другі числа Бернуллі) визначаються наступним рекурсивним визначенням:

другі числа Бернуллі

Де мккпозначається комбінація .

З урахуванням невід'ємного цілого числа 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 включно.

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує таблицю лідерів з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальну таблицю лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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


@MorganThrapp Референсна реалізація полягає лише в тому, щоб зрозуміти визначення числа Бернуллі, а не для того, щоб фактично вирішити проблему.
Мего

Ах, готча. Я думав, що це повністю функціональна реалізація.
Морган Трапп

2
@Mego Жоден стандартний поплавок (навіть квадратична точність) не може зберігати B_60 до квадратичної точності. Чи повинні ми тоді використовувати розширений формат точності, якщо ми виводимо як десятковий знак?
lirtosiast

8
Мені не подобається вимога точності. Деякі мови не мають інструментів для роботи з поплавками з достатньою точністю для B_60, і я вважаю за краще не займатися подібними питаннями при гольфі математичній задачі. Складно написати рішення, а потім виявити його недійсним через те, що здається технічним.
xnor

2
@xnor 6 цифр точності здається неймовірно слабким.
примо

Відповіді:


8

Джулія, 23 20 байт

Збережено 3 байти завдяки Алексу А.

Він використовує ту саму формулу, що і моє рішення Mathematica та рішення PARI / GP .

n->n>0?-zeta(1-n)n:1

2
20 байт:n->n>0?-zeta(1-n)n:1
Олексій А.

@AlexA. Я не знаю чому, але zeta(n)видає помилку, коли nце від'ємне ціле число. Я використовую Julia 0.2.1 на Linux.
алефальфа

1
О, мій, твоя версія Джулії досить застаріла. Для мене це працює чудово на 0.4.1.
Олексій А.

25

Математика, 40 28 23 22 байт

Використовуючи відому формулу n * ζ (1− n ) = - B n , де ζ - функція Земана Рімана .

If[#>0,-Zeta[1-#]#,1]&

Та ж довжина:

B@0=1;B@n_=-Zeta[1-n]n

Оригінальне рішення, 40 байт, використовуючи функцію генерування чисел Бернуллі .

#!SeriesCoefficient[t/(1-E^-t),{t,0,#}]&

+2, якщо я міг би ...
LegionMammal978

9

Джулія, 58 байт

B(m)=m<1?1:1-sum(k->big(binomial(m,k))*B(k)/(m-k+1),0:m-1)

Це створює рекурсивну функцію, Bяка приймає ціле число і повертає BigFloat(тобто плаваючу точку з високою точністю).

Безголівки:

function B(m::Integer)
    m == 0 && return 1
    return 1 - sum(k -> big(binomial(m, k)) * B(k) / (m-k+1), 0:m-1)
end

9

Мінколанг 0,14 , 97 байт

Я насправді спробував це робити рекурсивно спочатку, але мій перекладач, як зараз розроблено, насправді не може цього зробити. Якщо ви спробуєте повторити з циклу for for, він розпочне нову рекурсію. Тож я пішов на табличний підхід ... який мав проблеми з точністю. Тож я все робив дробами. Без вбудованої підтримки фракцій. [ зітхання ]

n1+[xxi$z0z2%1+F0c0=$1&$d4Mdm:1R:r$dz1Az0A]$:N.
11z[i0azi6M*i1azi-1+*d0c*1c2c*-1c3c*4$X]f
z1=d1+f

Спробуйте тут. Бонус: у масиві є всі дроби для кожного попереднього числа Бернуллі!

Пояснення (трохи)

n1+                 Take number from input (N) and add 1
   [                Open for loop that runs N+1 times (starts at zero)
    xx              Dump the top two values of the stack
      i$z           Store the loop counter in the register (m)
         0          Push 0
          z2%1+     Push 1 if N is even, 2 if odd
               F    Gosub; pops y,x then goes to codebox(x,y), to be returned to

    0c                                 Copy the first item on the stack
      ,                                1 if equal to 0, 0 otherwise
       $1&                             Jump 11 spaces if top of stack is not 0

                                       (If top of stack is not 0, then...)
          $d                           Duplicate whole stack
            4M                         Pop b,a and push GCD(a,b)
              dm                       Duplicate and merge (a,b,c,c -> a,c,b,c)
                :                      Divide
                 1R                    Rotate 1 item to the right (0G works too)
                   :                   Divide
                    r                  Reverse stack

                                       (In both cases...)
                     $d                Duplicate whole stack
                       z1A             Store denominator of B_m in array
                           z0A         Store numerator of B_m in array
                              ]        Close for loop
                               $:      Divide (float division)
                                 N.    Output as number and stop.

11                                           Push two 1s (a, b)
  z[                                         Open a for loop that repeats m times
    i0a                                      Retrieve numerator of B_k (p)
       zi                                    Push m, k
         6M                                  Pop k,m and push mCk (binomial) (x)
           *                                 p*x (c)
            i1a                              Retrieve denominator of B_k (q)
               zi-1+                         m-k+1 (y)
                    *                        q*y (d)
                     d                       Duplicate top of stack
                      0c*                    a*d
                         1c2c*               b*c
                              -              a*d-b*c
                               1c3c*         b*d
                                    4$X      Dump the bottom four items of stack
                                       ]f    Jump back to F

z          m
 1=        0 (if m is 1) or 1 (otherwise)
   d1+     Duplicate and add 1 (1 or 2)
      f    Jump back to F

Третій рядок відповідає за, 1/2якщо mдорівнює 1, а 0/1якщо mнепарне число перевищує 1. Другий рядок обчислюється B_mза формулою підсумовування, наведеною у питанні, і робить це цілком за допомогою чисельників та знаменників. Інакше було б набагато коротше. Перша половина першого рядка веде деякий облік і вибирає, чи слід виконувати другий чи третій рядок, а друга половина ділить чисельник та знаменник на їх GCD (якщо це застосовано) та зберігає ці значення. І виводить відповідь наприкінці.


8

Python 2, 118 байт

Збережено 6 байт завдяки xsot .
Збережено ще 6 10 завдяки Пітеру Тейлору .

n=input()
a=[n%4-1,n<2]*n;exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-2)];"*~-n
print+(n<1)or-n/(2.**n-4**n)*a[1]

Використовується така ідентичність:

де A n - n- й змінний номер , який формально можна визначити як кількість чергуються перестановок на множині розміру n , вдвічі (див. також: A000111 ).

Використовуваний алгоритм був спочатку заданий Кнутом та Бакхолцом (1967) :

Нехай T 1, k = 1 для всіх k = 1..n

Наступні значення Т задаються відношенням рецидивування:

T n + 1, k = 1/2 [ (k - 1) T n, k-1 + (k + 1) T n, k + 1 ]

Тоді A n задається T n, 1

(див. також: A185414 )


Python 2, 152 байти

from fractions import*
n=input()
a=[n%4-1,n<2]*n
for k in range(n-1):a=[(a[j-1]+a[j+1])*j/2for j in range(n-k)]
print+(n<1)or Fraction(n*a[1],4**n-2**n)

Друкує точне дробове подання, необхідне для значень, що перевищують 200 або більше.


1
Якщо ви міняєте range(2,n)до range(n-2)ви можете скоротити n-k+1до n+~k. Також є причина, яку ви використовуєте >>1замість цього /2? Нарешті, банальне поліпшення, але ви можете зберегти кілька байтів шляхом згладжування range.
xsot

Дякуємо за пропозиції. Я спочатку мав два вирази, коли я приєднався до них я прогледів зміни >>1з /2.
примо

1
Там це економія один символ в рядку виводу: 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)
Пітер Тейлор

@PeterTaylor n+n/2розумний; 1 не потрібно виділяти, тому що всі інші непарні значення дорівнює нулю. Альтернативний обчислення - це насправді на 4 байти коротше з інверсією бітів, але також значно повільніше з певних причин.
примо

1
Я працював за таблицею OEIS і думав, що ви знайшли rangeта пропустили одну ітерацію як розумний спосіб скоротити ініціалізацію. Шлях тепер ви отщепляются парні і непарні індекси дуже добре, і дозволяє додаткову економію, потягнувши знак в визначення a: a=[(-1)**(n/2),n<2]*n. Тоді повертається значення +(n<1)or-n/(2.**n-4**n)*a[1]. Ви також отримали збиту крапку з комою в кінці рядка 2.
Пітер Тейлор

6

PARI / GP, 52 23 байти

Використовуючи відому формулу n * ζ (1− n ) = - B n , де ζ - функція Земана Рімана .

n->if(n,-n*zeta(1-n),1)

Оригінальне рішення, 52 байти, використовуючи функцію генерування чисел Бернуллі .

n->n!*polcoeff(-x/sum(i=1,n+1,(-x)^i/i!)+O(x^n*x),n)

Можливо внести пропозицію лише один раз. Прикро, що це не точно.
примо

Згідно з документацієюzeta функція обчислюється з використанням чисел Бернуллі, насправді.
примо

@primo, так, я вважаю, що всі відповіді, в яких використовується вбудована зета, є обманом.
Пітер Тейлор

Ще простіше, bernfracі bernrealце 8 байт кожен, і вони вже функціонують, тому немає необхідності в цьому n->. Але +1 для хорошого рішення.
Чарльз

6

Python 3, 112 байт

Редагувати: Я очистив цю відповідь. Якщо ви хочете побачити всі інші способи, на які я думав відповісти на це питання в Python 2 і 3, погляньте на редакції.

Якщо я не використовую таблицю пошуку (а замість цього використовую пам'ятку), мені вдається отримати рекурсивне визначення до 112 байт! WOO! Зауважте, щоb(m) повертається a Fraction. Як завжди, кількість байтів і посилання для тестування .

from fractions import*
def b(m):
 s=k=0;p=1
 while k<m:a=m-k;s+=Fraction(p*b(k))/-~a;p=p*a//-~k;k+=1
 return 1-s

А функція , яка дійсно використовує таблицю пошуку, і повертає всю таблицю фракцій b(0)до b(m)включно.

from fractions import*
def b(m,r=[]):
 s=k=0;p=1
 while k<m:
  if k>=len(r):r=b(k,r)
  a=m-k;s+=Fraction(p*r[k])/-~a;p=p*a//-~k;k+=1
 return r+[1-s]

1
Я думаю, що ви можете опустити кінцевий нуль на поплавкових літералах, наприклад 1.замість 1.0.
Олексій А.

@AlexA. Зроблено. Вилучено .0з sповністю, тому що вона швидко стане поплавком пізніше.
Шерлок9

Чи можете ви використовувати p=v=1;exec('[...];p+=1'*k)замість своєї внутрішньої петлі?
ліртосіаст

5

CJam, 69 49 34 33 байт

{_),:):R_:*_@f/@{_(;.-R.*}*0=\d/}

Демонстрація в Інтернеті

Завдяки Cabbie407 , у відповідь на який я зрозумів алгоритм Акіяма-Танігава.

Розсічення

{           e# Function: takes n on the stack
  _),:)     e# Stack: n [1 2 3 ... n+1]
  :R        e# Store that array in R
  _:*       e# Stack: n [1 2 3 ... n+1] (n+1)!
  _@f/      e# Stack: n (n+1)! [(n+1)!/1 (n+1)!/2 (n+1)!/3 ... (n+1)!/(n+1)]
            e#   representing [1/1 1/2 ... 1/(n+1)] but avoiding floating point
  @{        e# Repeat n times:
    _(;.-   e#   Take pairwise differences
    R.*     e#   Pointwise multiply by 1-based indices
  }*        e#   Note that the tail of the array accumulates junk, but we don't care
  0=\d/     e# Take the first element and divide by (n+1)!
}

Множення через n! запобігти втраті точності розумно, якщо не трохи смішно. Цікаво, якби алгоритм не вдалося трохи відновити, щоб цього уникнути.
примо

Я не думаю, що рефакторинг не міг би уникнути необхідності масштабування з тієї простої причини, оскільки, оскільки ми знаємо, що кожне інше число Бернуллі дорівнює 0, очевидно, відбувається багато віднімання подібних значень, тому існує багато місць, де катастрофічна втрата значущості може статися.
Пітер Тейлор

4

PARI / GP, 45 байт

n->if(n,2*n/(2^n-4^n)*real(polylog(1-n,I)),1)

Використовуючи ту саму формулу, що і моя відповідь Python , з A n, що генерується через полілог.


Тестовий сценарій

Запустіть gp, підкажіть наступне:

n->if(n,2*n/(2^n-4^n)*real(polylog(1-n,I)),1)
for(i=0, 60, print(i, ": ", %(i)))

1
Дякуємо, що надали тестовий сценарій - це значно спростило тестування!
Мего

@Mego для вас і мене;)
primo

4

Математика, 52 48 42 байт

1-Sum[#~Binomial~k#0@k/(#-k+1),{k,0,#-1}]&

Безіменна функція, яка використовує буквальне визначення.


Є Sign@# потрібне?
алефальфа

Я перевірив це на своєму комп’ютері. Після вилучення значка Sign@#він все одно повертає правильну відповідь за 0.
алефальфа

3

Python 2, 132 130 байт

import math,fractions
f=math.factorial
B=lambda m:~-m*m%2or 1+sum(B(k)*f(m)/f(k)/f(m-k)/fractions.Fraction(k+~m)for k in range(m))

Це просто гольф-версія еталонної реалізації.

На практиці це трохи повільно, але це може бути значно прискорено з запам'ятовуванням:

import math,fractions
f=math.factorial

def memoize(f):
 memo = {}
 def helper(x):
  if x not in memo:
   memo[x] = f(x)
  return memo[x]
 return helper

@memoize
def B(m):
 return~-m*m%2or 1+sum(B(k)*f(m)/f(k)/f(m-k)/fractions.Fraction(k+~m)for k in range(m))

for m in range(61):
 print(B(m))

Ви можете спробувати цю версію в Інтернеті на Ideone .


3

gawk4, 79 байт

77 байт код + 2 байти для -M прапора

PREC^=2{for(n=$0;m++<=n;)for($(j=m)=1/m;j>1;)$j=(-$j+$--j)*j;printf"%.6f",$1}

Це реалізація алгоритму Акіяма-Танігава на сторінці Вікіпедії.

Були певні проблеми з "правилом 6-знакових цифр", оскільки це друкує ціле число, а потім 6 цифр, але тут немає списку для порівняння результатів.

Недоліком є ​​те, що це друкує знак мінус перед знаком 0.000000 усіма часом, але я не думаю, що це неправильно.

Приклад використання

echo 58 | awk -M 'PREC^=2{for(n=$0;m++<=n;)for($(j=m)=1/m;j>1;)$j=(-$j+$--j)*j;printf"%.6f",$1}'

Вихід від 0 до 60

0 -> 1.000000
1 -> 0,500000
2 -> 0,166667
3 -> -0,000000
4 -> -0,033333
5 -> 0,000000
6 -> 0,023810
7 -> 0,000000
8 -> -0,033333
9 -> 0,000000
10 -> 0,075758
11 -> -0,000000
12 -> -0,253114
13 -> -0,000000
14 -> 1,166667
15 -> -0,000000
16 -> -7.092157
17 -> -0,000000
18 -> 54,971178
19 -> -0,000000
20 -> -529.124242
21 -> -0,000000
22 -> 6192.123188
23 -> 0,000000
24 -> -86580.253114
25 -> 0,000000
26 -> 1425517.166667
27 -> 0,000000
28 -> -27298231.067816
29 -> 0,000000
30 -> 601580873.900642
31 -> 0,000000
32 -> -15116315767.092157
33 -> 0,000000
34 -> 429614643061.166667
35 -> 0,000000
36 -> -13711655205088.332772
37 -> 0,000000
38 -> 488332318973593.166667
39 -> -0,000000
40 -> -19296579341940068.148633
41 -> -0,000000
42 -> 841693047573682615.000554
43 -> -0,000000
44 -> -40338071854059455413.076812
45 -> -0,000000
46 -> 2115074863808199160560.145390
47 -> -0,000000
48 -> -120866265222965259346027.311937
49 -> -0,000000
50 -> 7500866746076964366855720.075758
51 -> -0,000000
52 -> -503877810148106891413789303.052201
53 -> -0,000000
54 -> 36528776484818123335110430842.971178
55 -> -0,000000
56 -> -2849876930245088222626914643291.067816
57 -> -0,000000
58 -> 238654274996836276446459819192192.149718
59 -> -0,000000
60 -> -21399949257225333665810744765191097.392674

Було б printf"%e"працювати?
примо

Ні, не було б, тому що 0.00000s лише дуже маленькі і насправді не дорівнюють нулю.
Cabbie407

2

GolfScript, 63 байти

~:i.!+.[3i&(2i>]*i(,{i\-,{1$1$(=2$2$)=+*2/}%\;}/~\2i?.(*\--1?**

Демо - версія .

Використовуючи ту саму формулу, що і моя відповідь Python .


Тестовий сценарій

61,{[.`
  ~:i.!+.[3i&(2i>]*i(,{i\-,{1$1$(=2$2$)=+*2/}%\;}/~\2i?.(*\--1?**
]p}/

З цього часу посилання apphb закінчиться. Якщо у вас немає локально встановленого GolfScript, рекомендую скористатись анархічним інтерпретатором гольфу (використовуйте форму, виберіть GolfScript, вставте, надішліть).


2

Perl, 101 байт

#!perl -p
@a=($_%4-1,$_<2)x$_;
@a=map$_*($a[$_-1]+$a[$_+1])/2,0..@a-3for 2..$_;
$_=!$_||$_/(4**$_-2**$_)*$a[1]

Підрахувавши шебанг як три, вхід береться від stdin.

Використовуючи ту саму формулу, що і моя відповідь Python .


Використання зразка

$ echo 60 | perl bernoulli.pl
-2.13999492572253e+034

Демо - версія .


2

R, 93 байти

function(m){if(m==0){1}else{v=c();for(k in 0:(m-1))v=c(v,choose(m,k)*f(k)/(m-k+1));1-sum(v)}}

Не дуже оригінально як рішення. Якщо будь-який коментар, будь ласка, не соромтеся!

Безголовки:

function(m)
    if(m==0){1}
    else
         v=c()
         for(k in 0:(m-1))
            v=c(v,choose(m,k)*f(k)/(m-k+1))

1-sum(v)

Я знаю, що це трохи пізно, але ви можете зберегти 3 байти, змінивши порядок if/ elsestatement та використовувати m>0, а також 1:m-1замість цього перебирати .
Billywob

2

Насправді , 46 45 байт (не конкуруючий)

Я мав на увазі місяці серйозно / насправді відповідати, і тепер можу. Оскільки для цього використовуються команди, яких серйозно не було у листопаді 2015 року, це не конкурує. Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

Редагувати: У лютому 2017 року відбулось оновлення фактично, що змінило, які саме літерали є. Зазвичай, це було б просто не конкуруючим із будь-яким викликом, написаним до лютого, але оскільки ця відповідь вже є неконкурентоспроможною, я все одно змінив цю відповідь. Насолоджуйтесь.

Тут використовується чітке визначення чисел Бернуллі у Вікіпедії.

;╖ur⌠;╝ur⌠;;0~ⁿ(╛█*╜(uⁿ*⌡MΣ╛uk⌡M┬i@;π;)♀\*@k▼

Ungolfing

;╖     Duplicate and save m in register 0.
ur     Range [0..m]
  ⌠      Start first for loop
  ;╝     Duplicate and save k in register 1.
  ur     Range [0..k]
    ⌠      Start second for loop (as string).
    ;;     Duplicate v twice.
    0~ⁿ    Push -1, and pow() to get (-1)**v.
    (╛█    Rotate a duplicate v to TOS, push k, and binom(k, v).
    *      Multiply (-1)**v by binom(k, v).
    ╜(uⁿ   Push m, rotate last duplicate v to TOS, increment, and pow() to get (v+1)**m.
    *      (-1)**v * binom(k, v) * (v+1)**m
    ⌡      End second for loop (string turned to function).
  MΣ     Map over range [0..v] and sum
  ╛u     Push k and increment (the denominator)
           (Note: second for loop does numerators only as denominator only depends on k)
  k      Push fraction in list form [numerator, denominator]
  ⌡      End first for loop
M      Map over range [0..k]
┬i@    Transpose all of the fractions, flatten and swap.
         Stack: [denominators] [numerators]
;π     Duplicate and take product of denominators.
;)     Duplicate product and move to bottom of stack.
         Stack: product [denominators] [numerators] product
♀\     For all items in denominators, integer divide product by item.
         Return a list of these scaled-up denominators.
*      Dot product of numerators and the scaled-up denominators as new numerator.
         (In effect, getting the fractions to the same denominator and summing them)
@k     Swap new numerator and product (new denominator) and turn into a list (fraction).
▼      Divide fraction by gcd(numerator, denominator) (Simplify fraction).

2
Команд використання Серйозно не було в листопаді 2015 року? Людина, для цього використовується абсолютно нова мова, яка не існувала в листопаді 2015 року! Я так пишаюся ...
Mego

1

Рубі, 66 61 байт

Це Ruby версія моєї відповіді Python.

b=->m{s,p=0r,1;m.times{|k|a=m-k;s+=p*b[k]/-~a;p=p*a/-~k};1-s}

Оскільки це використовує Rationalу своїх відповідях, я впевнений, що це працює до 60, але у мене виникли проблеми з рівним запуском b[24], тому я знову застосував таблицю пошуку на 86 81 80 байт.

t=->m{s,p,r=0r,1,m>0?t[m-1]:[];m.times{|k|a=m-k;s+=p*r[k]/-~a;p=p*a/-~k};r<<1-s}

1

J, 10 байт

(%1-^@-)t:

Обчислює n- е число Бернуллі шляхом знаходження n- го коефіцієнта експоненціальної функції, що формує x / (1 - e -x ).

Використання

Якщо введенню задано ціле число або плаває як аргумент, він виведе поплавок. Якщо дано розширене ціле число, позначене суфіксом x, воно виведе або розширене ціле число, або раціональне, два розширені цілі числа, розділені на r.

   f =: (%1-^@-)t:
   f 1
0.5
   f 1x
1r2
   (,.f"0) i. 10x
0     1
1   1r2
2   1r6
3     0
4 _1r30
5     0
6  1r42
7     0
8 _1r30
9     0

Пояснення

(%1-^@-)t: Input: n
(      )t: Takes a monad and creates a new monad that
           computes the coefficients of its egf
(      )   A monad that operates on x
      -      Negate x
    ^@       Computes its exponential, e^-x
  1-         Subtract it from 1
 %           Divide x by it, x/(1 - e^-x)

1

Аксіома, 134 147 байт

b(n:NNI):FRAC INT==(v:=[1/1];k:=1;repeat(k>n=>break;r:=1-reduce(+,[binomial(k,j)*v.(j+1)/(k-j+1)for j in 0..k-1]);v:=append(v,[r]);k:=k+1);v.(n+1))

ungolf і тест

(23) -> b
   (23)
   b n ==
           1
     v := [-]
           1
     k := 1
     repeat
       if n < k
         then break
         else
                               binomial(k,j)v(j + 1)
           r := 1 - reduce(+,[[--------------------- for j in 0..(k - 1)]])
                                     k - j + 1
           v := append(v,[r])
           k := k + 1
     v(n + 1)
                                                   Type: FunctionCalled b
(50) -> [[i,b(i)]  for i in [0,1,2,3,4,5,6,7,8,9,10]]
   (50)
             1     1              1            1              1             5
   [[0,1],[1,-],[2,-],[3,0],[4,- --],[5,0],[6,--],[7,0],[8,- --],[9,0],[10,--]]
             2     6             30           42             30            66
                                         Type: List List Fraction Integer

(51) -> b 1000
   (51)
   -
   18243104738661887254572640256857788879338336867042906052197158157641126_
    2572624911158657472577321069709615489924627495522908087488299539455188_
    7918567582241551668492697244184914012242579830955617098629924652251740_
    9791915637226361428342780548971002281045465308441161372350696920220116_
    2441791760680262602019620260255790058416539271332852806000966628467639_
    0683434226380702951226108116666172815817157023611889303668166839919156_
    3797683877845690114843122753427426880591799883780255338278664578660218_
    5045895962670442011443630321460259486764674312436994856054301765557425_
    1371150213401051058408679874766352952749178734973676859834707623881634_
    6251471489942512878190574323531299070406930309477389251738705417680653_
    1183648189451892725726445949589759600705334767585389769924857630972963_
    9976364832442643512622073858780110731539833099817555775136008111170797_
    6250597322951308884900670113339167641953793994512377610306198429310933_
    1214632141683542607746641232089854815064629129596536997380608256428801_
    9784909897301658268809203555030692846151917069465607257641149187197651_
    0905515966840312411845543650593021402849221691341852819791233589301994_
    1012291773441794027493574651881059432274494354092231954894280742068472_
    7146192942133436054611475404867886313250114399681532753236429290625909_
    3411000391368336312138915621701535954814084208794241665492294270773347_
    6055878415765927582014214726584822236443691314366097570085473354584000_
    9985915190584047337934331297339403392719579093995842312746836871169674_
    9786460913411872527166990047126222109345933847358924230951718379883743_
    2563465487604170316077418754242710065269818190591271690695446633836120_
    3745255515267088218383996330164203403732365333352120338272021319718003_
    5994220458994876460018350270385634117807768745161622933834063145505621_
    9106004731529642292049578901
     /
    342999030
                                                   Type: Fraction Integer

(52) -> b 60
           1215233140483755572040304994079820246041491
   (52)  - -------------------------------------------
                             56786730
                                                   Type: Fraction Integer

1

APL (NARS), 83 символів, 166 байт

r←B w;i
r←,1⋄i←0x⋄w+←1
→3×⍳w≤i+←1⋄r←r,1-+/{(1+i-⍵)÷⍨(⍵!i)×r[⍵+1]}¨0..i-1⋄→2
r←r[i]

Вхід як цілий вихід як великий раціональний

  B 0
1
  B 1
1r2 
  B 2
1r6 
  B 3
0 
  B 4
¯1r30 
  B 10
5r66 
  B 100
¯94598037819122125295227433069493721872702841533066936133385696204311395415197247711r33330 
  B 1000
¯1824310473866188725457264025685778887933833686704290605219715815764112625726249111586574725773210697096154899246
  27495522908087488299539455188791856758224155166849269724418491401224257983095561709862992465225174097919156
  37226361428342780548971002281045465308441161372350696920220116244179176068026260201962026025579005841653927
  13328528060009666284676390683434226380702951226108116666172815817157023611889303668166839919156379768387784
  56901148431227534274268805917998837802553382786645786602185045895962670442011443630321460259486764674312436
  99485605430176555742513711502134010510584086798747663529527491787349736768598347076238816346251471489942512
  87819057432353129907040693030947738925173870541768065311836481894518927257264459495897596007053347675853897
  69924857630972963997636483244264351262207385878011073153983309981755577513600811117079762505973229513088849
  00670113339167641953793994512377610306198429310933121463214168354260774664123208985481506462912959653699738
  06082564288019784909897301658268809203555030692846151917069465607257641149187197651090551596684031241184554
  36505930214028492216913418528197912335893019941012291773441794027493574651881059432274494354092231954894280
  74206847271461929421334360546114754048678863132501143996815327532364292906259093411000391368336312138915621
  70153595481408420879424166549229427077334760558784157659275820142147265848222364436913143660975700854733545
  84000998591519058404733793433129733940339271957909399584231274683687116967497864609134118725271669900471262
  22109345933847358924230951718379883743256346548760417031607741875424271006526981819059127169069544663383612
  03745255515267088218383996330164203403732365333352120338272021319718003599422045899487646001835027038563411
  78077687451616229338340631455056219106004731529642292049578901r342999030 

0

Haskell, 95 байт

import Data.Ratio
p=product
b m=sum[p[k-v+1..k]*(v+1)^m%(p[-v..0-1]*(k+1))|k<-[0..m],v<-[0..k]]

Це реалізує чітке визначення номерів Бернуллі, викладених на сторінці Вікіпедії .


0

Perl 6, 83 байти

my &B={$^m??1-[+] (^$m).map: {combinations($m,$_)*B($_)/($m+1-$_)}!!1};say B slurp;

Більш швидке, 114-байтне рішення:

my @b=1;for 1..+slurp() {@b.push: 1-[+] (^$^m).map: {([*] $m+1-$_..$m)*@b[$_]/($m+1-$_)/([*] 1..$_)}};say @b[*-1];

Ваш код для виклику для гольфу з кодом повинен бути якомога короткішим, навіть якщо для певного входу потрібно кілька днів життя Всесвіту.
Мего

0

Javascript, 168 байт

function h(b,a){return a?h(a,b%a):b}for(var c=[],a=[],e=0,b,d,f,g;e<=k;)for(c[b=d=e]=1,a[e]=++e;d;)f=c[--d]*a[b]-(c[b]*=g=a[d]),r=h(f*=b,g=a[b]*=g),c[d]=f/r,a[--b]=g/r;

Встановіть змінну 'k' на потрібне число Бернуллі, і результат c [0] над a [0]. (чисельник та знаменник)

Використання зразка

k = 2;
console.log(c[0] + "/" + a[0]);

Не такий маленький, як інші, але єдиний, про який я писав, підходить близько. Дивіться https://marquisdegeek.com/code_ada99 про інші мої спроби (не для гольфу).


0

Аксіома, 57 байт

g(n)==factorial(n)*coefficient(taylor(t*%e^t/(%e^t-1)),n)

код для тестування та результатів

(18) -> [[i, g(i)]  for i in 0..29]
   (18)
              1      1                1              1                1
   [[0,1], [1,-], [2,-], [3,0], [4,- --], [5,0], [6,--], [7,0], [8,- --],
              2      6               30             42               30
                5                  691               7                 3617
    [9,0], [10,--], [11,0], [12,- ----], [13,0], [14,-], [15,0], [16,- ----],
               66                 2730               6                  510
                43867                 174611               854513
    [17,0], [18,-----], [19,0], [20,- ------], [21,0], [22,------], [23,0],
                 798                    330                  138
          236364091               8553103                 23749461029
    [24,- ---------], [25,0], [26,-------], [27,0], [28,- -----------], [29,0]]
             2730                    6                        870
                                       Type: List List Expression Integer

(19) -> g 60
           1215233140483755572040304994079820246041491
   (19)  - -------------------------------------------
                             56786730
                                                 Type: Expression Integer

треба зауважити, що функція не є тією, яку хтось написав вище, а t*%e^t/(%e^t-1))з% e коустантом Ейлера


0

Піт , 22 байти

L?b-1sm*.cbdcyd-btdUb1

Спробуйте в Інтернеті!

Визначає функцію, яка викликається , як y<number>, наприклад yQ.

L                      # y=lambda b:
 ?b                  1 # ... if b else 1
   -1                  # 1 -
     s                 #     sum(
      m            Ub  #         map(lambda d: ... , range(b)) 
       *.cbd           #           combinations(b, d) *
            cyd        #             y(d) /      (float division)
               -btd    #                    b - (d - 1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.