我需要使用C ++派生一种算法,以使用循环不变性r = y ^ n和循环条件y!= m来计算整数幂m ^ n。
我尝试使用指令y = y + 1进行扩展,但我不知道如何从y ^ n中获得(y + 1)^ n,这并不难找到。所以,可能这不是正确的路径
您能帮我派生程序吗?
编辑:这是主题数据结构和算法中的问题。困难(如果有的话)不应该是数学上的。
EDIT2:为澄清起见,问题的难点在于使用不变的y ^ n和循环条件y!= m。如果我改变n,我将无法实现
答案 0 :(得分:0)
(y+1)^n
和y^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 。