我想在O(nlogn)中找到(x ^ n除p)的提示,n = 2 ^ k; 我写这个,但事实并非如此,你能帮助我吗?
rem(int x,int n,int p){
if (n==1)
return x%p;
else
return rem(x,n/2,p);
}
答案 0 :(得分:3)
假设这是家庭作业,这里有一个提示:阅读exponentiation by squaring,它为您提供构建解决方案所需的一切,包括伪代码。
您当前的实现不区分n
的偶数值和奇数值,仅当n
是2的幂时才是正确的。您可以扩展您的解决方案以适用于所有n
(见下文)。
当您获得rem(x,n/2,p)
的返回值且n
为偶数时,您应该将结果平方并取平方的余数。
您可以将此扩展为适用于所有n
,而不仅仅是2
的权限,还可以将结果乘以x
,并将剩余部分用于n
的奇数值