伯努利数字


23

所述伯努利数(具体地,第二伯努利数)由以下递归定义来定义:

第二伯努利数

其中千库表示组合

给定一个非负整数m作为输入,请输出小数表示形式或m第二伯努利数的缩减分数。如果输出小数表示形式,则必须至少具有6个小数位(小数点后的数字),并且四舍五入到6个小数位时必须是准确的。例如,对于m = 20.166666523是可以接受的,因为它四舍五入到0.1666670.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以下)提供正确的输出。

排行榜

这篇文章底部的堆栈摘录从答案a)生成排行榜,答案是每种语言的最短解决方案列表,b)则是总体排行榜。

为确保您的答案显示出来,请使用以下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参考实现仅是为了弄清伯努利数的定义,而不是真正解决问题。
Mego 2015年

啊,知道了 我认为这是一个功能齐全的实现。
Morgan Thrapp 2015年

2
@Mego没有标准浮点数(甚至不是四精度)也不能将B_60存储为四精度。如果要输出为小数,那么应该使用扩展精度格式吗?
lirtosiast

8
我不喜欢精度要求。某些语言没有使用浮点数达到B_60足够精度的工具,在打数学问题时,我宁愿不处理此类问题。编写解决方案然后由于似乎是技术性的原因而发现它无效是令人沮丧的。
xnor 2015年

2
@xnor 6位数的精度似乎已经令人难以置信。
primo 2015年

Answers:




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

Minkolang 0.14,97字节

我实际上尝试过首先递归地执行此操作,但是按当前设计的解释器实际上无法执行此操作。如果您尝试从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/2if m是1,而0/1if m是大于1的奇数。第二行B_m使用问题中给定的求和公式进行计算,并且完全使用分子和分母来进行计算。否则会短很多。第一行的前半部分进行簿记并选择执行第二行还是第三行,后半部分将分子和分母除以它们的GCD(如果适用)并存储这些值。并在最后输出答案。


8

Python 2,118字节

由于xsot保存了6个字节。彼得·泰勒
节省了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)。

使用的算法最初由Knuth和Buckholtz(1967)给出

对于所有k = 1..n 令T 1,k = 1

T的后续值由递归关系给出:

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

然后由T n,1给出一个n

(另请参阅: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+1n+~k。另外,您是否有理由使用>>1而不是/2?最后,这是一个微不足道的改进,但是您可以通过别名来节省一些字节range
xsot 2015年

感谢您的建议。我原本有两个表达式,当我加入他们,我忽略了改变>>1/2
primo

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)
Peter Taylor

@PeterTaylor n+n/2很聪明;不需要单独选择1,因为所有其他奇数值无论如何都为零。通过位反转,替代计算实际上要短4个字节,但由于某种原因,也要慢得多。
primo

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,其中ζ黎曼Zeta函数

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)

只能投票一次。可惜的是,这并不确切。
primo 2015年

根据文档zeta功能是通过计算伯努利数,其实。
primo 2015年

@primo,是的,我认为所有使用内置zeta的答案都是作弊行为。
彼得·泰勒

更容易,bernfrac并且bernreal有8个字节每他们已经功能,所以无需对n->。但是+1是一个很好的解决方案。
查尔斯

6

Python 3,112字节

编辑:我清理了这个答案。如果您想查看我想用Python 2和3回答这个问题的所有其他方式,请查看修订版。

如果我不使用查找表(而是使用备忘录),则可以将递归定义设为112字节!呜!请注意,b(m)返回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
Alex A.

@AlexA。做完了 .0s完全删除,因为它将很快变成浮动。
Sherlock15年

您可以使用p=v=1;exec('[...];p+=1'*k)而不是最内层的循环吗?
lirtosiast 2015年

5

CJam,69 49 34 33字节

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

在线演示

感谢Cabbie407,他的回答使我意识到了Akiyama–Tanigawa算法。

解剖

{           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!防止精度损失是聪明的,即使不是有些荒谬。我想知道是否不能稍微重构算法来避免这种情况。
primo 2015年

我认为重构不能避免扩展的必要性,原因很简单,因为我们知道每隔一个伯努利数都是0,那么显然会有很多相似值相减,所以很多地方都发生了灾难性的重要性损失可能发生。
彼得·泰勒

4

PARI / GP,45字节

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

使用与我的Python答案相同的公式,其中A n通过polylog生成。


测试脚本

运行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 2015年

@Mego对你我都是如此;)
primo


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}

它是Wikipedia页面上的Akiyama–Tanigawa算法的实现。

“ 6-decimal-digits-rule”规则有些麻烦,因为它先打印整数,然后打印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-> 7500866746076964366855855.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"工作吗?
primo

不,不是这样,因为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]

将shebang数为3,则输入来自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)

我知道这有点晚了,但是您可以通过更改if/ else语句顺序并使用m>0以及循环来节省3个字节1:m-1
Billywob

2

实际上46 45字节(非竞争)

我一直想做一个认真/实际回答几个月,现在我可以了。由于此命令使用的是2015年11月严重缺乏的命令,因此没有竞争。欢迎打高尔夫球。在线尝试!

编辑:在2017年2月,对“实际上”进行了更新,更改了哪些函数文字是哪个。通常,对于在2月之前编写的任何挑战,这都将完全不竞争,但是由于此答案已经不具有竞争性,因此我还是编辑了此答案。请享用。

这使用了维基百科上伯努利数字的明确定义。

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

开球

;╖     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年11月的命令吗?伙计,它使用的是2015年11月不存在的全新语言!我真感到骄傲...
Mego

1

Ruby,66 61字节

这是我的Python答案的Ruby版本。

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个,但是我甚至无法运行even 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:

通过找到x /(1- e -x)的指数生成函数的 n 系数,计算第n 伯努利数。

用法

如果给定输入整数或作为参数的浮点数,则将输出浮点数。如果给定一个扩展的整数(标有后缀)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))

高尔夫和测试

(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]]

这实现了Wikipedia页面上概述的伯努利数字的明确定义。


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];

即使对于某些输入而言,即使花费了宇宙的整个生命周期,终止打高尔夫挑战代码的代码也必须尽可能短。
Mego

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”变量设置为所需的伯努利数,结果为a [0]上的c [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 Euler costant


0

Pyth,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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.