Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,120 @@
|
|||
'**********************************************
|
||||
'Subject: Comparing five methods for
|
||||
' computing Euler's constant 0.5772...
|
||||
'tested : FreeBasic 1.08.1
|
||||
'----------------------------------------------
|
||||
const eps = 1e-6
|
||||
dim as double a, b, h, n2, r, u, v
|
||||
dim as integer k, k2, m, n
|
||||
|
||||
? "From the definition, err. 3e-10"
|
||||
|
||||
n = 400
|
||||
|
||||
h = 1
|
||||
for k = 2 to n
|
||||
h += 1 / k
|
||||
next k
|
||||
'faster convergence: Negoi, 1997
|
||||
a = log(n +.5 + 1 / (24*n))
|
||||
|
||||
? "Hn "; h
|
||||
? "gamma"; h - a; !"\nk ="; n
|
||||
?
|
||||
|
||||
|
||||
? "Sweeney, 1963, err. idem"
|
||||
|
||||
n = 21
|
||||
|
||||
dim as double s(1) = {0, n}
|
||||
r = n
|
||||
k = 1
|
||||
do
|
||||
k += 1
|
||||
r *= n / k
|
||||
s(k and 1) += r / k
|
||||
loop until r < eps
|
||||
|
||||
? "gamma"; s(1) - s(0) - log(n); !"\nk ="; k
|
||||
?
|
||||
|
||||
|
||||
? "Bailey, 1988"
|
||||
|
||||
n = 5
|
||||
|
||||
a = 1
|
||||
h = 1
|
||||
n2 = 2^n
|
||||
r = 1
|
||||
k = 1
|
||||
do
|
||||
k += 1
|
||||
r *= n2 / k
|
||||
h += 1 / k
|
||||
b = a: a += r * h
|
||||
loop until abs(b - a) < eps
|
||||
a *= n2 / exp(n2)
|
||||
|
||||
? "gamma"; a - n * log(2); !"\nk ="; k
|
||||
?
|
||||
|
||||
|
||||
? "Brent-McMillan, 1980"
|
||||
|
||||
n = 13
|
||||
|
||||
a = -log(n)
|
||||
b = 1
|
||||
u = a
|
||||
v = b
|
||||
n2 = n * n
|
||||
k2 = 0
|
||||
k = 0
|
||||
do
|
||||
k2 += 2*k + 1
|
||||
k += 1
|
||||
a *= n2 / k
|
||||
b *= n2 / k2
|
||||
a = (a + b) / k
|
||||
u += a
|
||||
v += b
|
||||
loop until abs(a) < eps
|
||||
|
||||
? "gamma"; u / v; !"\nk ="; k
|
||||
?
|
||||
|
||||
|
||||
? "How Euler did it in 1735"
|
||||
'Bernoulli numbers with even indices
|
||||
dim as double B2(9) = {1,1/6,-1/30,1/42,_
|
||||
-1/30,5/66,-691/2730,7/6,-3617/510,43867/798}
|
||||
m = 7
|
||||
if m > 9 then end
|
||||
|
||||
n = 10
|
||||
|
||||
'n-th harmonic number
|
||||
h = 1
|
||||
for k = 2 to n
|
||||
h += 1 / k
|
||||
next k
|
||||
? "Hn "; h
|
||||
|
||||
h -= log(n)
|
||||
? " -ln"; h
|
||||
|
||||
'expansion C = -digamma(1)
|
||||
a = -1 / (2*n)
|
||||
n2 = n * n
|
||||
r = 1
|
||||
for k = 1 to m
|
||||
r *= n2
|
||||
a += B2(k) / (2*k * r)
|
||||
next k
|
||||
|
||||
? "err "; a; !"\ngamma"; h + a; !"\nk ="; n + m
|
||||
?
|
||||
? "C = 0.57721566490153286..."
|
||||
end
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
'***************************************************
|
||||
'Subject: Computation of Euler's constant 0.5772...
|
||||
' with the Brent-McMillan algorithm B1,
|
||||
' Math. Comp. 34 (1980), 305-312
|
||||
'tested : FreeBasic 1.08.1 with gmp 6.2.0
|
||||
'---------------------------------------------------
|
||||
#include "gmp.bi"
|
||||
|
||||
'multi-precision float pointers
|
||||
Dim as mpf_ptr a, b
|
||||
Dim shared as mpf_ptr k2, u, v
|
||||
'unsigned long integers
|
||||
Dim as ulong k, n, n2, r, s, t
|
||||
'precision parameters
|
||||
Dim shared as ulong e10, e2
|
||||
Dim shared e as clong
|
||||
Dim shared f as double
|
||||
Dim as double tim = TIMER
|
||||
CLS
|
||||
|
||||
a = allocate(len(__mpf_struct))
|
||||
b = allocate(len(__mpf_struct))
|
||||
u = allocate(len(__mpf_struct))
|
||||
v = allocate(len(__mpf_struct))
|
||||
k2 = allocate(len(__mpf_struct))
|
||||
|
||||
'log(x/y) with the Taylor series for atanh(x-y/x+y)
|
||||
Sub ln (byval s as mpf_ptr, byval x as ulong, byval y as ulong)
|
||||
Dim as mpf_ptr d = u, q = v
|
||||
Dim k as ulong
|
||||
'Möbius transformation
|
||||
k = x: x -= y: y += k
|
||||
|
||||
If x <> 1 Then
|
||||
Print "ln: illegal argument x - y <> 1"
|
||||
End
|
||||
End If
|
||||
|
||||
's = 1 / (x + y)
|
||||
mpf_set_ui (s, y)
|
||||
mpf_ui_div (s, 1, s)
|
||||
'k2 = s * s
|
||||
mpf_mul (k2, s, s)
|
||||
mpf_set (d, s)
|
||||
|
||||
k = 1
|
||||
Do
|
||||
k += 2
|
||||
'd *= k2
|
||||
mpf_mul (d, d, k2)
|
||||
'q = d / k
|
||||
mpf_div_ui (q, d, k)
|
||||
's += q
|
||||
mpf_add (s, s, q)
|
||||
|
||||
f = mpf_get_d_2exp (@e, q)
|
||||
Loop until abs(e) > e2
|
||||
|
||||
's *= 2
|
||||
mpf_mul_2exp (s, s, 1)
|
||||
End Sub
|
||||
|
||||
'Main
|
||||
|
||||
'n = 2^i * 3^j * 5^k
|
||||
|
||||
'log(n) = r * log(16/15) + s * log(25/24) + t * log(81/80)
|
||||
|
||||
'solve linear system for r, s, t
|
||||
' 4 -3 -4| i
|
||||
'-1 -1 4| j
|
||||
'-1 2 -1| k
|
||||
|
||||
'examples
|
||||
t = 1
|
||||
select case t
|
||||
case 1
|
||||
n = 60
|
||||
r = 41
|
||||
s = 30
|
||||
t = 18
|
||||
'100 digits
|
||||
case 2
|
||||
n = 4800
|
||||
r = 85
|
||||
s = 62
|
||||
t = 37
|
||||
'8000 digits, 0.6 s
|
||||
case 3
|
||||
n = 9375
|
||||
r = 91
|
||||
s = 68
|
||||
t = 40
|
||||
'15625 digits, 2.5 s
|
||||
case else
|
||||
n = 18750
|
||||
r = 98
|
||||
s = 73
|
||||
t = 43
|
||||
'31250 digits, 12 s. @2.00GHz
|
||||
end select
|
||||
|
||||
'decimal precision
|
||||
e10 = n / .6
|
||||
'binary precision
|
||||
e2 = (1 + e10) / .30103
|
||||
|
||||
'initialize mpf's
|
||||
mpf_set_default_prec (e2)
|
||||
mpf_inits (a, b, u, v, k2, Cptr(mpf_ptr, 0))
|
||||
|
||||
'Compute log terms
|
||||
|
||||
ln b, 16, 15
|
||||
|
||||
'a = r * b
|
||||
mpf_mul_ui (a, b, r)
|
||||
|
||||
ln b, 25, 24
|
||||
|
||||
'a += s * b
|
||||
mpf_mul_ui (u, b, s)
|
||||
mpf_add (a, a, u)
|
||||
|
||||
ln b, 81, 80
|
||||
|
||||
'a += t * b
|
||||
mpf_mul_ui (u, b, t)
|
||||
mpf_add (a, a, u)
|
||||
|
||||
''gmp_printf (!"log(%lu) %.*Ff\n", n, e10, a)
|
||||
|
||||
'B&M, algorithm B1
|
||||
|
||||
'a = -a, b = 1
|
||||
mpf_neg (a, a)
|
||||
mpf_set_ui (b, 1)
|
||||
mpf_set (u, a)
|
||||
mpf_set (v, b)
|
||||
|
||||
k = 0
|
||||
n2 = n * n
|
||||
'k2 = k * k
|
||||
mpf_set_ui (k2, 0)
|
||||
do
|
||||
'k2 += 2k + 1
|
||||
mpf_add_ui (k2, k2, (k shl 1) + 1)
|
||||
k += 1
|
||||
|
||||
'b = b * n2 / k2
|
||||
mpf_div (b, b, k2)
|
||||
mpf_mul_ui (b, b, n2)
|
||||
'a = (a * n2 / k + b) / k
|
||||
mpf_div_ui (a, a, k)
|
||||
mpf_mul_ui (a, a, n2)
|
||||
mpf_add (a, a, b)
|
||||
mpf_div_ui (a, a, k)
|
||||
|
||||
'u += a, v += b
|
||||
mpf_add (u, u, a)
|
||||
mpf_add (v, v, b)
|
||||
|
||||
f = mpf_get_d_2exp (@e, a)
|
||||
Loop until abs(e) > e2
|
||||
|
||||
mpf_div (u, u, v)
|
||||
gmp_printf (!"gamma %.*Ff (maxerr. 1e-%lu)\n", e10, u, e10)
|
||||
|
||||
gmp_printf (!"k = %lu\n\n", k)
|
||||
|
||||
gmp_printf (!"time: %.7f s\n", TIMER - tim)
|
||||
end
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
' ******************************************
|
||||
'Subject: Euler's constant 0.5772...
|
||||
'tested : FreeBasic 1.08.1 with mpfr 4.1.0
|
||||
'-------------------------------------------
|
||||
#include "gmp.bi"
|
||||
#include "mpfr.bi"
|
||||
|
||||
dim as mpfr_ptr a = allocate(len(__mpfr_struct))
|
||||
dim as ulong e2, e10
|
||||
dim as double tim = TIMER
|
||||
|
||||
'decimal precision
|
||||
e10 = 100
|
||||
|
||||
'binary precision
|
||||
e2 = (1 + e10) / .30103
|
||||
mpfr_init2 (a, e2)
|
||||
|
||||
mpfr_const_euler (a, MPFR_RNDN)
|
||||
mpfr_printf (!"gamma %.*Rf\n\n", e10, a)
|
||||
|
||||
gmp_printf (!"time: %.7f s\n", TIMER - tim)
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue