用模数1000,000,007计算双倍的大功率

时间:2012-07-06 05:08:25

标签: floating-point exponentiation

我想找到(1 + sqrt(3))^(n + 1)的大功率,其中n从n = 1变化到n = 1000,000,000。 可以通过双打平方来进行模幂运算吗?怎么样?我已经搜索了很多但没有得到积极的结果。任何帮助都会受到高度赞赏吗?

1 个答案:

答案 0 :(得分:2)

“我可以解释一些假设”,问题的答案是“通过平衡双打工作可以进行模幂运算吗?”的答案是否定的。

采用模数为1,000,000,007的残差等操作是各种数论计算和其他整数算法的典型。所以,我假设我们想用整数精度计算结果。也就是说,我们想知道对于某些n,0 <0,最接近(1 + sqrt(3))^(n + 1)%1,000,000,007的整数。 n≤10 9 。考虑函数x n + 1 。其相对于x的导数是(n + 1)x n 。当x为1 + sqrt(3)且n为10 9 时,衍生物为约4.65×10 436488780 。这意味着在4.65•10 436488780 中x的约1个部分的变化将使x n + 1 的值改变约1,这当然也会改变残留物因此,为了计算具有所需精度的残差,我们必须实际上计算1 + sqrt(3)到超过4.36亿个小数位的值。

这远远超出了任何现代计算机上double类型提供的精度。因此,答案是否定的;没有算法可以给你想要的答案,因为double类型不能以必要的精度计算。

从技术上讲,可以使用双精度算法来构造扩展精度算术。 (因此,上面的答案是通过正常方式使用双精度算法来解决的。)因此,使用非常规技术,可以从双精度运算中制造必要的计算。讨论这样做的方法超出了Stack Overflow问题。通常,整数运算用于此类工作的大部分,尽管双精度运算可能起作用。软件包可用于提供这种扩展精度算法,例如GMP(GNU多精度算术库)。

计算和保留4.36亿个小数位可能会使计算资源紧张。可以通过丢弃可以显示不影响最终残留的信息来减少所需的计算,从而不是同时需要所有436万个小数位。但是,我不认为这种减少会产生在没有扩展精度技术的双精度算术中可行的计算。

问题比这更糟糕。知道x到4.65•10 436488780 中的大约一部分可能会帮助您在1的误差内计算结果,但它不会告诉您哪个整数最接近。考虑你可以计算(1 + sqrt(3)) n + 1 %1,000,000,007,并发现结果非常接近3.5。为了确定最接近结果的整数是3还是4,您必须确定结果所在的3.5的哪一侧。这个函数,(1 + sqrt(3)) n + 1 可能有一些非常接近这个中间位置的值,你需要更准确地计算它们才能做出正确的决定