快速乘

快速乘就是将两个要相乘的一个数变成二进制的形式进行运算。

为什么要用快速乘?当两个大数进行相乘进行取模(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;
}

个人认为快速乘相对容易简单,只要能理解,运用起来还是不难的。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值