Los números de Bernoulli (específicamente, los segundos números de Bernoulli) se definen mediante la siguiente definición recursiva:
Donde denota una combinación .
Dado un entero no negativo m
como entrada, genera la representación decimal O una fracción reducida para el m
segundo número de Bernoulli. Si genera una representación decimal, debe tener al menos 6 decimales (dígitos después del punto decimal) de precisión, y debe ser precisa cuando se redondea a 6 decimales. Por ejemplo, para m = 2
, 0.166666523
es aceptable porque se redondea a 0.166667
. 0.166666389
no es aceptable, ya que se redondea a 0.166666
. Los ceros finales pueden omitirse. La notación científica puede usarse para representaciones decimales.
Aquí está la entrada y la salida esperada m
hasta 60 inclusive, en notación científica redondeada a 6 decimales, y como fracciones reducidas:
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)
Implementación de referencia (en 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
Reglas
- Este es el código de golf , por lo que gana el código más corto en bytes
- No puede usar ninguna función, ya sea incorporada o incluida en una biblioteca externa, que calcule cualquier tipo de números de Bernoulli o polinomios de Bernoulli.
- Su respuesta debe proporcionar la salida correcta para todas las entradas hasta 60 inclusive.
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respuestas:
Julia,
2320 bytesGuardado 3 bytes gracias a Alex A.
Utiliza la misma fórmula que mi solución de Mathematica y la solución PARI / GP .
fuente
n->n>0?-zeta(1-n)n:1
zeta(n)
arroja un error cuandon
es un entero negativo. Estoy usando Julia 0.2.1 en Linux.Mathematica,
40282322 bytesUsando la famosa fórmula n * ζ (1− n ) = - B n , donde ζ es la función Riemann Zeta .
La misma longitud:
Solución original, 40 bytes, utilizando la función de generación de números de Bernoulli .
fuente
Julia, 58 bytes
Esto crea una función recursiva
B
que acepta un número entero y devuelve unBigFloat
(es decir, punto flotante de alta precisión).Sin golf:
fuente
Minkolang 0.14 , 97 bytes
De hecho, intenté hacerlo de forma recursiva primero, pero mi intérprete, como está diseñado actualmente, en realidad no puede hacerlo. Si intenta recurrir desde un bucle for, comienza una nueva recursión. Así que opté por el enfoque de tabulación ... que tenía problemas de precisión. Así que hice todo con fracciones. Sin soporte incorporado para fracciones. [ suspiro ]
Pruébalo aquíBonificación: ¡la matriz tiene todas las fracciones para cada número de Bernoulli anterior!
Explicación (en un momento)
La tercera línea es responsable de
1/2
sim
es 1 y0/1
sim
es un número impar mayor que 1. La segunda línea calculaB_m
con la fórmula de suma dada en la pregunta, y lo hace completamente con numeradores y denominadores. De lo contrario, sería mucho más corto. La primera mitad de la primera línea hace un poco de contabilidad y elige si ejecutar la segunda o tercera línea, y la segunda mitad divide el numerador y el denominador por su MCD (si corresponde) y almacena esos valores. Y genera la respuesta al final.fuente
Python 2, 118 bytes
Guardado 6 bytes debido a xsot .
Salvó
610 más debido a Peter Taylor .Utiliza la siguiente identidad:
donde A n es el enésimo número alternativo , que se puede definir formalmente como el número de permutaciones alternas en un conjunto de tamaño n , reducido a la mitad (ver también: A000111 ).
El algoritmo utilizado fue dado originalmente por Knuth y Buckholtz (1967) :
Python 2, 152 bytes
Imprime la representación fraccionaria exacta, necesaria para valores superiores a 200 aproximadamente.
fuente
range(2,n)
arange(n-2)
puedes acortarn-k+1
an+~k
. Además, ¿hay alguna razón para usar en>>1
lugar de/2
? Por último, una mejora trivial, pero puede guardar algunos bytes aliasingrange
.>>1
con/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. Y el cálculo se puede hacer para el mismo recuento de caracteres quea=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
es inteligente; 1 no necesita ser señalado, porque todos los demás valores impares son cero de todos modos. El cálculo alternativo es en realidad 4 bytes más corto con inversiones de bits, pero también considerablemente más lento, por alguna razón.range
y omitir una iteración para ser una forma inteligente de acortar la inicialización. La forma en que ahora ha dividido a cabo índices pares e impares es muy agradable, y permite un ahorro adicional tirando de la señal en la definición dea
:a=[(-1)**(n/2),n<2]*n
. Entonces el valor de retorno es+(n<1)or-n/(2.**n-4**n)*a[1]
. También tienes un punto y coma al final de la línea 2.PARI / GP,
5223 bytesUsando la famosa fórmula n * ζ (1− n ) = - B n , donde ζ es la función Riemann Zeta .
Solución original, 52 bytes, utilizando la función de generación de números de Bernoulli .
fuente
zeta
función se calcula utilizando números de Bernoulli, de hecho.bernfrac
ybernreal
son 8 bytes cada uno y ya son funciones, por lo que no es necesarion->
. Pero +1 para una buena solución.Python 3, 112 bytes
Editar: limpié esta respuesta. Si desea ver todas las otras formas en que pensé para responder esta pregunta en Python 2 y 3, mire las revisiones.
Si no uso la tabla de búsqueda (y uso la memorización en su lugar), ¡me las arreglo para obtener la definición recursiva a 112 bytes! ¡CORTEJAR! Tenga en cuenta que
b(m)
devuelve aFraction
. Como de costumbre, el conteo de bytes y un enlace para la prueba .Y una función que usa una tabla de búsqueda y devuelve toda la tabla de fracciones de
b(0)
ab(m)
, inclusive.fuente
1.
lugar de1.0
..0
pors
completo, porque se convertirá rápidamente en un flotador más tarde.p=v=1;exec('[...];p+=1'*k)
lugar de su bucle más interno?CJam,
69 49 3433 bytesDemostración en línea
Gracias a Cabbie407 , cuya respuesta me hizo conocer el algoritmo Akiyama-Tanigawa.
Disección
fuente
PARI / GP, 45 bytes
Usando la misma fórmula que mi respuesta de Python , con A n generada a través de polylog.
Script de prueba
Ejecute
gp
, en el indicador, pegue lo siguiente:fuente
Mathematica,
524842 bytesFunción sin nombre que utiliza la definición literal.
fuente
Sign@#
necesario?Sign@#
, aún devuelve la respuesta correcta para 0.Python 2,
132130 bytesEsta es solo una versión de golf de la implementación de referencia.
Esto es un poco lento en la práctica, pero se puede acelerar significativamente con la memorización:
Puede probar esta versión en línea en Ideone .
fuente
gawk4, 79 bytes
Código de 77 bytes + 2 bytes para
-M
banderaEs una implementación del algoritmo Akiyama-Tanigawa de la página de Wikipedia.
Tuve algunos problemas con la "regla de los 6 dígitos decimales", porque imprime el número entero y luego los 6 dígitos, pero no hay una lista aquí para comparar los resultados.
Un defecto es que esto imprime un signo menos delante de
0.000000
muchas veces, pero no creo que eso esté mal.Ejemplo de uso
Salida de 0 a 60
fuente
printf"%e"
?0.00000
s son muy pequeños y no son realmente cero.GolfScript, 63 bytes
Demo en línea .
Usando la misma fórmula que mi respuesta de Python .
Script de prueba
El enlace apphb terminará con esto. Si no tiene GolfScript instalado localmente, le recomiendo usar el intérprete de golf anarchy (use el formulario, seleccione GolfScript, pegue, envíe).
fuente
Perl, 101 bytes
Contando el shebang como tres, la entrada se toma de stdin.
Usando la misma fórmula que mi respuesta de Python .
Uso de muestra
Demo en línea .
fuente
R, 93 bytes
No es realmente original como solución. Si hay algún comentario, ¡no dudes en hacerlo!
Sin golf:
fuente
if
/else
y usarlom>0
, así como hacer un bucle1:m-1
.En realidad ,
4645 bytes (no competitivos)He tenido la intención de hacer una respuesta en serio / en realidad durante meses y ahora puedo. Como esto usa comandos que Seriously no tenía en noviembre de 2015, no compite. Sugerencias de golf bienvenidas. Pruébalo en línea!
Editar: en febrero de 2017, hubo una actualización de En realidad que cambió qué funciones literales son cuáles. Normalmente, esto simplemente no competiría para ningún desafío escrito antes de febrero, pero como esta respuesta ya no es competitiva, edité esta respuesta de todos modos. Disfrutar.
Esto utiliza la definición explícita de los números de Bernoulli en Wikipedia.
Ungolfing
fuente
Ruby,
6661 bytesEsta es una versión Ruby de mi respuesta de Python.
Como esto se usa
Rational
en sus respuestas, estoy bastante seguro de que funciona hasta 60, pero tuve problemas para ejecutar inclusob[24]
, así que implementé la tabla de búsqueda nuevamente para868180 bytes.fuente
J, 10 bytes
Calcula el n º número Bernoulli mediante la búsqueda de la n º coeficiente de la función de generación exponencial de x / (1 - e -x ).
Uso
Si a la entrada se le da un número entero o flota como argumento, generará un flotante. Si se le da un entero extendido, marcado con un sufijo
x
, generará un entero extendido o un racional, dos enteros extendidos separados porr
.Explicación
fuente
Axioma,
134147 bytesungolf y prueba
fuente
APL (NARS), 83 caracteres, 166 bytes
Entrada como salida entera como gran racional
fuente
Haskell, 95 bytes
Esto implementa la definición explícita de los números de Bernoulli descritos en la página de Wikipedia .
fuente
Perl 6, 83 bytes
Una solución más rápida de 114 bytes:
fuente
Javascript, 168 bytes
Establezca la variable 'k' en el número de Bernoulli que desee, y el resultado es c [0] sobre un [0]. (numerador denominador)
Uso de muestra
No es tan pequeño como los otros, pero el único que he escrito que se acerca. Vea https://marquisdegeek.com/code_ada99 para mis otros intentos (que no sean de golf).
fuente
Axioma, 57 bytes
código para prueba y resultados
hay que tener en cuenta que la función no es la que alguien escribió anteriormente, sino
t*%e^t/(%e^t-1))
con% e Euler costantfuente
Pyth , 22 bytes
Pruébalo en línea!
Define una función que se llama como
y<number>
, por ejemployQ
.fuente