Bernoulli Sayıları


23

Bernoulli sayıları (spesifik olarak, ikinci Bernoulli sayıları) Aşağıdaki yinelemeli tanımı ile tanımlanır:

ikinci Bernoulli sayıları

Burada MCKbir belirtmektedir kombinasyonu .

mGirdi olarak negatif olmayan bir tamsayı verildiğinde , ondalık gösterimi VEYA mikinci Bernoulli numarası için azaltılmış bir kesri çıktısı alın . Ondalık gösterimi verirseniz, en az 6 ondalık basamağa (ondalık basamağın ardından rakam) sahip olmalısınız ve 6 basamağa yuvarlandığında doğru olmalıdır. Örneğin, için m = 2, 0.166666523kabul edilebilir bu yuvarlar için 0.166667. 0.166666389kabul edilebilir değil, çünkü yuvarlar 0.166666. İzleyen sıfırlar ihmal edilebilir. Bilimsel gösterim, ondalık gösterimler için kullanılabilir.

İşte m60'a kadar olan ve 6 ondalık basamağa yuvarlanan bilimsel gösterimde ve azaltılmış kesirler halinde girdi ve beklenen çıktı :

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)

Referans uygulaması (Python 3'te):

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

kurallar

  • Bu , bayt cinsinden en kısa kod kazanır
  • Herhangi bir Bernoulli sayısının veya Bernoulli polinomunun türünü hesaplayan, yerleşik veya harici bir kütüphaneye dahil olan hiçbir işlevi kullanamazsınız.
  • Cevabınız, 60 dahil ve bütün girişler için doğru çıktı vermelidir.

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) dilindeki en kısa çözümlerin bir listesi olarak ve b) genel bir lider tablosu olarak cevaplardan lider tablosu oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

## Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


@MorganThrapp Referans uygulaması sadece bir Bernoulli sayısının tanımını daha açık hale getirmek, sorunu gerçekten çözmek için değil.
Mego

Ah, anladım. Tamamen işlevsel bir uygulama olduğunu düşündüm.
Morgan Thrapp

2
@Mego Hiçbir standart şamandıra (hatta dörtlü bile değil) B_60'ı dörtlü bir hassasiyete kaydedemez. Ondalık olarak çıktı alıyorsak genişletilmiş bir hassasiyet biçimi kullanmalı mıyız?
lirtosiast

8
Hassas gereksinimi sevmiyorum. Bazı diller, B_60 için yeterli doğrulukta yüzer araçlarla çalışacak araçlara sahip değildir ve matematiksel bir problemi çözerken bu tür sorunları çözmemeyi tercih ederim. Bir çözüm yazıp sinir bozucu olmak, bunun teknik bir teknik gibi göründüğü için geçersiz olduğunu bulmak.
xnor

2
@ xnor 6 doğruluk rakamı zaten inanılmaz derecede gevşek görünüyor.
primo

Yanıtlar:


8

Julia, 23 20 bayt

Alex A sayesinde 3 byte kurtarıldı

Mathematica çözümüm ve PARI / GP özümümle aynı formülü kullanıyor .

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

2
20 bayt:n->n>0?-zeta(1-n)n:1
Alex A.

@AlexA. Nedenini bilmiyorum, ancak negatif bir tamsayı zeta(n)olduğunda hata atar n. Julia 0.2.1'i Linux üzerinde kullanıyorum.
alephalpha

1
Ah, Julia, senin versiyonun oldukça eski. 0.4.1'de benim için gayet iyi çalışıyor.
Alex A.


9

Julia, 58 bayt

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

Bu, bir Btamsayıyı kabul eden ve bir geri döndüren, BigFloatyani yüksek hassasiyetli bir kayan nokta döndüren bir fonksiyon yaratır .

Ungolfed:

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 bayt

Aslında önce özyinelemeli bir şekilde yapmaya çalıştım, ancak şu anda tasarlandığım gibi tercümanım gerçekten yapamıyor. Bir for döngüsü içinde yinelemeye çalışırsanız, yeni bir özyineleme başlatır. Bu yüzden hassas problemleri olan ... ... tablolama yaklaşımına girdim. Böylece her şeyi kesirlerle yaptım. Kesirler için yerleşik destek yoktur. [ ]

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

Burada dene. Bonus: Dizi, her önceki Bernoulli numarası için tüm kesirlere sahiptir!

Açıklama (biraz sonra)

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

Üçüncü hat sorumludur 1/2ise m1 'dir ve 0/1, eğer m1 den tek bir sayı daha fazla ikinci hat hesaplar olduğu B_m, söz konusu belirli bir toplama formülü ile, ve numerators ve payda ile çok tamamen yok. Aksi takdirde çok daha kısa olurdu. İlk satırın ilk yarısı, bazı defter tutma işlemlerini yapar ve ikinci veya üçüncü satırın uygulanıp uygulanmayacağını seçer ve ikinci yarı, pay ve paydayı GCD'lerine (varsa) ayırır ve bu değerleri saklar. Ve sonunda cevabı çıkarır.


8

Python 2, 118 bayt

Xsot nedeniyle 6 bayt kaydedildi . Peter Taylor nedeniyle 6 10 daha
kaydedildi .

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şağıdaki kimliği kullanır:

burada A , n olup , n inci Alternatif Numarası resmi bir boyutta grubu üzerindeki zaman içinde değişen permütasyon sayısı olarak tanımlanabilir, N (: bakınız ayrıca ikiye bölünmüş, A000111 ).

Kullanılan algoritma orijinal olarak Knuth ve Buckholtz (1967) tarafından verildi :

T 1, k = 1 tümü için k = 1..n olsun

T'nin sonraki değerleri nüks ilişkisi ile verilmiştir:

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

A n sonra T n, 1 tarafından verilir.

(ayrıca bakınız: A185414 )


Python 2, 152 bayt

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 veya daha büyük değerler için gerekli olan tam kesirli gösterimi yazdırır.


1
Eğer değiştirirseniz range(2,n)için range(n-2)size kısaltabilirsiniz n-k+1için n+~k. Ayrıca kullanmak >>1yerine bir sebep var /2mı? Son olarak, önemsiz bir gelişme, ancak takma ad ile birkaç bayt tasarruf edebilirsiniz range.
Aralık'ta

Önerileriniz için teşekkürler. Başlangıçta Onlara katıldım zaman değişen gözden kaçan, iki ifadeler vardı >>1ile /2.
Primo

1
Çıkış hattında tek karakter tasarrufu var: print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]. Ve hesaplama aynı karakter sayımı için yapılabilira=[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/2akıllıdır; 1'in seçilmesi gerekmiyor, çünkü diğer bütün garip değerler zaten sıfır. Alternatif hesaplama aslında, bit inversiyonları ile 4 byte daha kısadır, fakat bir sebepten dolayı oldukça yavaştır.
primo

1
OEIS tablosundan çalışıyordum rangeve bir yinelemeyi bulduğunuzu ve atladığınızı, ilklendirmeyi kısaltmanın akıllı bir yolu olduğunu düşündüm . Şimdi çift ve tek indeksleri dışarı ayrılmışlar yolu çok güzel ve tanımı içine işareti çekerek bir başka tasarruf sağlar a: a=[(-1)**(n/2),n<2]*n. Sonra dönüş değeri +(n<1)or-n/(2.**n-4**n)*a[1]. Ayrıca 2. satırın sonunda başıboş bir noktalı virgül var.
Peter Taylor

6

PARI / GP, 52 23 bayt

Ünlü formülü kullanarak , n * ζ (1- n -) = B , n , ζ olan Riemann Zeta fonksiyonu .

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

Orijinal çözüm, Bernoulli sayılarının üretici işlevini kullanarak, 52 bayt .

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

Sadece bir kez oy verebilir. Yine de kesin değil, çok yazık.
primo

Belgelere göre , zetafonksiyon Bernoulli sayıları kullanılarak hesaplanmaktadır.
primo

@primo, evet, yerleşik zeta'yı hile olarak kullanan tüm cevapları görüyorum.
Peter Taylor

Daha kolay, bernfracve bernrealher biri 8 bayttır ve zaten işlevdirler, bu yüzden buna gerek yok n->. Fakat iyi bir çözüm için +1.
Charles,

6

Python 3, 112 bayt

Düzenleme: Bu cevabı temizledim. Bu soruyu Python 2 ve 3'te cevaplamayı düşündüğüm diğer yolları görmek istiyorsanız, revizyonlara bakın.

Arama tablosunu kullanmazsam (ve bunun yerine notu kullanırım), özyinelemeli tanımı 112 bayta çıkarmayı başarırım! WOO! Dönen not b(m)a Fraction. Her zamanki gibi, bayt sayısı ve test için bir bağlantı .

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

Ve bir arama tablosu kullanmak yapar ve gelen fraksiyonların tüm tablo döndüren bir işlev b(0)için b(m)kapsayıcı.

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
Sanırım float değişmezlerinin sonundaki sıfırı atlayabilirsiniz, örneğin 1.bunun yerine 1.0.
Alex A.

@AlexA. Bitti. Kaldırılan .0dan shızla sonradan bir şamandıra haline gelecektir, çünkü tamamen.
Sherlock9

En p=v=1;exec('[...];p+=1'*k)içteki döngünüzün yerine kullanabilir misiniz ?
lirtosiast

5

CJam, 69 49 34 33 bayt

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

Çevrimiçi demo

Cevabı beni Akiyama-Tanigawa algoritmasından haberdar eden Cabbie407 sayesinde .

teşrih

{           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 ile çarpma ! hassas kaybı önlemek için biraz saçma değilse, zeki. Algoritmanın bundan kaçınmak için hafifçe kırılmayacağını merak ediyorum.
primo

Yeniden yapılanmanın basit bir sebepten dolayı ölçeklendirme ihtiyacından kaçınabileceğini sanmıyorum, çünkü her diğer Bernoulli sayısının 0 olduğunu bildiğimizden, açıkça benzer değerlerin çok fazla çıkarılmasının gerçekleştiği, bu yüzden de felakette anlamlı bir kaybın olduğu birçok yer var. meydana gelebilir.
Peter Taylor

4

PARI / GP, 45 bayt

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

Python cevabımla aynı formülü kullanarak, polylog ile oluşturulan A n ile.


Test Komut Dosyası

Çalıştır gpistemi aşağıdaki yapıştırın:

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

1
Test komut dosyası sağladığınız için teşekkür ederiz - bu testi çok daha kolay hale getirdi!
Mego

İkiniz de @Mego;;)
primo

4

Mathematica, 52 48 42 bayt

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

Kelimenin tam anlamıyla tanımını kullanan adsız işlev.


Sign@#gerekli?
alephalpha

Bilgisayarımda test ettim. Çıkardıktan sonra Sign@#, hala 0 için doğru cevabı döndürür.
alephalpha,

3

Python 2,132 130 bayt

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

Bu referans uygulamasının sadece golf versiyonudur.

Bu pratikte biraz yavaş, ancak önemli bir not ile hızlandırabilir:

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

Bu sürümü çevrimiçi olarak Ideone'da deneyebilirsiniz .


3

gawk4, 79 bayt

-MBayrak için 77 bayt kodu + 2 bayt

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

Bu, Wikipedia sayfasından Akiyama-Tanigawa algoritmasının bir uygulamasıdır.

"6-ondalık basamaklı kural" ile ilgili biraz sorun yaşadım, çünkü bu tam sayıyı ve ardından 6 basamağı yazdırıyor, ancak sonuçları karşılaştırmak için burada liste yok.

Bir kusur, bunun çoğu zaman eksi işareti basmasıdır 0.000000, ancak bunun yanlış olduğunu sanmıyorum.

Kullanım örneği

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'dan 60'a çıktı

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

Çalışır printf"%e"mı?
primo

Hayır, olmaz, çünkü 0.00000s yalnızca çok küçük ve gerçekten sıfır değil.
Cabbie407

2

GolfScript, 63 bayt

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

Çevrimiçi Demo .

Python cevabımla aynı formülü kullanarak .


Test Komut Dosyası

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

Apphb bağlantısı bu zaman aşımına uğrar. Eğer yerel olarak GolfScript kurulu değilse, anarşi golf yorumlayıcısını kullanmanızı tavsiye ederim (formu kullanın, GolfScript'i seçin, yapıştırın, gönderin).


2

Perl, 101 bayt

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

Shebang'ı üç olarak sayarak girdi stdin'den alınır.

Python cevabımla aynı formülü kullanarak .


Örnek Kullanım

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

Çevrimiçi Demo .


2

R, 93 bayt

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)}}

Bir çözüm olarak gerçekten orijinal değil. Herhangi bir yorum varsa, lütfen çekinmeyin!

Ungolfed:

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)

Bunun artık biraz geç olduğunu biliyorum, ancak if/ elsedeyim sırasını değiştirerek 3 bayttan tasarruf edersiniz, bunun yerine m>0döngüleri 1:m-1kullanın.
Billywob 28:16

2

Aslında , 46 45 bayt (rekabet etmeyen)

Cidden / aylarca cidden cevap vermek istedim ve şimdi yapabilirim. Bu, 2015'in Kasım ayında Cidden ciddi olmayan komutları kullandığından, rekabet etmemektedir. Golf önerileri kabul edilir. Çevrimiçi deneyin!

Düzenleme: 2017 yılının Şubat ayında, hangi değişmezlerin hangileri olduğunu değiştiren bir güncelleme yapıldı. Normalde bu, Şubat ayından önce yazılan herhangi bir meydan okuma için rekabet edemez, ancak bu cevap zaten yarışmacı olmadığı için bu cevabı yine de düzenledim. Keyfini çıkarın.

Bu, Vikipedi'deki Bernoulli sayısının açık tanımını kullanır.

;╖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
Komutları kullanır Cidden Kasım 2015'te yoktu? Dostum, bu Kasım 2015’te olmayan tamamen yeni bir dil kullanıyor ! Çok gurur duyuyorum ...
Mego

1

Ruby, 66 61 bayt

Bu Python cevabımın Ruby versiyonudur.

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

Bu Rational, cevaplarında kullandığından beri , bunun 60'a kadar çalıştığından oldukça eminim, ancak bile çalışmakta zorlandım b[24], bu yüzden arama tablosunu tekrar 86 81 80 bayt için uyguladım .

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 bayt

(%1-^@-)t:

Hesaplar n inci bularak Bernoulli sayısı n inci üslü üretme fonksiyonunun katsayısı x (1 - / e -x ).

kullanım

Girdi tamsayı verilirse veya argüman olarak float ise, float çıkarır. Bir sonek ile işaretlenmiş genişletilmiş bir tamsayı verilirse x, ayrılmış bir genişletilmiş tamsayı veya rasyonel, iki genişletilmiş tamsayı çıktısı alacaktır 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

açıklama

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

Aksiyom, 134 147 bayt

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 ve test

(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 karakter, 166 bayt

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üyük rasyonel olarak tamsayı çıkışı olarak giriş

  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 bayt

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

Bu, Vikipedi sayfasında açıklanan Bernoulli sayılarının açık tanımını uygular .


0

Perl 6, 83 bayt

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

Daha hızlı, 114 baytlık bir çözüm:

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

Bir kod golf mücadelesi için kodunuzun, bazı girdiler için sonlandırılması birkaç evreyi alsa bile, mümkün olduğu kadar kısa olması gerekir.
Mego

0

Javascript, 168 bayt

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' değişkenini istediğiniz Bernoulli sayısına ayarlayın ve sonuç [0] üzerinde c [0] olur. (pay ve payda)

Örnek Kullanım

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

Diğerleri kadar küçük değil, yazdığım tek şey yaklaşıyor. Diğer (golf dışı) girişimlerim için https://marquisdegeek.com/code_ada99 adresine bakın .


0

Aksiyom, 57 bayt

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

test ve sonuçlar için kod

(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

işlevin, yukarıda t*%e^t/(%e^t-1))yazılanın değil ,% e Euler costant ile işleve sahip olduğunu belirtmesi gerekir.


0

Pyth , 22 bayt

L?b-1sm*.cbdcyd-btdUb1

Çevrimiçi deneyin!

y<number>Örn yQ. Denilen bir işlevi tanımlar .

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.