快速乘就是将两个要相乘的一个数变成二进制的形式进行运算。
为什么要用快速乘?当两个大数进行相乘进行取模(ab%c)时,运算ab可能会爆long long的范围,这种情况就要用到快速乘了。
为什么快速乘不会爆范围呢?乘法容易爆范围,但是由于过程中不断取模,所以加法不会爆范围。
快速乘实现的原理:快速乘是利用乘法分配律将ab分解成多个式子相加(将后面一个乘数转化为二进制的形式计算)求解。例如:1211=121011(2)=1223+12*21+12*2^0=96+24+12=132(跟快速幂其实有很多相同之处,例如思维相同,对二进制的转化相同)
一些要用快速乘的算法:
Miller rabin 判大质数
Pollard Rho 大数因子寻找
BSGS 大步小步算法
主要代码:
个人觉得这个快速乘和快速幂是十分相似的,主要代码也很相似:
long long int ksc(long long int n,long long int m,long long int c)
{
long long int res=0;
while(m)
{
if(m&1)
res=(res+n)%c;//是加不是乘,理由同下
n=(n+n)%c;//是加不是乘,快速幂里面才是乘
m=m/2;
}
return res;
}
举个例子:
描述
a*b%p的值
格式
输入格式
输入a b p
a,b在long long的范围内
输出格式
a*b%p
样例
样例输入 Copy
2 4 3
样例输出 Copy
2
这就是一个非常典型的快速乘的例子:
#include<stdio.h>
long long int ksc(long long int n,long long int m,long long int c)
{
long long int res=0;
while(m)
{
if(m&1)
res=(res+n)%c;
n=(n+n)%c;
m=m/2;
}
return res;
}
int main()
{
long long int a,b,p,sum;
scanf("%lld %lld %lld",&a,&b,&p);
sum=ksc(a,b,p);
printf("%lld",sum);
return 0;
}
个人认为快速乘相对容易简单,只要能理解,运用起来还是不难的。