幂取模
来源:互联网 发布:mac双系统卸载win7 编辑:程序博客网 时间:2024/04/30 04:46
幂取模(RSA公钥的加密方法)
这种方法利用了一种分治的思想,达到了O(log(n))!
对于形如a^b%c的式子:
可以把b按二进制展开为b=p(n)*2^n+p(n-1)*2^(n-1)+...+p(1)*2+p(0)
其中p(i) (0<=i<=n)为0或1
这样a^b=a^(p(n)*2^n+p(n-1)*2^(n-1)+...+p(1)*2+p(0))
=a^(p(n)*2^n)*a^(p(n-1)*2^(n-1))*...*a^(p(1)*2)*a^p(0)
对于p(i)=0的情况,a^p(i)*2^(i-1)=a^0=1,不用处理
我们要考虑的仅仅是p(i)=1的情况
a^(2^i)=(a^(p(i)*2^(i-1)))^2
利用这一点,我们可以递推地算出所有的a^(2^i)
我们加上取模运算a^(2^i)%c=((a^(2^(i-1))%c)*a^(2^(i-1)))%c
于是再把所有满足p(i)=1的a^(2^i)%c按照算法1乘起来再%c就是结果!
当然也可以进一步的改进,可以不用存b的二进制,可以边求边用!
代码如下:
int mod(int a,int b,int c)
{
int k=1;
if(b==0) return 1%c;
while(b>=1)
{
if(b%2!=0) k=a*k%c;
a=a*a%c;////////如果a*a会超过int的范围,可以改为a=((a%c)*(a%c))%c;
b/=2;
}
return k;
}
pku 1995 就是单纯的幂取模!
代码如下:
1 # include<stdio.h> 2 int mod(int a,int b,int c) 3 { 4 int k=1; 5 if(b==0) return 1%c; 6 while(b>=1) 7 { 8 if(b%2!=0) k=a*k%c; 9 a=((a%c)*(a%c))%c;////由于a比较大!10 b/=2;11 }12 return k;13 }14 int main()15 {16 int i,t,M,A[45005],B[45004],H,sum;17 scanf("%d",&t);18 while(t--)19 {20 scanf("%d%d",&M,&H);21 sum=0;22 for(i=1;i<=H;i++)23 {24 scanf("%d%d",&A[i],&B[i]);25 sum+=mod(A[i],B[i],M);26 sum%=M;27 }28 printf("%d\n",sum);29 }30 return 0;31 }32
0 0
- 幂取模
- 幂取模
- 幂取模
- 幂取模
- 幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 幂取模算法
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 快速幂取模
- 使用Inotify实时同步文件夹
- 读取excel数据并保存为xml
- HDU 1039.Easier Done Than Said?【字符串处理】【8月24】
- 【笔试】20、单例模式
- mysql索引的类型和优缺点
- 幂取模
- VMWARE虚拟化环境下对GPU的配置说明
- Spark 学习资料整理
- 几个需要关注的问题
- 用NEXUS搭建MAVEN私服
- 创建数据库并带编码
- BestCoder#52 Victor and World
- 反转链表 - java和rust的不同实现
- python 使用pymssql连接sql server数据库