计算大根:bigdecimal/java

计算大根:bigdecimal/java,java,root,bigdecimal,Java,Root,Bigdecimal,我尝试使用标准的迭代算法来计算n个根 例如(111^123)^(1/123) 标准算法计算基数的高次幂(在本例中为111^123),这需要大量时间。这里给出了算法 然而,我注意到使用double进行同样的操作只需要不到一毫秒的时间。所以很明显,他们使用了一些聪明的想法。有什么提示吗?尝试使用二进制幂运算。我的意思是做: 111*111=111^2,现在你知道111^2是什么了,你现在可以通过(111^2)*(111^2)来计算111^4。下面是整个过程(请注意,这可能不是最有效的方法) 然而,我

我尝试使用标准的迭代算法来计算n个根

例如(111^123)^(1/123)

标准算法计算基数的高次幂(在本例中为111^123),这需要大量时间。这里给出了算法


然而,我注意到使用double进行同样的操作只需要不到一毫秒的时间。所以很明显,他们使用了一些聪明的想法。有什么提示吗?

尝试使用二进制幂运算。我的意思是做:

111*111=111^2,现在你知道111^2是什么了,你现在可以通过(111^2)*(111^2)来计算111^4。下面是整个过程(请注意,这可能不是最有效的方法)

然而,我注意到同样的事情 使用double只需不到一个小时 毫秒。所以很明显他们使用 一些聪明的想法


不是真的
double
的精度很有限,因此它基本上只需计算结果中最重要的52位,并且可以跳过其余的计算。当然,在硬件中实现这一点也会有所帮助。

我相当肯定,如果这真的优化了任何东西,它会被内置到类中。一般来说,我更喜欢做最简单的事情。我想poster可能是在创建自己的实现或其他东西。问题不在于计算111^123,而在于计算(111^123)^(1/123)让
a=111^123
然后要计算
a^(1/123)
,标准算法必须计算a^122及其以下的所有幂。这是一个问题,因为(111^123)^122是一个非常大的数字。请注意,BigDecimal类没有实现根函数。使用相同的方法,但使用平方根。我真的不想计算111^123^122。。因为无论哪种方式,数字都太大,需要内存和时间。我需要另一种方法来计算根,而不是首先计算功率是的,有限的精度可能是使
加倍的原因。我应该自己弄明白:-)我真正需要的是一个聪明的算法来保持精度并快速计算大根。但是我相信这已经在文献中做过了,所以我正在寻找参考资料。有人有什么好主意吗?我尝试了以下方法。为了计算
a^(1/x)
对于带有
x
整数的大型
a,x
,我计算了一个随机
b
,使得
b^x
但是
b^(x+1)>a
。让
c=a/b^x
。我计算了
a^(1/x)=(a*b^x/(b^x))^(1/x)=c^(1/x)*b
。我希望通过保持基地
c
小,我可以获得一些时间。不幸的是,如果我保持较小的除法比例,我在计算
c^(1/x)
时会得到被零除的错误,或者如果我保持较大的除法比例,则计算时间较长。所以这并不能买任何东西。我通过缩小b得到了一些改进(从几个小时到几分钟)。也就是说,
b^x
111 * 111 = 111^2
111^2 * 111^2 = 111^4
111^4 * 111^4 = 111^8
111^8 * 111^8 = 111^16
111^16 * 111^16 = 111^32
111^32 * 111^32 = 111^64
111^64 * 111^32 = 111^96
111^96 * 111^16 = 111^112
111^112 * 111^8 = 111^120
111^120 * 111^2 * 111^1 = 111^123.