计算给定循环不变的整数幂

时间:2018-11-01 11:42:16

标签: algorithm

我需要使用C ++派生一种算法,以使用循环不变性r = y ^ n和循环条件y!= m来计算整数幂m ^ n。

我尝试使用指令y = y + 1进行扩展,但我不知道如何从y ^ n中获得(y + 1)^ n,这并不难找到。所以,可能这不是正确的路径

您能帮我派生程序吗?

编辑:这是主题数据结构和算法中的问题。困难(如果有的话)不应该是数学上的。

EDIT2:为澄清起见,问题的难点在于使用不变的y ^ n和循环条件y!= m。如果我改变n,我将无法实现

2 个答案:

答案 0 :(得分:0)

(y+1)^ny^n之间没有有用的关系(您可以写(y+1)^n = (√(y^n)+1)^n(y+1)^n = (1+1/y)^n y^n,但这无济于事)。

如果将y分解,则可以利用(a.b)^n = (a^n).(b^n),但是您需要一张素数第n次幂的表。

我看不到有意义的答案。


您还可以想到二项式定理,

(y+1)^n = y^n + n y^(n-1) + n(n-1)/2 y^(n-2) + ... 1

但这比什么都糟:您需要计算n的二项式系数,并将y的所有幂从0更新为n。计算的总成本会高得离谱。

答案 1 :(得分:0)

给出 w P ,这样 2 ^ w> m P> 2 ^(wn) ,并且 2 ^((P-1)/ 2)= -1 mod P

然后 2 是生成器mod P ,并且会有一些 x ,使得 2 ^ x = m mod P ,所以:

if (m<=1 || n==1)
    return m;
if (n==0)
    return 1;

let y = 2;
let r = 1<<n;

while(y!=m)
{
    y = (y*2)%P;
    r = (r*(1<<n))%P;
}
return r;

除非您的函数需要产生bignum结果,否则您只需选择适合您的语言整数的最大 P