Your example code crashes because of the uninitialized seq at he beginning of bernoulli, so this cannot have been the version that gave you an overflow error. Anyways, after fixing that and replacing rationals with bignum it seems to work:
import strformat, bignum
const upper = 61
var bn: array[upper, Rat]
proc bernoulli(n: int): Rat =
var A: seq[Rat] = @[]
for i in 0 .. n:
A.add(newRat())
for i in 0 .. A.high:
discard A[i].set(1, i+1)
for j in countDown(i, 1):
A[j-1] = j*(A[j-1] - A[j])
return A[0] # (which is Bn)
for i in 0 .. bn.high:
bn[i] = bernoulli(i)
if bn[i].toFloat != 0.0:
echo fmt"B({i:2}) = {bn[i]:>50}"
Update
Thanks again. I confirmed again that I did not need the = @[] part in the seq declaration.
Here is the code that worked for me:
# Need to first do "nimble install bignum"
import strformat, bignum
const upper = 61
var bn: array[upper, Rat]
proc bernoulli(n: int): Rat =
var A: seq[Rat]
for i in 0 .. n:
A.add(newRat())
for i in 0 .. A.high:
discard A[i].set(1, i+1)
for j in countDown(i, 1):
A[j-1] = j*(A[j-1] - A[j])
return A[0] # (which is Bn)
for i in 0 .. bn.high:
bn[i] = bernoulli(i)
if bn[i].toFloat != 0.0:
echo fmt"B({i:2}) = {bn[i]:>55}"
Output:
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
No, it most certainly is that exact code :) I am using Nim devel branch tip; not sure if that has some fixes that makes that code work.
It has. Didn't expect that, sry.