牛顿迭代法对大数进行开平方操作(java版)

求f(x)=0的一实根,

可以采用牛顿迭代法,根据迭代公式

x(n+1)= x(n)-f(x(n))/f '(x(n))

注意后面是f(x)的导数

对大数a进行开平方操作呢,可以认为是求

x^2-a=0在x>0时候的一实根

java提供了现成的BigDecimal类,直接调用其api即可

上简单代码

import java.math.*;
public class Yaowei {
	public static void main(String[]args) throws Exception{
		final String a = "1234567896554987987465455642132132133213213213";
		BigDecimal a1 = new BigDecimal(a.substring((int)(a.length()/2)));
		int i = 0;
		final double flag = 0.001;
		while((i++) < 100)
		{
			BigDecimal temp = Yaowei.calc(a1);
			if (a1.subtract(temp).doubleValue() < flag)
			{
				a1 = temp;
				System.out.println(i);
				break;
			}
			a1 = temp;
		}
		System.out.println(a1);
	}
	private static BigDecimal calc(BigDecimal b){
		return b.subtract((b.multiply(b).subtract(new BigDecimal("1234567896554987987465455642132132133213213213"))).divide(new BigDecimal("2").multiply(b),3,BigDecimal.ROUND_HALF_EVEN));
	}

}


这个方法也可以判断某个大数是不是完全平方数,

迭代收敛后再验证一下即可

 

你可能感兴趣的:(java,exception,String,api,Class,import)