Os números de Bernoulli (especificamente, o segundo número de Bernoulli) são definidos pela seguinte definição recursiva:
Onde denota uma combinação .
Dado um número inteiro não negativo m
como entrada, imprima a representação decimal OU uma fração reduzida para o m
segundo número de Bernoulli. Se você produzir uma representação decimal, deverá ter pelo menos 6 casas decimais (dígitos após o ponto decimal) de precisão, e ela deve ser precisa quando arredondada para 6 casas decimais. Por exemplo, para m = 2
, 0.166666523
é aceitável porque arredonda para 0.166667
. 0.166666389
não é aceitável, porque arredonda para 0.166666
. Zeros à direita podem ser omitidos. Notação científica pode ser usada para representações decimais.
Aqui está a entrada e a saída esperada para m
até 60 inclusive, em notação científica arredondada para 6 casas decimais e como frações reduzidas:
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)
Implementação de referência (em 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
Regras
- Isso é código-golfe , então o código mais curto em bytes ganha
- Você não pode usar nenhuma função, interna ou incluída em uma biblioteca externa, que calcule o tipo de números de Bernoulli ou os polinômios de Bernoulli.
- Sua resposta deve fornecer uma saída correta para todas as entradas até 60, inclusive.
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respostas:
Julia,
2320 bytesEconomizou 3 bytes graças a Alex A.
Ele usa a mesma fórmula da minha solução Mathematica e da solução PARI / GP .
fonte
n->n>0?-zeta(1-n)n:1
zeta(n)
lança um erro quandon
é um número inteiro negativo. Estou usando Julia 0.2.1 no linux.Mathematica,
40282322 bytesUsando a famosa fórmula n * ζ (1− n ) = - B n , onde ζ é a função Riemann Zeta .
O mesmo comprimento:
Solução original, 40 bytes, usando a função geradora dos números de Bernoulli .
fonte
Julia, 58 bytes
Isso cria uma função recursiva
B
que aceita um número inteiro e retorna umBigFloat
(ou seja, ponto flutuante de alta precisão).Ungolfed:
fonte
Minkolang 0.14 , 97 bytes
Na verdade, tentei fazê-lo recursivamente primeiro, mas meu intérprete, como projetado atualmente, na verdade não pode fazê-lo. Se você tentar se recuperar de dentro de um loop for, ele inicia uma nova recursão. Então eu fui para a abordagem de tabulação ... que tinha problemas de precisão. Então eu fiz a coisa toda com frações. Sem suporte interno para frações. [ suspiro ]
Experimente aqui. Bônus: a matriz possui todas as frações para cada número anterior de Bernoulli!
Explicação (daqui a pouco)
A terceira linha é responsável por
1/2
sem
for 1 e0/1
sem
for um número ímpar maior que 1. A segunda linha calculaB_m
com a fórmula da soma dada na pergunta e o faz inteiramente com numeradores e denominadores. Caso contrário, seria muito mais curto. A primeira metade da primeira linha faz alguma contabilidade e escolhe se quer executar a segunda ou terceira linha, e a segunda metade divide o numerador e o denominador pelo seu GCD (se aplicável) e armazena esses valores. E gera a resposta no final.fonte
Python 2, 118 bytes
Salvo 6 bytes devido ao xsot .
Guardou
610 mais devido a Peter Taylor .Usa a seguinte identidade:
onde A n é o n th alternada número , que pode ser formalmente definida como o número de permutações alternada com um conjunto de tamanho n , para metade (ver também: A000111 ).
O algoritmo usado foi originalmente dado por Knuth e Buckholtz (1967) :
Python 2, 152 bytes
Imprime a representação fracionária exata, necessária para valores maiores que 200.
fonte
range(2,n)
pararange(n-2)
você pode reduzirn-k+1
paran+~k
. Além disso, existe um motivo para você usar em>>1
vez de/2
? Por fim, uma melhoria trivial, mas você pode salvar alguns bytes usando o aliasrange
.>>1
com/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. E o cálculo pode ser feito para a mesma contagem de caracteres comoa=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
é inteligente; 1 não precisa ser destacado, porque todos os outros valores ímpares são zero de qualquer maneira. O cálculo alternativo é na verdade 4 bytes mais curto com inversões de bits, mas também consideravelmente mais lento, por algum motivo.range
e pulando uma iteração para ser uma maneira inteligente de diminuir a inicialização. A maneira que você agora dividir a pares e ímpares índices é muito agradável, e permite uma maior poupança puxando o sinal para a definição dea
:a=[(-1)**(n/2),n<2]*n
. Então o valor de retorno é+(n<1)or-n/(2.**n-4**n)*a[1]
. Você também tem um ponto-e-vírgula perdido no final da linha 2.PARI / GP,
5223 bytesUsando a famosa fórmula n * ζ (1− n ) = - B n , onde ζ é a função Riemann Zeta .
Solução original, 52 bytes, usando a função geradora dos números de Bernoulli .
fonte
zeta
função é calculada usando números de Bernoulli, de fato.bernfrac
ebernreal
são 8 bytes cada e já são funções, portanto não há necessidade den->
. Mas +1 para uma boa solução.Python 3, 112 bytes
Edit: Eu limpei esta resposta. Se você quiser ver todas as outras maneiras pelas quais pensei em responder a essa pergunta no Python 2 e 3, consulte as revisões.
Se eu não usar a tabela de pesquisa (e usar a memorização), consigo obter a definição recursiva para 112 bytes! WOO! Observe que
b(m)
retorna aFraction
. Como sempre, a contagem de bytes e um link para teste .E uma função que usa uma tabela de pesquisa e retorna a tabela inteira de frações de
b(0)
parab(m)
, inclusive.fonte
1.
vez de1.0
..0
a partirs
inteiramente, porque ele vai rapidamente tornar-se uma bóia mais tarde.p=v=1;exec('[...];p+=1'*k)
vez do seu loop mais interno?CJam,
69 49 3433 bytesDemonstração online
Agradeço ao Cabbie407 , cuja resposta me conscientizou do algoritmo Akiyama – Tanigawa.
Dissecação
fonte
PARI / GP, 45 bytes
Usando a mesma fórmula da minha resposta Python , com A n gerado via polylog.
Script de Teste
Execute
gp
, no prompt, cole o seguinte:fonte
Mathematica,
524842 bytesFunção sem nome que usa a definição literal.
fonte
Sign@#
necessário?Sign@#
, ainda retorna a resposta correta para 0.Python 2,
132130 bytesEsta é apenas uma versão básica da implementação de referência.
Isso é um pouco lento na prática, mas pode ser acelerado significativamente com a memorização:
Você pode experimentar esta versão online no Ideone .
fonte
gawk4, 79 bytes
Código de 77 bytes + 2 bytes para
-M
sinalizadorÉ uma implementação do algoritmo Akiyama – Tanigawa da página da Wikipedia.
Houve algum problema com a "regra de 6 dígitos decimais", porque isso imprime o número inteiro e, em seguida, 6 dígitos, mas não há lista aqui para comparar os resultados.
Uma falha é que isso imprime um sinal de menos na frente do
0.000000
muitas vezes, mas não acho que isso esteja errado.Exemplo de uso
Saída de 0 a 60
fonte
printf"%e"
?0.00000
são apenas muito pequenos e não são realmente zero.GolfScript, 63 bytes
Demonstração Online .
Usando a mesma fórmula da minha resposta Python .
Script de Teste
O link apphb irá expirar nisso. Se você não tiver o GolfScript instalado localmente, recomendo o uso do intérprete anarchy golf (use o formulário, selecione GolfScript, cole, envie).
fonte
Perl, 101 bytes
Contando o shebang como três, a entrada é retirada de stdin.
Usando a mesma fórmula da minha resposta Python .
Uso da amostra
Demonstração Online .
fonte
R, 93 bytes
Não é realmente original como solução. Se algum comentário, por favor, sinta-se livre!
Ungolfed:
fonte
if
/else
e usarm>0
, bem como fazer o loop1:m-1
.Na verdade ,
4645 bytes (não concorrentes)Estou pensando em fazer uma resposta séria / realmente há meses e agora posso. Como ele usa comandos que a Seriously não possuía em novembro de 2015, não é concorrente. Sugestões de golfe são bem-vindas. Experimente online!
Edit: Em fevereiro de 2017, houve uma atualização na verdade que mudou quais literais de funções são quais. Normalmente, isso seria simplesmente não concorrente para qualquer desafio escrito antes de fevereiro, mas como essa resposta já não é competitiva, editei essa resposta de qualquer maneira. Apreciar.
Isso usa a definição explícita dos números de Bernoulli na Wikipedia.
Ungolfing
fonte
Ruby,
6661 bytesEsta é uma versão Ruby da minha resposta em Python.
Como isso é usado
Rational
em suas respostas, tenho certeza que isso funciona até 60, mas tive problemas para rodar mesmob[24]
, então implementei a tabela de pesquisa novamente para868180 bytes.fonte
J, 10 bytes
Calcula o n th número de Bernoulli, encontrando o n th coeficiente da função geradora exponencial de x / (1 - e -x ).
Uso
Se a entrada recebe um número inteiro ou flutua como argumento, ela produzirá uma flutuação. Se for fornecido um número inteiro estendido, marcado com um sufixo
x
, ele produzirá um número inteiro estendido ou um racional, dois números inteiros estendidos separados porr
.Explicação
fonte
Axioma,
134147 bytesungolf e teste
fonte
APL (NARS), 83 caracteres, 166 bytes
Entrada como saída inteira como grande racional
fonte
Haskell, 95 bytes
Isso implementa a definição explícita dos números de Bernoulli descritos na página da Wikipedia .
fonte
Perl 6, 83 bytes
Uma solução mais rápida de 114 bytes:
fonte
Javascript, 168 bytes
Defina a variável 'k' como o número de Bernoulli desejado e o resultado é c [0] sobre um [0]. (numerador denominador)
Uso da amostra
Não é tão pequeno quanto os outros, mas o único que escrevi que se aproxima. Consulte https://marquisdegeek.com/code_ada99 para minhas outras tentativas (que não são de golfe).
fonte
Axioma, 57 bytes
código para teste e resultados
é preciso notar que a função não é a que alguém escreveu acima, mas
t*%e^t/(%e^t-1))
com% e Euler costantfonte
Pitão , 22 bytes
Experimente online!
Define uma função que é chamada como
y<number>
, por exemployQ
.fonte