// Sqrt returns the square root n. func Sqrt(n *big.Float) *big.Float { prec := n.Prec() x := new(big.Float).SetPrec(prec).SetInt64(1) z := new(big.Float).SetPrec(prec).SetInt64(1) half := new(big.Float).SetPrec(prec).SetFloat64(0.5) t := new(big.Float).SetPrec(prec) for { z.Copy(x) t.Mul(x, x) t.Sub(t, n) t.Quo(t, x) t.Mul(t, half) x.Sub(x, t) if x.Cmp(z) == 0 { break } } return x }
func abs(x *complexFloat) *big.Float { r := new(big.Float).SetPrec(prec) i := new(big.Float).SetPrec(prec) r.Copy(x.r) i.Copy(x.i) r.Mul(r, x.r) // r^2 i.Mul(i, x.i) // i^2 r.Add(r, i) // r^2 + i^2 return sqrtFloat(r) // sqrt(r^2 + i^2) }
func sqrtFloat(x *big.Float) *big.Float { t1 := new(big.Float).SetPrec(prec) t2 := new(big.Float).SetPrec(prec) t1.Copy(x) // Iterate. // x{n} = (x{n-1}+x{0}/x{n-1}) / 2 for i := 0; i <= steps; i++ { if t1.Cmp(zero) == 0 || t1.IsInf() { return t1 } t2.Quo(x, t1) t2.Add(t2, t1) t1.Mul(half, t2) } return t1 }