June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,65 @@
import "math/big"
func Root(a *big.Float, n uint64) *big.Float {
limit := Exp(New(2), 256)
n1 := n-1
n1f, rn := New(float64(n1)), Div(New(1.0), New(float64(n)))
x, x0 := New(1.0), Zero()
_ = x0
for {
potx, t2 := Div(New(1.0), x), a
for b:=n1; b>0; b>>=1 {
if b&1 == 1 {
t2 = Mul(t2, potx)
}
potx = Mul(potx, potx)
}
x0, x = x, Mul(rn, Add(Mul(n1f, x), t2) )
if Lesser(Mul(Abs(Sub(x, x0)), limit), x) { break }
}
return x
}
func Abs(a *big.Float) *big.Float {
return Zero().Abs(a)
}
func Exp(a *big.Float, e uint64) *big.Float {
result := Zero().Copy(a)
for i:=uint64(0); i<e-1; i++ {
result = Mul(result, a)
}
return result
}
func New(f float64) *big.Float {
r := big.NewFloat(f)
r.SetPrec(256)
return r
}
func Div(a, b *big.Float) *big.Float {
return Zero().Quo(a, b)
}
func Zero() *big.Float {
r := big.NewFloat(0.0)
r.SetPrec(256)
return r
}
func Mul(a, b *big.Float) *big.Float {
return Zero().Mul(a, b)
}
func Add(a, b *big.Float) *big.Float {
return Zero().Add(a, b)
}
func Sub(a, b *big.Float) *big.Float {
return Zero().Sub(a, b)
}
func Lesser(x, y *big.Float) bool {
return x.Cmp(y) == -1
}

View file

@ -1,15 +1,17 @@
function nthroot(n::Integer, A::Real)
A < 0 || n == 0 && throw(DomainError())
n < 0 && return 1/nthroot(-n, A)
A == 0 && return A
x = A / n
prevdx = A
function nthroot(n::Integer, r::Real)
r < 0 || n == 0 && throw(DomainError())
n < 0 && return 1 / nthroot(-n, r)
r > 0 || return 0
x = r / n
prevdx = r
while true
y = x^(n-1)
dx = (A - y*x) / (n * y)
abs(dx) >= abs(prevdx) && return x
y = x ^ (n - 1)
dx = (r - y * x) / (n * y)
abs(dx) abs(prevdx) && return x
x += dx
prevdx = dx
end
end
@vectorize_2arg Number nthroot
@show nthroot.(-5:2:5, 5.0)
@show nthroot.(-5:2:5, 5.0) - 5.0 .^ (1 ./ (-5:2:5))

View file

@ -1,11 +1,11 @@
func nthroot(n, a, precision=1e-5) {
var x = 1;
var prev = 0;
var x = 1.float
var prev = 0.float
while ((prev-x).abs > precision) {
prev = x;
x = (((n-1)*prev + a/(prev**(n-1))) / n);
};
return x;
x = (((n-1)*prev + a/(prev**(n-1))) / n)
}
return x
}
say nthroot(5, 34); # => 2.024397458501034082599817835297912829678
say nthroot(5, 34) # => 2.024397458501034082599817835297912829678314204

View file

@ -1,6 +1,6 @@
func nthroot_fast(n, a, precision=1e-5) {
{ a = nthroot(2, a, precision) } * int(n-1);
a ** (2**int(n-1) / n);
{ a = nthroot(2, a, precision) } * int(n-1)
a ** (2**int(n-1) / n)
}
say nthroot_fast(5, 34, 1e-64); # => 2.024397458499885042510817245541937419115
say nthroot_fast(5, 34, 1e-64) # => 2.02439745849988504251081724554193741911462170107