June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
65
Task/Nth-root/Go/nth-root-2.go
Normal file
65
Task/Nth-root/Go/nth-root-2.go
Normal 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
|
||||
}
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue