8

这实际上是针对编程比赛的,但我已经非常努力地尝试了,甚至没有最微弱的线索如何做到这一点。

找到 n m的第一个和最后 k 个数字,其中 n 和 m 可以非常大 ~ 10^9。

对于最后 k 位,我实现了模幂运算。

对于第一个 k,我想使用二项式定理达到一定的幂,但这涉及到大量的阶乘计算,我不知道如何找到一个最佳点,在该点处 n^m 可以扩展为 (x+y)

那么有没有任何已知的方法可以在不执行整个计算的情况下找到前 k 位数字?

更新1 <= k <= 9 并且 k 将始终是 <= n m中的数字

4

4 回答 4

4

不确定,但我想到了恒等式 n m = exp10(m log10(n)) = exp(q (m log(n)/q)) 其中 q = log(10) 以及第一个 K exp10(x) 的位数 = exp10(frac(x)) 的前 K 位,其中 frac(x) = x = x - floor(x) 的小数部分。

更明确地说:n m的前 K 位是其尾数的前 K 位= exp(frac(m log(n)/q) * q),其中 q = log(10)。

或者你甚至可以在这个会计练习中走得更远,并使用 exp((frac(m log(n)/q)-0.5) * q) * sqrt(10),它也有相同的尾数(+ 因此相同的第一个 K数字)以便 exp() 函数的参数以 0 为中心(在 +/- 0.5 log 10 = 1.151 之间)以实现快速收敛。

(一些例子:假设你想要 2 100的前 5 位数字。这等于 exp((frac(100 log(2)/q)-0.5)*q)*sqrt(10) = 1.267650600228226 的前 5 位数字。根据 MA​​TLAB,2 100的实际值是 1.267650600228229e+030,我手边没有 bignum 库。对于 2 1,000,000,000的尾数,我得到 4.612976044195602 但我真的没有办法检查....有一个梅森素数页面上有人已经完成了艰苦的工作;2 20996011 -1 = 125,976,895,450... 我的公式给出了在 MATLAB 中计算的 1.259768950493908,它在第 9 位之后失败。)

我可能会使用泰勒级数(用于 exp和 log,而不是用于 nm 及其误差范围,并继续添加项,直到误差范围降至前 K 位以下。(通常我不使用泰勒级数进行函数逼近——它们的误差被优化为在单个点附近最准确,而不是在所需的区间上——但它们确实具有数学上简单的优势,而且你只需添加附加项即可将准确度提高到任意精度)

对于对数,我会使用您最喜欢的近似值。

于 2009-03-11T15:59:45.380 回答
2

好。我们想计算替代文字并只得到n 个前位数。

替代文字通过以下迭代计算:

替代文字

你有替代文字. 替代文字不准确地计算每个。问题是 的相对误差替代文字小于a 的相对误差n倍。

您希望最终的相对误差小于替代文字. 因此,每一步的相对误差可能是替代文字。删除每一步的最后一位数字。

例如,a=2、b=16、n=1。最终相对误差为 10^{-n} = 0,1。每一步的相对误差为 0,1/16 > 0,001。因此,3 位数字在每一步都很重要。如果 n = 2,则必须保存 4 位。

2 (1), 4 (2), 8 (3), 16 (4), 32 (5), 64 (6), 128 (7), 256 (8), 512 (9), 1024 (10) - -> 102、204 (11)、408 (12)、816 (13)、1632 (14) -> 163、326 (15)、652 (16)。

答案:6。

该算法的复杂度为O(b)。但是很容易将其更改为 O(log b)

于 2010-10-06T15:12:48.820 回答
0

假设你在每一步都截断?不确定这有多准确,但是,例如,取 n=11 m=某个大数字,并且您想要前 2 位数字。

递归:

  1. 11 x 11 -> 121, truncate -> 12 (1 truncation or rounding) 然后取截断值并再次提升
  2. 12 x 11 -> 132 截断 -> 13 重复,

  3. (132 截断) x 11 -> 143. ...

最后加上 #0 相当于你已经完成的截断次数。

于 2009-03-11T16:19:13.897 回答
0

你看过平方乘幂吗?您也许可以修改其中一种方法,以便只计算必要的。

在我上一堂算法课中,我们必须实现与您正在做的类似的事情,我隐约记得那个页面很有用。

于 2009-03-11T17:22:53.807 回答