Math 仅需要前k位时的快速求幂?

Math 仅需要前k位时的快速求幂?,math,exponentiation,Math,Exponentiation,这实际上是为了一个编程竞赛,但我已经非常努力地尝试了,甚至连一点如何做到这一点的线索都没有 找到nm的第一个和最后一个k位,其中n和m可以非常大~10^9 对于最后k位,我实现了模幂运算 对于第一个k,我想用二项式定理达到一定的幂次,但这涉及到对阶乘的大量计算,我不确定如何找到一个最佳点,在这个点上n^m可以展开为(x+y)m 那么,是否有任何已知的方法可以在不执行整个计算的情况下找到前k位 更新1不确定,但会想到标识nm=exp10(m log10(n))=exp(q(m log(n)/q))

这实际上是为了一个编程竞赛,但我已经非常努力地尝试了,甚至连一点如何做到这一点的线索都没有

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

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

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

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


更新1不确定,但会想到标识nm=exp10(m log10(n))=exp(q(m log(n)/q)),其中q=log(10),以及exp10(x)的前K位=exp10(frac(x))的前K位,其中frac(x)=x=x的分数部分-楼层(x)

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

或者,您甚至可以在这个会计练习中更进一步,使用exp((frac(m log(n)/q)-0.5)*q)*sqrt(10),它也具有相同的尾数(+因此前K位相同),以便exp()函数的参数以0为中心(并且在+/-0.5 log 10=1.151之间)快速收敛

(一些示例:假设您需要2100的前5位。这等于exp((frac(100 log(2)/q)-0.5)*q)*sqrt(10)的前5位)=1.267650600228226。2100的实际值是1.267650600228229e+030根据MATLAB,我手头没有bignum库。对于2100000000的尾数,我得到了4.612976044195602,但我真的没有办法检查……有一页关于某人已经完成了艰苦工作;220996011-1=125976895450……和我的公式gi在MATLAB中计算的ves 1.259768950493908在第9位之后失败。)

我可能会使用(exp和log,而不是nm)及其错误边界,并不断添加术语,直到错误边界降到前K位以下。(通常情况下,我不使用泰勒级数进行函数逼近——它们的误差被优化为在单个点附近最精确,而不是在期望的区间内——但它们确实具有数学上简单的优点,并且可以通过添加附加项将精度提高到任意精度)


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

假设你在每一步截断?不确定这会有多准确,但是,例如 n=11 m=一些大数字 您需要前两位数字

递归地:

  • 11 x 11->121,截断->12(1个截断或四舍五入) 然后取截断值并再次提升
  • 12 x 11->132截断->13 重复一遍

  • (132截短)x11->143。

  • 最后加上#0等于你所做的截断次数。

    你看了吗?您可以修改其中一个方法,以便只计算所需的内容


    在我上一节算法课上,我们必须实现一些类似于您正在做的事情,我模糊地记得那个页面很有用。我们只想计算并得到n个第一位数字

    通过以下迭代计算:

    你有。 不完全准确地计算每一个。 问题是,相对误差较小 大于a的n倍相对误差

    您希望得到小于的最终相对误差。 因此,每个步骤上的相对误差可能是最小的。 在每个步骤中删除最后的数字

    例如,a=2,b=16,n=1。最后的相对误差是10^{-n}=0,1。 每个步骤的相对误差为0,1/16>0001。 因此,在每个步骤中,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)

    答:六,

    该算法的竞争性为O(b)。但是改变它很容易得到它
    O(logb)

    @nlucaroni:谢谢,但如果你能把这样的想法作为自己的评论,那就更礼貌了。泰勒级数对于这个函数来说并不简单。f(x)=x^n,f'(x)=nx^(n-1),f'(x)=n(n-1)x^(n-2)-您看到了问题。每个术语都需要计算一个类似于您试图近似的函数。如果n=10^9,你需要那么多的项才能得到fI的n阶导数,这并不意味着n^m的泰勒级数,我的意思是exp()和log(),依我看,它们的收敛速度还不够快。我更喜欢看Abramowitz和Stegun之类的:也许我错过了什么。。你需要K做什么?exp(K(m log(n)/K))==exp(m log(n))此方法需要与有效的求幂方法相结合。如果您想要7^23421613的最后10位数字,您肯定不想执行乘法和截断方法23421613次。这不起作用,例如65^5=116。。。对于k=3,但通过截断,答案是115。另外,你必须注意你的误差范围。即使只需要两位数,中间计算也需要两位数以上。K是任意的吗?或者限制在特定范围内?