Bernoulli numbers: Difference between revisions

m
(Added AppleScript.)
 
(14 intermediate revisions by 6 users not shown)
Line 32:
* Luschny's [http://luschny.de/math/zeta/The-Bernoulli-Manifesto.html The Bernoulli Manifesto] for a discussion on &nbsp; <big> '''B<sub>1</sub> &nbsp; = &nbsp; -&frac12;''' &nbsp; versus &nbsp; '''+&frac12;'''. </big>
<br><br>
 
=={{header|Ada}}==
Using a GMP thick binding available at http://www.codeforge.com/article/422541
 
<langsyntaxhighlight Adalang="ada">WITH GMP.Rationals, GMP.Integers, Ada.Text_IO, Ada.Strings.Fixed, Ada.Strings;
USE GMP.Rationals, GMP.Integers, Ada.Text_IO, Ada.Strings.Fixed, Ada.Strings;
 
Line 67 ⟶ 66:
END IF;
END LOOP;
END Main;</langsyntaxhighlight>
{{out}}
<pre>
Line 103 ⟶ 102:
B(60)=-1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
Uses the LONG LONG INT mode of Algol 68G which allows large precision integers.
<langsyntaxhighlight lang="algol68">BEGIN
# Show Bernoulli numbers B0 to B60 as rational numbers #
 
Line 184 ⟶ 182:
OD
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 220 ⟶ 218:
B(60) -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|AppleScript}}==
I've onlyTo beenbe able to gethandle accurate results up to B(31) using AppleScript's number classes and operators and up to B(57) with the Foundation framework's NSDecimalNumber class in AppleScriptObjC. To handlenumbers up to B(60) and beyond, thethis script hererepresents replacesthe numbers with lists whose items are integers representing the numbers' decimaldigit digitsvalues — which of course requires custom math routines.
<langsyntaxhighlight lang="applescript">on bernoullis(n) -- Return a list of "numerator / denominator" texts representing Bernoulli numbers B(0) to B(n).
set listMathScript to getListMathScript(10) -- Script object providing custom list math routines.
set output to {}
-- Akiyama–Tanigawa algorithm for the "second Bernoulli numbers".
-- List 'a' will contain {numerator, denominator} lists for therepresenting fractions.
-- The numerators and denominators will in turn be lists containing integers asrepresenting their (decimal) digits.
set a to {}
repeat with m from 0 to n
Line 236 ⟶ 233:
set a's end to result
repeat with j from m to 1 by -1
-- Retrieve the preceding fraction's numerator and denominator.
set {numerator1, denominator1} to a's item j
tell listMathScript
-- ResetGet {numerator2,the denominator2}two tofractions' (precedinglowest fractioncommon -denominator newand fraction)adjust *the jnumerators as follows:accordingly.
-- Work out the two fractions' lowest common denominator and adjust the numerators accordingly.
set lcd to its lcm(denominator1, denominator2)
set numerator1 to its multiply(numerator1, its |div|(lcd, denominator1))
set numerator2 to its multiply(numerator2, its |div|(lcd, denominator2))
-- Subtract numerator2 from numerator1 and multiply the result by j.
-- Assign the results to numerator2 and denominator2 for the next iteration.
set numerator2 to its multiply(its subtract(numerator1, numerator2), its intToList(j))
set denominator2 to lcd
end tell
-- StoreAlso thestore resulting fractionthem in a's slot j. Don'tNo botherneed to reduce itthem here.
set a's item j to {numerator2, denominator2}
end repeat
-- The fraction just stored in a's first slot is Bernoulli(m). Reduce it and append a text representation to the output.
-- Reduce it and append a text representation to the output.
tell listMathScript
set gcd to its hcf(numerator2, denominator2)
Line 266 ⟶ 262:
on getListMathScript(base)
script
on multiply(alst1, blst2) -- Multiply list alst1 by list blst2.
set aLengthlst1Length to (count alst1)
set bLengthlst2Length to (count blst2)
set productLength to aLengthlst1Length + bLengthlst2Length - 1
set product to {}
repeat productLength times
Line 275 ⟶ 271:
end repeat
-- Long multiplication algorithm, updating product digits on the fly instead of summing rows at the end.
repeat with bIndex from -1 to -bLength by -1
repeat with lst2Index from set bDigit-1 to b's-lst2Length itemby bIndex-1
ifset (bDigitlst2Digit isto notlst2's 0)item thenlst2Index
if (lst2Digit is not 0) then
set carry to 0
set productIndex to bIndexlst2Index
repeat with aIndexlst1Index from aLengthlst1's length to 1 by -1
settell subresult to bDigitlst2Digit * (alst1's item aIndexlst1Index) + carry + (product's item productIndex)
set product's item productIndex to (subresultit mod base)
set carry to subresult(it div base)
end tell
set productIndex to productIndex - 1
end repeat
Line 298 ⟶ 296:
end multiply
on subtract(alst1, blst2) -- Subtract list blst2 from list alst1.
set aLengthlst1Length to (count alst1)
set bLengthlst2Length to (count blst2)
copy-- aPad copies to differenceequal lengths.
copy blst1 to blst1
repeat (bLengthlst2Length - aLengthlst1Length) times
set differencelst1's beginning to 0
end repeat
repeatcopy (aLengthlst2 -to bLength) timeslst2
repeat (lst1Length - lst2Length) set b's beginning to 0times
set lst2's beginning to 0
end repeat
set-- differenceLengthIs tolst2's (countnumeric difference)value greater than lst1's?
repeatset withpaddedLength ito from 1 to(count differenceLengthlst1)
repeat with i from set aDigit1 to difference's item ipaddedLength
set bDigitlst1Digit to blst1's item i
set |b > a|lst2Digit to (bDigitlst2's >item aDigit)i
ifset ((|blst2Greater > a|) orto (aDigitlst2Digit > bDigitlst1Digit)) then exit repeat
if ((lst2Greater) or (lst1Digit > lst2Digit)) then exit repeat
end repeat
-- If so, set up to subtract lst1 from lst2 instead. We'll invert the result's sign at the end.
if (|b > a|) then set {b, difference} to {difference, b}
if (lst2Greater) then tell lst2
set lst2 to lst1
set lst1 to it
end tell
set-- carryThe tosubtraction 0at last!
repeatset with i from differenceLengthdifference to 1 by -1{}
set subresultborrow to (difference's item i) - (b's item i) + carry + base0
repeat with i from set difference's item ipaddedLength to (subresult1 modby base)-1
settell carry(lst1's toitem subresulti) div+ base - 1borrow - (lst2's item i)
set difference's beginning to (it mod base)
set borrow to 1 - (it div base)
end tell
end repeat
if (carry > 0lst2Greater) then set invert(difference's beginning to carry)
if (|b > a|) then invert(difference)
return difference
end subtract
on |div|(alst1, blst2) -- List alst1 div list blst2.
return divide(alst1, blst2)'s quotient
end |div|
on |mod|(alst1, blst2) -- List alst1 mod list blst2.
return divide(alst1, blst2)'s remainder
end |mod|
on divide(alst1, blst2) -- Divide list alst1 by list blst2. Return a record containing separate lists for the quotient and remainder.
set dividend to trim(alst1)
set divisor to trim(blst2)
set dividendLength to (count dividend)
set divisorLength to (count divisor)
if (divisorLength > dividendLength) then return {quotient:{0}, remainder:adividend}
-- Note the dividend's and divisor's signs, but use absolute values in the division.
set dividendNegative to (dividend's beginning < 0)
if (dividendNegative) then invert(dividend)
Line 350 ⟶ 356:
if (divisorNegative) then invert(divisor)
-- Long-division algorithm, but quotient digits are subtraction counts.
set quotient to {}
if (divisorLength is> 1) then
set segmentremainder to {}dividend's items 1 thru (divisorLength - 1)
else
set segmentremainder to items 1 thru (divisorLength - 1) of dividend{}
end if
repeat with nextSlot from divisorLength to dividendLength
set remainder's end ofto segment todividend's item nextSlot of dividend
setrepeat qwith tosubtractionCount from 0 to base -- Only ever reaches base - 1.
repeat set subtractionResult to trim(subtract(remainder, divisor))
setif newSegment(subtractionResult's tobeginning trim(subtract(segment,< divisor)0) then exit repeat
ifset (newSegment'sremainder beginningto < 0) then exit repeatsubtractionResult
set q to q + 1
set segment to newSegment
end repeat
set end of quotient to qsubtractionCount
end repeat
-- The quotient's negative if the input signs are different. OtherwisePositive positiveotherwise.
if (dividendNegative ≠ divisorNegative) then invert(quotient)
-- The remainder's signhas isthe alwayssame sign thatas ofthe dividend.
if (dividendNegative) then invert(segmentremainder)
return {quotient:quotient, remainder:segmentremainder}
end divide
on lcm(alst1, blst2) -- Lowest common multiple of list alst1 and list blst2.
return multiply(blst2, |div|(alst1, hcf(alst1, blst2)))
end lcm
on hcf(alst1, blst2) -- Highest common factor of list alst1 and list blst2.
set alst1 to trim(alst1)
set blst2 to trim(blst2)
repeat until (blst2 = {0})
set x to alst1
set alst1 to blst2
set blst2 to trim(|mod|(x, blst2))
end repeat
if (alst1's beginning < 0) then invert(alst1)
return alst1
end hcf
Line 398 ⟶ 403:
end invert
on trim(lst) -- Return a copy of the input listlst with no leading zeros..
repeat with i from 1 to (count lst)
if (lst's item i is not 0) then exit repeat
Line 444 ⟶ 449:
set output to {""}
set padding to " = "
set bernoulliNumbers to bernoullis(maxN) -- Get all the results in one sweep.
repeat with n from 0 to maxN
set bernie to bernoulliNumbers's item (n + 1)
Line 458 ⟶ 463:
end task
 
task()</langsyntaxhighlight>
 
{{output}}
<langsyntaxhighlight lang="applescript">"
B(0) = 1 / 1
B(1) = 1 / 2
Line 493 ⟶ 498:
B(56) = -2479392929313226753685415739663229 / 870
B(58) = 84483613348880041862046775994036021 / 354
B(60) = -1215233140483755572040304994079820246041491 / 56786730"</langsyntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat"> ( BernoulliList
= B Bs answer indLn indexLen indexPadding
, n numberPadding p solPos solidusPos sp
Line 555 ⟶ 559:
& str$!answer
)
& BernoulliList$60;</langsyntaxhighlight>
<pre>B(0)= 1/1
B(1)= 1/2
Line 588 ⟶ 592:
B(58)= 84483613348880041862046775994036021/354
B(60)=-1215233140483755572040304994079820246041491/56786730</pre>
 
=={{header|C}}==
{{libheader|GMP}}
<syntaxhighlight lang="c">
<lang C>
#include <stdlib.h>
#include <gmp.h>
Line 643 ⟶ 646:
return 0;
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 679 ⟶ 682:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|C sharp|C#}}==
 
Line 685 ⟶ 687:
{{libheader|Mpir.NET}}
Translation of the C implementation
<langsyntaxhighlight lang="csharp">
using Mpir.NET;
using System;
Line 739 ⟶ 741:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 779 ⟶ 781:
 
{{libheader|MathNet.Numerics}}
<langsyntaxhighlight lang="csharp">
using System;
using System.Console;
Line 831 ⟶ 833:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 871 ⟶ 873:
{{libheader|System.Numerics}}
Algo based on the example provided in the header of this RC page (the one from Wikipedia). <br/> Extra feature - one can override the default of 60 by supplying a suitable number on the command line. The column widths are not hard-coded, but will adapt to the widths of the items listed.
<langsyntaxhighlight lang="csharp">using System;
using System.Numerics;
using System.Collections.Generic;
Line 929 ⟶ 931:
}
}
</syntaxhighlight>
</lang>
{{out}}
Default (nothing entered on command line):
Line 1,041 ⟶ 1,043:
B(126) = 5556330281949274850616324408918951380525567307126747246796782304333594286400508981287241419934529638692081513802696639 / 4357878
</pre>
 
=={{header|C++}}==
{{Works with|C++11}}
{{libheader|boost}}
<langsyntaxhighlight lang="cpp">/**
* Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
* Apple LLVM version 9.1.0 (clang-902.0.39.1)
Line 1,080 ⟶ 1,081:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,116 ⟶ 1,117:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|Clojure}}==
 
<langsyntaxhighlight lang="clojure">
 
ns test-project-intellij.core
Line 1,146:
(println q ":" (format-ans ans)))
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,182:
60 : -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|Common Lisp}}==
An implementation of the simple algorithm.
Line 1,188 ⟶ 1,187:
Be advised that the pseudocode algorithm specifies (j * (a[j-1] - a[j])) in the inner loop; implementing that as-is gives the wrong value (1/2) where n = 1, whereas subtracting a[j]-a[j-1] yields the correct value (B[1]=-1/2). See [http://oeis.org/A027641 the numerator list].
 
<langsyntaxhighlight lang="lisp">(defun bernouilli (n)
(loop with a = (make-array (list (1+ n)))
for m from 0 to n do
Line 1,230 ⟶ 1,229:
n
(numerator r)
(denominator r)))))</langsyntaxhighlight>
 
{{out}}
Line 1,267 ⟶ 1,266:
B(60): -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Crystal}}==
 
{{Trans|Ruby}}
 
<langsyntaxhighlight lang="ruby">require "big"
 
class Bernoulli
Line 1,299 ⟶ 1,297:
puts "B(%2i) = %*i/%i" % [i, max_width, v.numerator, v.denominator]
end
</syntaxhighlight>
</lang>
 
{{Trans|Python}}
Version 1: compute each number separately.
<langsyntaxhighlight lang="ruby">require "big"
 
def bernoulli(n)
Line 1,317 ⟶ 1,315:
width = b_nums.map{ |b| b.numerator.to_s.size }.max
b_nums.each_with_index { |b,i| puts "B(%2i) = %*i/%i" % [i, width, b.numerator, b.denominator] unless b.zero? }
</syntaxhighlight>
</lang>
 
 
{{Trans|Python}}
Version 2: create faster generator to compute array of numbers once.
<langsyntaxhighlight lang="ruby">require "big"
 
def bernoulli2(limit)
Line 1,337 ⟶ 1,335:
width = b_nums.map{ |b| b.numerator.to_s.size }.max
b_nums.each_with_index { |b,i| puts "B(%2i) = %*i/%i" % [i, width, b.numerator, b.denominator] unless b.zero? }
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,373 ⟶ 1,371:
B(60) = -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|D}}==
This uses the D module from the Arithmetic/Rational task.
{{trans|Python}}
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.algorithm, std.conv, arithmetic_rational;
 
auto bernoulli(in uint n) pure nothrow /*@safe*/ {
Line 1,394 ⟶ 1,391:
foreach (immutable b; berns)
writefln("B(%2d) = %*d/%d", b[0], width, b[1].tupleof);
}</langsyntaxhighlight>
The output is exactly the same as the Python entry.
 
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
Line 1,403 ⟶ 1,399:
Thanks Rudy Velthuis for the [https://github.com/rvelthuis/DelphiBigNumbers Velthuis.BigRationals] library.<br>
 
<syntaxhighlight lang="delphi">
<lang Delphi>
program Bernoulli_numbers;
 
Line 1,435 ⟶ 1,431:
end;
readln;
end.</langsyntaxhighlight>
 
=={{header|EchoLisp}}==
 
Line 1,442 ⟶ 1,437:
 
Only 'small' rationals are supported in EchoLisp, i.e numerator and demominator < 2^31. So, we create a class of 'large' rationals, supported by the bigint library, and then apply the magic formula.
<langsyntaxhighlight lang="lisp">
(lib 'bigint) ;; lerge numbers
(lib 'gloops) ;; classes
Line 1,467 ⟶ 1,462:
(define-method div (Rational Rational) (lambda (r q)
(normalize (Rational (* r.a q.b) (* r.b q.a)))))
</syntaxhighlight>
</lang>
{{Output}}
<langsyntaxhighlight lang="lisp">
;; Bernoulli numbers
;; http://rosettacode.org/wiki/Bernoulli_numbers
Line 1,517 ⟶ 1,512:
 
(B 1) → 1 / 2
</syntaxhighlight>
</lang>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule Bernoulli do
defmodule Rational do
import Kernel, except: [div: 2]
Line 1,574 ⟶ 1,568:
end
 
Bernoulli.task</langsyntaxhighlight>
 
{{out}}
Line 1,611 ⟶ 1,605:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|F sharp|F#}}==
{{libheader|MathNet.Numerics.FSharp}}
<langsyntaxhighlight lang="fsharp">
open MathNet.Numerics
open System
Line 1,640 ⟶ 1,633:
printf ""
0
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,676 ⟶ 1,669:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|Factor}}==
One could use the "bernoulli" word from the math.extras vocabulary as follows:
<syntaxhighlight lang="text">IN: scratchpad
[
0 1 1 "%2d : %d / %d\n" printf
Line 1,720 ⟶ 1,712:
58 : 84483613348880041862046775994036021 / 354
60 : -1215233140483755572040304994079820246041491 / 56786730
Running time: 0.00489444 seconds</langsyntaxhighlight>
Alternatively a method described by Brent and Harvey (2011) in "Fast computation of Bernoulli, Tangent and Secant numbers" https://arxiv.org/pdf/1108.0286.pdf is shown.
<syntaxhighlight lang="text">:: bernoulli-numbers ( n -- )
n 1 + 0 <array> :> tab
1 1 tab set-nth
Line 1,756 ⟶ 1,748:
"%2d : %d / %d\n" printf
] each
;</langsyntaxhighlight>
It gives the same result as the native implementation, but is slightly faster.
<syntaxhighlight lang="text">[ 30 bernoulli-numbers ] time
...
Running time: 0.004331652 seconds</langsyntaxhighlight>
 
=={{header|Fermat}}==
<langsyntaxhighlight lang="fermat">Func Bern(m) = Sigma<k=0,m>[Sigma<v=0,k>[(-1)^v*Bin(k,v)*(v+1)^m/(k+1)]].;
for i=0, 60 do b:=Bern(i); if b<>0 then !!(i,b) fi od;</langsyntaxhighlight>
{{out}}<pre>
0 1
Line 1,798 ⟶ 1,789:
58 84483613348880041862046775994036021 / 354
60 -1215233140483755572040304994079820246041491 / 56786730</pre>
 
=={{header|FreeBASIC}}==
{{libheader|GMP}}
<langsyntaxhighlight lang="freebasic">' version 08-10-2016
' compile with: fbc -s console
' uses gmp
Line 1,854 ⟶ 1,844:
Print :Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre>B( 0) = 1/1
Line 1,888 ⟶ 1,878:
B(58) = 84483613348880041862046775994036021/354
B(60) = -1215233140483755572040304994079820246041491/56786730</pre>
 
=={{header|Frink}}==
<langsyntaxhighlight lang="frink">BernoulliNumber[n] :=
{
a = new array
Line 1,914 ⟶ 1,903:
}
 
println[formatTable[result, "right"]]</langsyntaxhighlight>
 
{{out}}
Line 1,951 ⟶ 1,940:
60 -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|FunL}}==
FunL has pre-defined function <code>B</code> in module <code>integers</code>, which is defined as:
<langsyntaxhighlight lang="funl">import integers.choose
 
def B( n ) = sum( 1/(k + 1)*sum((if 2|r then 1 else -1)*choose(k, r)*(r^n) | r <- 0..k) | k <- 0..n )
 
for i <- 0..60 if i == 1 or 2|i
printf( "B(%2d) = %s\n", i, B(i) )</langsyntaxhighlight>
 
{{out}}
Line 1,996 ⟶ 1,984:
B(60) = -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Bernoulli_numbers}}
Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation &mdash;i.e. XML, JSON&mdash; they are intended for storage and transfer purposes more than visualization and edition.
 
'''Solution.''' The following function reduces to the n-th Bernoulli number. It is a replica of the Akiyama–Tanigawa algorithm.
 
[[File:Fōrmulæ - Bernoulli numbers 01.png]]
 
'''Test case.''' Showing the Bernoulli numbers B<sub>0</sub> to B<sub>60</sub>
 
[[File:Fōrmulæ - Bernoulli numbers 02.png]]
Programs in Fōrmulæ are created/edited online in its [https://formulae.org website], However they run on execution servers. By default remote servers are used, but they are limited in memory and processing power, since they are intended for demonstration and casual use. A local server can be downloaded and installed, it has no limitations (it runs in your own computer). Because of that, example programs can be fully visualized and edited, but some of them will not run if they require a moderate or heavy computation/memory resources, and no local server is being used.
 
[[File:Fōrmulæ - Bernoulli numbers 03.png]]
In '''[https://formulae.org/?example=Bernoulli_numbers this]''' page you can see the program(s) related to this task and their results.
 
=={{header|GAP}}==
 
<langsyntaxhighlight lang="gap">for a in Filtered(List([0 .. 60], n -> [n, Bernoulli(n)]), x -> x[2] <> 0) do
Print(a, "\n");
od;
Line 2,042 ⟶ 2,035:
[ 56, -2479392929313226753685415739663229/870 ]
[ 58, 84483613348880041862046775994036021/354 ]
[ 60, -1215233140483755572040304994079820246041491/56786730 ]</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,071 ⟶ 2,063:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,107 ⟶ 2,099:
B(60) = -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Haskell}}==
====Task algorithm====
Line 2,113 ⟶ 2,104:
The implementation of the algorithm is in the function bernoullis. The rest is for printing the results.
 
<langsyntaxhighlight Haskelllang="haskell">import Data.Ratio
import System.Environment
 
Line 2,135 ⟶ 2,126:
berno i = 1 % (i + 1)
ulli _ [_] = []
ulli i (x:y:xs) = (i % 1) * (x - y) : ulli (i + 1) (y : xs)</langsyntaxhighlight>
{{Out}}
<pre>B(0) = 1/1
Line 2,171 ⟶ 2,162:
 
====Derivation from Faulhaber's triangle====
<langsyntaxhighlight lang="haskell">import Data.Bool (bool)
import Data.Ratio (Ratio, denominator, numerator, (%))
 
Line 2,226 ⟶ 2,217:
 
rjust :: Int -> a -> [a] -> [a]
rjust n c = drop . length <*> (replicate n c <>)</langsyntaxhighlight>
{{Out}}
<pre>Bernouillis from Faulhaber triangle:
Line 2,262 ⟶ 2,253:
58 -> 84483613348880041862046775994036021 / 354
60 -> -1215233140483755572040304994079820246041491 / 56786730</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
 
The following works in both languages:
<langsyntaxhighlight lang="unicon">link "rational"
 
procedure main(args)
Line 2,285 ⟶ 2,275:
procedure align(r,n)
return repl(" ",n-find("/",r))||r
end</langsyntaxhighlight>
 
Sample run:
Line 2,324 ⟶ 2,314:
->
</pre>
 
=={{header|J}}==
 
Line 2,330 ⟶ 2,319:
 
See [[j:Essays/Bernoulli_Numbers|Bernoulli Numbers Essay]] on the J wiki.
<langsyntaxhighlight lang="j">B=: {.&1 %. (i. ! ])@>:@i.@x:</langsyntaxhighlight>
 
'''Task:'''
 
<langsyntaxhighlight lang="j"> 'B' ,. rplc&'r/_-'"1": (#~ 0 ~: {:"1)(i. ,. B) 61
B 0 1
B 1 -1/2
Line 2,366 ⟶ 2,355:
B56 -2479392929313226753685415739663229/870
B58 84483613348880041862046775994036021/354
B60 -1215233140483755572040304994079820246041491/56786730</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import org.apache.commons.math3.fraction.BigFraction;
 
public class BernoulliNumbers {
Line 2,390 ⟶ 2,378:
return A[0];
}
}</langsyntaxhighlight>
<pre>B(0 ) = 1
B(1 ) = 1 / 2
Line 2,423 ⟶ 2,411:
B(58) = 84483613348880041862046775994036021 / 354
B(60) = -1215233140483755572040304994079820246041491 / 56786730</pre>
 
=={{header|jq}}==
{{works with|jq|1.4}}
Line 2,433 ⟶ 2,420:
 
'''BigInt Stubs''':
<langsyntaxhighlight lang="jq"># def negate:
# def lessOrEqual(x; y): # x <= y
# def long_add(x;y): # x+y
Line 2,471 ⟶ 2,458:
 
def long_mod(x;y):
((x|tonumber) % (y|tonumber)) | tostring;</langsyntaxhighlight>
 
'''Fractions''':<langsyntaxhighlight lang="jq">
# A fraction is represented by [numerator, denominator] in reduced form, with the sign on top
 
Line 2,527 ⟶ 2,514:
| if $a == $b then ["0", "1"]
else add($a; [ ($b[0]|negate), $b[1] ] )
end ; </langsyntaxhighlight>
 
'''Bernoulli Numbers''':
<langsyntaxhighlight lang="jq"># Using the algorithm in the task description:
def bernoulli(n):
reduce range(0; n+1) as $m
Line 2,539 ⟶ 2,526:
.[$j-1] = multiply( [($j|tostring), "1"]; minus( .[$j-1] ; .[$j]) ) ))
| .[0] # (which is Bn)
;</langsyntaxhighlight>
 
'''The task''':
<langsyntaxhighlight lang="jq">range(0;61)
| if . % 2 == 0 or . == 1 then "\(.): \(bernoulli(.) )" else empty end</langsyntaxhighlight>
{{out}}
The following output was obtained using the previously mentioned BigInt library.
<langsyntaxhighlight lang="sh">$ jq -n -r -f Bernoulli.jq
0: ["1","1"]
1: ["1","2"]
Line 2,578 ⟶ 2,565:
56: ["-2479392929313226753685415739663229","870"]
58: ["84483613348880041862046775994036021","354"]
60: ["-1215233140483755572040304994079820246041491","56786730"]</langsyntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight Julialang="julia">function bernoulli(n)
A = Vector{Rational{BigInt}}(undef, n + 1)
for m = 0 : n
Line 2,626 ⟶ 2,612:
for (n, b) in enumerate(BernoulliList(60))
isodd(numerator(b)) && println("B($(n-1)) = $b")
end </langsyntaxhighlight>
 
Produces virtually the same output as the Python version.
 
=={{header|Kotlin}}==
{{trans|Java}}
{{works with|Commons Math|3.3.5}}
 
<langsyntaxhighlight lang="scala">import org.apache.commons.math3.fraction.BigFraction
 
object Bernoulli {
Line 2,655 ⟶ 2,640:
if (n % 2 == 0 || n == 1)
System.out.printf("B(%-2d) = %-1s%n", n, Bernoulli(n))
}</langsyntaxhighlight>
{{out}}
Produces virtually the same output as the Java version.
 
=={{header|Lua}}==
LuaJIT version with FFI and GMP library
Line 2,664 ⟶ 2,648:
{{libheader|luagmp}}
{{works with|LuaJIT|2.0-2.1}}
<langsyntaxhighlight lang="lua">#!/usr/bin/env luajit
local gmp = require 'gmp' ('libgmp')
local ffi = require'ffi'
Line 2,708 ⟶ 2,692:
gmp.z_clears(n,d)
gmp.q_clear(rop)
end</langsyntaxhighlight>
{{out}}
<pre>> time ./bernoulli_gmp.lua
Line 2,745 ⟶ 2,729:
./bernoulli_gmp.lua 0,02s user 0,00s system 97% cpu 0,022 total</pre>
Time compare: Python 0.591 sec, C 0.023 sec, Lua 0.022-0.025
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">print(select(n->n[2]<>0,[seq([n,bernoulli(n,1)],n=0..60)]));</langsyntaxhighlight>
{{out}}
<pre>[[0, 1], [1, 1/2], [2, 1/6], [4, -1/30], [6, 1/42], [8, -1/30], [10, 5/66], [12, -691/2730], [14, 7/6], [16, -3617/510], [18, 43867/798], [20, -174611/330], [22, 854513/138], [24, -236364091/2730], [26, 8553103/6], [28, -23749461029/870], [30, 8615841276005/14322], [32, -7709321041217/510], [34, 2577687858367/6], [36, -26315271553053477373/1919190], [38, 2929993913841559/6], [40, -261082718496449122051/13530], [42, 1520097643918070802691/1806], [44, -27833269579301024235023/690], [46, 596451111593912163277961/282], [48, -5609403368997817686249127547/46410], [50, 495057205241079648212477525/66], [52, -801165718135489957347924991853/1590], [54, 29149963634884862421418123812691/798], [56, -2479392929313226753685415739663229/870], [58, 84483613348880041862046775994036021/354], [60, -1215233140483755572040304994079820246041491/56786730]]</pre>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Mathematica has no native way for starting an array at index 0. I therefore had to build the array from 1 to n+1 instead of from 0 to n, adjusting the formula accordingly.
<langsyntaxhighlight Mathematicalang="mathematica">bernoulli[n_] := Module[{a = ConstantArray[0, n + 2]},
Do[
a[[m]] = 1/m;
Line 2,763 ⟶ 2,745:
, {m, 1, n + 1}];
]
bernoulli[60]</langsyntaxhighlight>
{{out}}
<pre>{0,1}
Line 2,801 ⟶ 2,783:
(Note from task's author: nobody is forced to use any specific algorithm, the one shown is just a suggestion.)
 
<langsyntaxhighlight Mathematicalang="mathematica">Table[{i, BernoulliB[i]}, {i, 0, 60}];
Select[%, #[[2]] != 0 &] // TableForm</langsyntaxhighlight>
{{out}}
<pre>0 1
Line 2,836 ⟶ 2,818:
58 84483613348880041862046775994036021/354
60 -(1215233140483755572040304994079820246041491/56786730)</pre>
 
=={{header|Maxima}}==
Using built-in function bern
<syntaxhighlight lang="maxima">
block(makelist([sconcat("B","(",i,")","="),bern(i)],i,0,60),
sublist(%%,lambda([x],x[2]#0)),
table_form(%%))
</syntaxhighlight>
{{out}}
<pre>
matrix(
["B(0)=", 1],
["B(1)=", -1/2],
["B(2)=", 1/6],
["B(4)=", -1/30],
["B(6)=", 1/42],
["B(8)=", -1/30],
["B(10)=", 5/66],
["B(12)=", -691/2730],
["B(14)=", 7/6],
["B(16)=", -3617/510],
["B(18)=", 43867/798],
["B(20)=", -174611/330],
["B(22)=", 854513/138],
["B(24)=", -236364091/2730],
["B(26)=", 8553103/6],
["B(28)=", -23749461029/870],
["B(30)=", 8615841276005/14322],
["B(32)=", -7709321041217/510],
["B(34)=", 2577687858367/6],
["B(36)=", -26315271553053477373/1919190],
["B(38)=", 2929993913841559/6],
["B(40)=", -261082718496449122051/13530],
["B(42)=", 1520097643918070802691/1806],
["B(44)=", -27833269579301024235023/690],
["B(46)=", 596451111593912163277961/282],
["B(48)=", -5609403368997817686249127547/46410],
["B(50)=", 495057205241079648212477525/66],
["B(52)=", -801165718135489957347924991853/1590],
["B(54)=", 29149963634884862421418123812691/798],
["B(56)=", -2479392929313226753685415739663229/870],
["B(58)=", 84483613348880041862046775994036021/354],
["B(60)=", -1215233140483755572040304994079820246041491/56786730]
)
</pre>
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import bignum
import strformat
 
Line 2,879 ⟶ 2,906:
for (n, b) in values:
let s = fmt"{($b.num).alignString(maxLen, '>')} / {b.denom}"
echo fmt"{n:2}: {s}"</langsyntaxhighlight>
 
{{out}}
Line 2,914 ⟶ 2,941:
58: 84483613348880041862046775994036021 / 354
60: -1215233140483755572040304994079820246041491 / 56786730</pre>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">for(n=0,60,t=bernfrac(n);if(t,print(n" "t)))</langsyntaxhighlight>
{{out}}
<pre>0 1
Line 2,950 ⟶ 2,976:
58 84483613348880041862046775994036021/354
60 -1215233140483755572040304994079820246041491/56786730</pre>
 
=={{header|Pascal|FreePascal}}==
{{libheader|BigDecimalMath}}
Tested with fpc 3.0.4
<syntaxhighlight lang="pascal">
<lang Pascal>
(* Taken from the 'Ada 99' project, https://marquisdegeek.com/code_ada99 *)
Line 3,077 ⟶ 3,102:
end;
end.
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,115 ⟶ 3,140:
B(60) : -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|Perl}}==
The only thing in the suggested algorithm which depends on N is the number of times through the inner block. This means that all but the last iteration through the loop produce the exact same values of A.
Line 3,121 ⟶ 3,145:
Instead of doing the same calculations over and over again, I retain the A array until the final Bernoulli number is produced.
 
<langsyntaxhighlight lang="perl">#!perl
use strict;
use warnings;
Line 3,145 ⟶ 3,169:
 
bernoulli_print();
</syntaxhighlight>
</lang>
The output is exactly the same as the Python entry.
 
We can also use modules for faster results. E.g.
{{libheader|ntheory}}
<langsyntaxhighlight lang="perl">use ntheory qw/bernfrac/;
 
for my $n (0 .. 60) {
my($num,$den) = bernfrac($n);
printf "B(%2d) = %44s/%s\n", $n, $num, $den if $num != 0;
}</langsyntaxhighlight>
with identical output. Or:
<langsyntaxhighlight lang="perl">use Math::Pari qw/bernfrac/;
 
for my $n (0 .. 60) {
my($num,$den) = split "/", bernfrac($n);
printf("B(%2d) = %44s/%s\n", $n, $num, $den||1) if $num != 0;
}</langsyntaxhighlight>
with the difference being that Pari chooses <math>B_1</math> = -&frac12;.
 
=={{header|Phix}}==
{{libheader|Phix/mpfr}}
{{trans|C}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">/</span><span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 3,200 ⟶ 3,223:
<span style="color: #0000FF;">{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_free</span><span style="color: #0000FF;">({</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">d</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">rop</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpq_free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rop</span><span style="color: #0000FF;">)</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,236 ⟶ 3,259:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|PicoLisp}}==
Brute force and method by Srinivasa Ramanujan.
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/frac.l")
 
(de fact (N)
Line 3,312 ⟶ 3,334:
(test (berno N) (berno-brute N)) )
 
(bye)</langsyntaxhighlight>
 
=={{header|PL/I}}==
<langsyntaxhighlight PLlang="pl/Ii">Bern: procedure options (main); /* 4 July 2014 */
declare i fixed binary;
declare B complex fixed (31);
Line 3,347 ⟶ 3,368:
(3 A, column(10), F(32), 2 A);
end;
end Bern;</langsyntaxhighlight>
The above uses GCD (see Rosetta Code) extended for 31-digit working.
 
Line 3,373 ⟶ 3,394:
B(36)= -26315271553053477373/1919190
</pre>
 
=={{header|Python}}==
===Python: Using task algorithm===
<langsyntaxhighlight lang="python">from fractions import Fraction as Fr
 
def bernoulli(n):
Line 3,390 ⟶ 3,410:
width = max(len(str(b.numerator)) for i,b in bn)
for i,b in bn:
print('B(%2i) = %*i/%i' % (i, width, b.numerator, b.denominator))</langsyntaxhighlight>
 
{{out}}
Line 3,428 ⟶ 3,448:
===Python: Optimised task algorithm===
Using the optimization mentioned in the Perl entry to reduce intermediate calculations we create and use the generator bernoulli2():
<langsyntaxhighlight lang="python">def bernoulli2():
A, m = [], 0
while True:
Line 3,441 ⟶ 3,461:
width = max(len(str(b.numerator)) for i,b in bn2)
for i,b in bn2:
print('B(%2i) = %*i/%i' % (i, width, b.numerator, b.denominator))</langsyntaxhighlight>
 
Output is exactly the same as before.
 
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> $ "bigrat.qky" loadfile
[ 1+
Line 3,471 ⟶ 3,490:
char / over find
44 swap - times sp
echo$ cr ] ]</langsyntaxhighlight>
 
{{out}}
Line 3,508 ⟶ 3,527:
60 -1215233140483755572040304994079820246041491/56786730
</pre>
 
 
=={{header|R}}==
{{incorrect|rsplus|This example is incorrect: It is not executable and if made executable (with 'library(gmp)') it returns completely different and wrong results -- not the ones shown here. The R code needs complete rewrite and the 'pracma' library will not be of any help.}}
 
<langsyntaxhighlight lang="rsplus">
 
library(pracma)
Line 3,523 ⟶ 3,540:
cat("B(",idx,") = ",n,"/",d,"\n", sep = "")
}
</langsyntaxhighlight>
{{out}}
<pre>
Line 3,559 ⟶ 3,576:
B(60) = -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Racket}}==
 
Line 3,566 ⟶ 3,582:
use the same emmitter... it's just a matter of how long to wait for the emission.
 
<syntaxhighlight lang="text">#lang racket
;; For: http://rosettacode.org/wiki/Bernoulli_numbers
 
Line 3,649 ⟶ 3,665:
(list 1/1 (app abs 1/2) 1/6 -1/30 1/42 -1/30 _ ...))
; timing only ...
(void (time (bernoulli_0..n bernoulli.3 100))))</langsyntaxhighlight>
 
{{out}}
Line 3,684 ⟶ 3,700:
B(58) = 84483613348880041862046775994036021/354
B(60) = -1215233140483755572040304994079820246041491/56786730</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
Line 3,692 ⟶ 3,707:
First, a straighforward implementation of the naïve algorithm in the task description.
{{works with|Rakudo|2015.12}}
<syntaxhighlight lang="raku" perl6line>sub bernoulli($n) {
my @a;
for 0..$n -> $m {
Line 3,708 ⟶ 3,723:
my $form = "B(%2d) = \%{$width}d/%d\n";
 
printf $form, .key, .value.nude for @bpairs;</langsyntaxhighlight>
{{out}}
<pre>B( 0) = 1/1
Line 3,748 ⟶ 3,763:
 
{{works with|Rakudo|2015.12}}
<syntaxhighlight lang="raku" perl6line>constant bernoulli = gather {
my @a;
for 0..* -> $m {
Line 3,765 ⟶ 3,780:
my $form = "B(%d)\t= \%{$width}d/%d\n";
 
printf $form, .key, .value.nude for @bpairs;</langsyntaxhighlight>
{{out}}
<pre>B(0) = 1/1
Line 3,825 ⟶ 3,840:
{{works with|Rakudo|2016.12}}
 
<syntaxhighlight lang="raku" perl6line>sub infix:<bop>(\prev, \this) {
this.key => this.key * (this.value - prev.value)
}
Line 3,847 ⟶ 3,862:
my $form = "B(%d)\t= \%{$width}d/%d\n";
printf $form, .key, .value.nude for @bpairs;</langsyntaxhighlight>
 
Same output as memoization example
Line 3,857 ⟶ 3,872:
<br>
:::::::::::: where &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <big><big> <math> \binom kr</math> </big></big> &nbsp; &nbsp; &nbsp; is a binomial coefficient. <br>
<langsyntaxhighlight lang="rexx">/*REXX program calculates N number of Bernoulli numbers expressed as vulgar fractions.*/
parse arg N .; if N=='' | N=="," then N= 60 /*Not specified? Then use the default.*/
numeric digits max(9, n*2) /*increase the decimal digits if needed*/
Line 3,911 ⟶ 3,926:
/*──────────────────────────────────────────────────────────────────────────────────────*/
perm: procedure expose !.; parse arg x,y; if !.P.x.y\==. then return !.P.x.y
z= 1; do j=x-y+1 to x; z= z*j; end; !.P.x.y= z; return z</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 3,952 ⟶ 3,967:
Output notes: &nbsp; This version of REXX can compute and display all values up to &nbsp; '''B<sub>110</sub>''' &nbsp; in sub─second.
<br><br>
=={{header|RPL}}==
Fractions such as a/b are here handled through the complex number data structure <code>(a,b)</code>.
2 local words support the algorithm suggested by the task: <code>FracSub</code> substracts 2 fractions and <code>FracSimp</code> make a fraction irreducible
Unfortunately, floating-point precision prevents from going beyond B22.
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! RPL code
! Comment
|-
|
≪ DUP2 IM * ROT IM ROT RE * -
≫ '<span style="color:blue">FracSub</span>' STO
≪ DUP C→R ABS SWAP ABS DUP2 < ≪ SWAP ≫ IFT
'''WHILE''' DUP '''REPEAT''' SWAP OVER MOD '''END'''
DROP /
≫ '<span style="color:blue">FracSimp</span>' STO
{ } 1 ROT 1 + '''FOR''' m
1 m R→C +
'''IF''' m 2 ≥ '''THEN''' m 2 '''FOR''' j
DUP j 1 - GET OVER j GET <span style="color:blue">FracSub</span>
C→R SWAP j 1 - * SWAP R→C
<span style="color:blue">FracSimp</span> j 1 - SWAP PUT
-1 '''STEP END'''
'''NEXT''' 1 GET DUP RE SWAP 0 '''IFTE'''
≫ '<span style="color:blue">BRNOU</span>' STO
|
''( (a,b) (c,d) -- (e,f) )'' with e/f = a/b - c/d
''( (a,b) -- (c,d) )'' with c/d simplified fraction of a/b
get GCD of a and b
divide (a,b) by GCD
''( n -- (a,b) )'' with a/b = B(n)
For m from 1 to n+1 do
A[m] ← 1/m
for j from m to 2 do
(A[j-1] - A[j])
. * (j-1)
A[j-1] ←
return A[1] as a fraction or zero
|}
5 <span style="color:blue">BRNOU</span>
22 <span style="color:blue">BRNOU</span>
{{out}}
<pre>
2: 0
1: (854513,138)
</pre>
 
===HP-49+ version===
Latest RPL implementations can natively handle long fractions and generate Bernoulli numbers.
{{works with|HP|49}}
≪ { }
0 ROT '''FOR''' n
'''IF''' n 2 > LASTARG MOD AND NOT '''THEN''' n IBERNOULLI + '''END'''
'''NEXT'''
≫ '<span style="color:blue">TASK</span>' STO
 
60 <span style="color:blue">TASK</span>
{{out}}
<pre>
1: {1 -1/2 1/6 -1/30 1/42 -1/30 5/66 -691/2730 7/6 -3617/510 43867/798 -174611/330 854513/138 -236364091/2730 8553103/6 -23749461029/870 8615841276005/14322 -7709321041217/510 2577687858367/6 -26315271553053477373/1919190 2929993913841559/6 -261082718496449122051/13530 1520097643918070802691/1806 -27833269579301024235023/690 596451111593912163277961/282 -5609403368997817686249127547/46410 495057205241079648212477525/66 -801165718135489957347924991853/1590 9149963634884862421418123812691/798 -2479392929313226753685415739663229/870 84483613348880041862046775994036021/354 -1215233140483755572040304994079820246041491/56786730}
</pre>
Runs in 3 minutes 40 on a HP-50g, against 1 hour and 30 minutes if calculating Bernoulli numbers with the above function.
 
=={{header|Ruby}}==
{{trans|Python}}
<langsyntaxhighlight lang="ruby">bernoulli = Enumerator.new do |y|
ar = []
0.step do |m|
Line 3,968 ⟶ 4,054:
b_nums.each_with_index {|b,i| puts "B(%2i) = %*i/%i" % [i, width, b.numerator, b.denominator] unless b.zero? }
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,007 ⟶ 4,093:
=={{header|Rust}}==
 
<langsyntaxhighlight lang="rust">// 2.5 implementations presented here: naive, optimized, and an iterator using
// the optimized function. The speeds vary significantly: relative
// speeds of optimized:iterator:naive implementations is 625:25:1.
Line 4,156 ⟶ 4,242:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,192 ⟶ 4,278:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|Scala}}==
'''With Custom Rational Number Class'''<br/>
(code will run in Scala REPL with a cut-and-paste without need for a third-party library)
<langsyntaxhighlight lang="scala">/** Roll our own pared-down BigFraction class just for these Bernoulli Numbers */
case class BFraction( numerator:BigInt, denominator:BigInt ) {
require( denominator != BigInt(0), "Denominator cannot be zero" )
Line 4,245 ⟶ 4,330:
println( f"$label%-6s $num / ${b.den}" )
}}
</syntaxhighlight>
</lang>
{{out}}
<pre>b(0) 1 / 1
Line 4,282 ⟶ 4,367:
=={{header|Scheme}}==
{{works with|Chez Scheme}}
<langsyntaxhighlight lang="scheme">; Return the n'th Bernoulli number.
 
(define bernoulli
Line 4,335 ⟶ 4,420:
(else
(printf "B(~2@a) = ~a~%" index (rational-padded (car numbers) max-numerator-length))
(print-bernoulli (1+ index) (cdr numbers))))))</langsyntaxhighlight>
{{out}}
<pre>$ scheme --script bernoulli.scm
Line 4,370 ⟶ 4,455:
B(58) = 84483613348880041862046775994036021/354
B(60) = -1215233140483755572040304994079820246041491/56786730</pre>
 
=={{header|Seed7}}==
The program below uses [http://seed7.sourceforge.net/manual/types.htm#bigRational bigRational]
Line 4,378 ⟶ 4,462:
function automatically writes repeating decimals in parentheses, when necessary.
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "bigrat.s7i";
 
Line 4,411 ⟶ 4,495:
end if;
end for;
end func;</langsyntaxhighlight>
 
{{out}}
Line 4,448 ⟶ 4,532:
B(60) = -1215233140483755572040304994079820246041491 / 56786730 -21399949257225333665810744765191097.3(926741511617238745742183076926598872659158222352299560126106)
</pre>
 
=={{header|Sidef}}==
Built-in:
<langsyntaxhighlight lang="ruby">say bernoulli(42).as_frac #=> 1520097643918070802691/1806</langsyntaxhighlight>
 
Recursive solution (with auto-memoization):
<langsyntaxhighlight lang="ruby">func bernoulli_number(n) is cached {
 
n.is_one && return 1/2
Line 4,467 ⟶ 4,550:
var Bn = bernoulli_number(n) || next
printf("B(%2d) = %44s / %s\n", n, Bn.nude)
}</langsyntaxhighlight>
 
Using Ramanujan's congruences (pretty fast):
<langsyntaxhighlight lang="ruby">func ramanujan_bernoulli_number(n) is cached {
 
return 1/2 if n.is_one
Line 4,478 ⟶ 4,561:
binomial(n+3, n - 6*k) * __FUNC__(n - 6*k)
})) / binomial(n+3, n)
}</langsyntaxhighlight>
 
Using Euler's product formula for the Riemann zeta function and the Von Staudt–Clausen theorem (very fast):
<langsyntaxhighlight lang="ruby">func bernoulli_number_from_zeta(n) {
 
n.is_zero && return 1
Line 4,495 ⟶ 4,578:
 
(-1)**(n/2 + 1) * int(ceil(d*K / z)) / d
}</langsyntaxhighlight>
 
The Akiyama–Tanigawa algorithm:
<langsyntaxhighlight lang="ruby">func bernoulli_print {
var a = []
for m in (0..60) {
Line 4,510 ⟶ 4,593:
}
 
bernoulli_print()</langsyntaxhighlight>
 
{{out}}
Line 4,547 ⟶ 4,630:
B(60) = -1215233140483755572040304994079820246041491 / 56786730
</pre>
 
=={{header|SPAD}}==
{{works with|FriCAS, OpenAxiom, Axiom}}
<syntaxhighlight lang="spad">
<lang SPAD>
for n in 0..60 | (b:=bernoulli(n)$INTHEORY; b~=0) repeat print [n,b]
</syntaxhighlight>
</lang>
Package:[http://fricas.github.io/api/IntegerNumberTheoryFunctions.html?highlight=bernoulli IntegerNumberTheoryFunctions]
 
Line 4,656 ⟶ 4,738:
Type: Void
</pre>
 
=={{header|Swift}}==
 
Line 4,663 ⟶ 4,744:
Uses the Frac type defined in the [http://rosettacode.org/wiki/Arithmetic/Rational#Swift Rational] task.
 
<langsyntaxhighlight Swiftlang="swift">import BigInt
 
public func bernoulli<T: BinaryInteger & SignedNumeric>(n: Int) -> Frac<T> {
Line 4,691 ⟶ 4,772:
 
print("B(\(n)) = \(b)")
}</langsyntaxhighlight>
 
{{out}}
Line 4,727 ⟶ 4,808:
B(58) = Frac(84483613348880041862046775994036021 / 354)
B(60) = Frac(-1215233140483755572040304994079820246041491 / 56786730)</pre>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc bernoulli {n} {
for {set m 0} {$m <= $n} {incr m} {
lappend A [list 1 [expr {$m + 1}]]
Line 4,754 ⟶ 4,834:
foreach {n num denom} $result {
puts [format {B_%-2d = %*lld/%lld} $n $len $num $denom]
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,790 ⟶ 4,870:
B_60 = -1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Visual Basic .NET}}==
{{works with|Visual Basic .NET|2013}}
{{libheader|System.Numerics}}
<langsyntaxhighlight lang="vbnet">' Bernoulli numbers - vb.net - 06/03/2017
Imports System.Numerics 'BigInteger
 
Line 4,843 ⟶ 4,922:
End Sub 'bernoulli_BigInt
End Module 'Bernoulli_numbers</langsyntaxhighlight>
{{out}}
<pre>
Line 4,879 ⟶ 4,958:
B(60)=-1215233140483755572040304994079820246041491/56786730
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
{{libheader|Wren-big}}
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
import "./big" for BigRat
 
var bernoulli = Fn.new { |n|
Line 4,903 ⟶ 4,981:
var b = bernoulli.call(n)
if (b != BigRat.zero) Fmt.print("B($2d) = $44i / $i", n, b.num, b.den)
}</langsyntaxhighlight>
 
{{out}}
Line 4,944 ⟶ 5,022:
{{trans|EchoLisp}}
Uses lib GMP (GNU MP Bignum Library).
<langsyntaxhighlight lang="zkl">class Rational{ // Weenie Rational class, can handle BigInts
fcn init(_a,_b){ var a=_a, b=_b; normalize(); }
fcn toString{ "%50d / %d".fmt(a,b) }
Line 4,963 ⟶ 5,041:
}
fcn __opDiv(n){ self(a*n.b,b*n.a) } // Rat / Rat
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">var [const] BN=Import.lib("zklBigNum"); // libGMP (GNU MP Bignum Library)
fcn B(N){ // calculate Bernoulli(n)
var A=List.createLong(100,0); // aka static aka not thread safe
Line 4,972 ⟶ 5,050:
}
A[0]
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">foreach b in ([0..1].chain([2..60,2])){ println("B(%2d)%s".fmt(b,B(b))) }</langsyntaxhighlight>
{{out}}
<pre>
2,120

edits