Les nombres de Bernoulli (spécifiquement, les seconds nombres de Bernoulli) sont définis par la définition récursive suivante:
Où dénote une combinaison .
Étant donné un entier non négatif m
en entrée, émettez la représentation décimale OU une fraction réduite pour le m
deuxième nombre de Bernoulli. Si vous affichez une représentation décimale, vous devez avoir au moins 6 décimales (chiffres après la virgule décimale) de précision, et elle doit être précise lorsqu'elle est arrondie à 6 décimales. Par exemple, pour m = 2
, 0.166666523
est acceptable car il arrondit à 0.166667
. 0.166666389
n'est pas acceptable, car il arrondit à 0.166666
. Les zéros de fin peuvent être omis. La notation scientifique peut être utilisée pour les représentations décimales.
Voici l'entrée et la sortie attendue m
jusqu'à 60 inclusivement, en notation scientifique arrondie à 6 décimales et en fractions réduites:
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)
Implémentation de référence (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
Règles
- C'est le code-golf , donc le code le plus court en octets gagne
- Vous ne pouvez utiliser aucune fonction, intégrée ou incluse dans une bibliothèque externe, qui calcule l'un ou l'autre type de nombres de Bernoulli ou de polynômes de Bernoulli.
- Votre réponse doit donner une sortie correcte pour toutes les entrées jusqu'à 60 inclus.
Classement
L'extrait de pile au bas de cet article génère le classement à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Réponses:
Julia,
2320 octetsEnregistré 3 octets grâce à Alex A.
Il utilise la même formule que ma solution Mathematica et ma solution PARI / GP .
la source
n->n>0?-zeta(1-n)n:1
zeta(n)
jette une erreur quandn
est un entier négatif. J'utilise Julia 0.2.1 sur linux.Mathematica,
40282322 octetsEn utilisant la célèbre formule n * ζ (1− n ) = - B n , où ζ est la fonction Riemann Zeta .
La même longueur:
Solution originale, 40 octets, utilisant la fonction génératrice des nombres de Bernoulli .
la source
Julia, 58 octets
Cela crée une fonction récursive
B
qui accepte un entier et renvoie unBigFloat
(c'est-à-dire virgule flottante de haute précision).Non golfé:
la source
Minkolang 0,14 , 97 octets
J'ai essayé de le faire récursivement en premier, mais mon interprète, tel qu'il est actuellement conçu, ne peut pas le faire. Si vous essayez de récuser à partir d'une boucle for, il démarre une nouvelle récursivité. J'ai donc opté pour l'approche de tabulation ... qui avait des problèmes de précision. J'ai donc fait le tout avec des fractions. Sans prise en charge intégrée des fractions. [ soupir ]
Essayez-le ici. Bonus: le tableau a toutes les fractions pour chaque numéro de Bernoulli précédent!
Explication (un peu)
La troisième ligne est responsable de
1/2
sim
est 1 et0/1
sim
est un nombre impair supérieur à 1. La deuxième ligne calculeB_m
avec la formule de sommation donnée dans la question, et le fait entièrement avec des numérateurs et des dénominateurs. Sinon, ce serait beaucoup plus court. La première moitié de la première ligne fait de la comptabilité et choisit d'exécuter la deuxième ou la troisième ligne, et la seconde moitié divise le numérateur et le dénominateur par leur GCD (le cas échéant) et stocke ces valeurs. Et sort la réponse à la fin.la source
Python 2, 118 octets
6 octets enregistrés grâce à xsot .
Enregistré
610 de plus grâce à Peter Taylor .Utilise l'identité suivante:
où A n est le n ème nombre alternatif , qui peut être formellement défini comme le nombre de permutations alternées sur un ensemble de taille n , divisé par deux (voir aussi: A000111 ).
L'algorithme utilisé a été initialement donné par Knuth et Buckholtz (1967) :
Python 2, 152 octets
Imprime la représentation fractionnelle exacte, nécessaire pour les valeurs supérieures à 200 environ.
la source
range(2,n)
à,range(n-2)
vous pouvez raccourcirn-k+1
enn+~k
. Aussi, est - il une raison que vous utilisez au>>1
lieu de/2
? Enfin, une amélioration triviale, mais vous pouvez économiser quelques octets par aliasrange
.>>1
avec/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. Et le calcul peut être fait pour le même nombre de caractères 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
est intelligent; 1 n'a pas besoin d'être isolé, car de toute façon toutes les autres valeurs impaires sont nulles. Le calcul alternatif est en fait 4 octets plus court avec des inversions de bits, mais aussi considérablement plus lent, pour une raison quelconque.range
et ignoré une itération pour être un moyen intelligent de raccourcir l'initialisation. La façon dont vous avez maintenant divisé en paires et indices impairs est très agréable et permet une économie supplémentaire en tirant le signe dans la définition dea
:a=[(-1)**(n/2),n<2]*n
. La valeur de retour est alors+(n<1)or-n/(2.**n-4**n)*a[1]
. Vous avez également un point-virgule errant à la fin de la ligne 2.PARI / GP,
5223 octetsEn utilisant la célèbre formule n * ζ (1− n ) = - B n , où ζ est la fonction Riemann Zeta .
Solution originale, 52 octets, utilisant la fonction génératrice des nombres de Bernoulli .
la source
zeta
fonction est calculée en utilisant des nombres de Bernoulli, en fait.bernfrac
avecbernreal
8 octets chacun et ils sont déjà des fonctions, donc pas besoin den->
. Mais +1 pour une bonne solution.Python 3, 112 octets
Edit: j'ai nettoyé cette réponse. Si vous voulez voir toutes les autres façons auxquelles j'ai pensé pour répondre à cette question en Python 2 et 3, regardez dans les révisions.
Si je n'utilise pas la table de recherche (et j'utilise plutôt la mémorisation), j'arrive à obtenir la définition récursive à 112 octets! COURTISER! Notez que
b(m)
renvoie aFraction
. Comme d'habitude, le nombre d'octets et un lien pour les tests .Et une fonction qui utilise une table de recherche et renvoie la table entière des fractions de
b(0)
àb(m)
, inclus.la source
1.
au lieu de1.0
..0
des
tout, car il deviendra rapidement un flotteur plus tard.p=v=1;exec('[...];p+=1'*k)
place de votre boucle la plus intérieure?CJam,
69 49 3433 octetsDémo en ligne
Merci à Cabbie407 , dont la réponse m'a fait connaître l'algorithme Akiyama – Tanigawa.
Dissection
la source
PARI / GP, 45 octets
En utilisant la même formule que ma réponse Python , avec A n généré via polylog.
Script de test
Exécutez
gp
, à l'invite, collez ce qui suit:la source
Mathematica,
524842 octetsFonction sans nom qui utilise la définition littérale.
la source
Sign@#
nécessaire?Sign@#
, il renvoie toujours la bonne réponse pour 0.Python 2,
132130 octetsCeci est juste une version golfée de l'implémentation de référence.
Ceci est un peu lent dans la pratique, mais peut être accéléré de manière significative avec la mémorisation:
Vous pouvez essayer cette version en ligne sur Ideone .
la source
gawk4, 79 octets
Code de 77 octets + 2 octets pour l'
-M
indicateurIl s'agit d'une implémentation de l'algorithme Akiyama – Tanigawa de la page Wikipedia.
Nous avons eu des problèmes avec la "règle des 6 chiffres décimaux", car cela imprime le nombre entier, puis 6 chiffres, mais il n'y a pas de liste ici pour comparer les résultats.
Un défaut est que cela imprime un signe moins devant la
0.000000
plupart du temps, mais je ne pense pas que ce soit faux.Exemple d'utilisation
Sortie de 0 à 60
la source
printf"%e"
marcherait?0.00000
s ne sont que très petits et pas vraiment nuls.GolfScript, 63 octets
Démo en ligne .
En utilisant la même formule que ma réponse Python .
Script de test
Le lien apphb expirera à ce sujet. Si vous n'avez pas GolfScript installé localement, je recommande d'utiliser l' interpréteur de golf anarchy (utilisez le formulaire, sélectionnez GolfScript, collez, soumettez).
la source
Perl, 101 octets
En comptant le shebang comme trois, l'entrée provient de stdin.
En utilisant la même formule que ma réponse Python .
Exemple d'utilisation
Démo en ligne .
la source
R, 93 octets
Pas vraiment original comme solution. Si vous avez des commentaires, n'hésitez pas!
Non golfé:
la source
if
/else
instruction et en utilisantm>0
ainsi qu'en bouclant à la1:m-1
place.En fait ,
4645 octets (non concurrents)Cela faisait des mois que je voulais faire une réponse sérieusement / réellement et maintenant je peux. Comme cela utilise des commandes que Serious n'avait pas en novembre 2015, ce n'est pas une compétition. Suggestions de golf bienvenues. Essayez-le en ligne!
Modifier: En février 2017, une mise à jour d'Actually a changé les littéraux de fonction. Normalement, cela ne serait tout simplement pas en compétition pour tout défi écrit avant février, mais comme cette réponse est déjà non concurrentielle, j'ai quand même édité cette réponse. Prendre plaisir.
Cela utilise la définition explicite des nombres de Bernoulli sur Wikipédia.
Ungolfing
la source
Rubis,
6661 octetsCeci est une version Ruby de ma réponse Python.
Étant donné que cela utilise
Rational
dans ses réponses, je suis assez sûr que cela fonctionne jusqu'à 60, mais j'ai eu du mal à fonctionner mêmeb[24]
, j'ai donc implémenté à nouveau la table de recherche pour868180 octets.la source
J, 10 octets
Calcule le n ème nombre de Bernoulli en trouvant le n ème coefficient de la fonction génératrice exponentielle de x / (1 - e -x ).
Usage
Si l'entrée reçoit un entier ou flotte comme argument, elle sortira un flottant. Si on lui donne un entier étendu, marqué d'un suffixe
x
, il affichera soit un entier étendu soit un rationnel, deux entiers étendus séparés parr
.Explication
la source
Axiome,
134147 octetsungolf et test
la source
APL (NARS), 83 caractères, 166 octets
Entrée comme sortie entière aussi grande rationnelle
la source
Haskell, 95 octets
Cela met en œuvre la définition explicite des nombres de Bernoulli décrite sur la page Wikipedia .
la source
Perl 6, 83 octets
Une solution plus rapide de 114 octets:
la source
Javascript, 168 octets
Définissez la variable 'k' sur le nombre de Bernoulli souhaité, et le résultat est c [0] sur a [0]. (Numérateur dénominateur)
Exemple d'utilisation
Pas aussi petit que les autres, mais le seul que j'ai écrit qui se rapproche. Voir https://marquisdegeek.com/code_ada99 pour mes autres tentatives (hors golf).
la source
Axiome, 57 octets
code pour test et résultats
il faut noter que la fonction n'est pas celle que quelqu'un a écrite ci-dessus mais
t*%e^t/(%e^t-1))
avec% e Euler costantla source
Pyth , 22 octets
Essayez-le en ligne!
Définit une fonction appelée par
y<number>
exempleyQ
.la source