15 lines
476 B
Text
15 lines
476 B
Text
func bernoulli_number_from_zeta(n) {
|
|
|
|
n.is_zero && return 1
|
|
n.is_one && return 1/2
|
|
n.is_odd && return 0
|
|
|
|
var log2B = (log(4*Num.tau*n)/2 + n*log(n) - n*log(Num.tau) - n)/log(2)
|
|
local Num!PREC = *(int(n + log2B) + (n <= 90 ? 18 : 0))
|
|
|
|
var K = 2*(n! / Num.tau**n)
|
|
var d = n.divisors.grep {|k| is_prime(k+1) }.prod {|k| k+1 }
|
|
var z = ceil((K*d).root(n-1)).primes.prod {|p| 1 - p.float**(-n) }
|
|
|
|
(-1)**(n/2 + 1) * int(ceil(d*K / z)) / d
|
|
}
|