1. 程式人生 > >快速積 快速冪(以及取餘)運算C/C++

快速積 快速冪(以及取餘)運算C/C++

#include <bits/stdc++.h>
using namespace std;
//簡單來說就是把b當成2進位制形式,然後累加;
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2; 
long long FastMul(long long a,long long b) //快速積 a*b 
{
    long long ans=0;
    while(b){
        if(b&1)        //二進位制數b各位如果為1 
            ans+=a;        
        a+=a;
        b>>=1;        //右移1位,相當於除以2 
    }
    return ans;

long long FastExp(long long a,long long b)    //快速冪 a^b 
{
    long long ans=1;
    while(b){
        if(b&1)
            ans*=a;
        a*=a;
        b>>=1;
    }
    return ans;
}

//快速積取模簡單來說就和上面說明一樣,只是每次多一個取餘過程,下次運算加上上次的餘數;
// 2*7%5=2*(1*2^0+1*2^1+1*2^2)%5=(2*1*2^0%5+2*1*2^1%5+2*1*2^2%5)%5    (不知道是不是這樣表達的,嘻嘻) 
long long FastMulMod(long long a,long long b,long long c)    //快速積取模 a*b%c 
{
    long long ans=0;
    while(b){
        if(b&1)
            ans=(ans+a)%c;
        a=(a+a)%c;
        b>>=1; 
    }
    return ans;

long long FastExpMod(long long a,long long b,long long c)    //快速冪取模 a^b%c
{
    long long ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return ans;

int main()
{
    printf("%ld\n",FastMul(100,100));
    printf("%ld\n",FastExp(2,10));
    printf("%ld\n",FastMulMod(3,93,5));
    printf("%ld\n",FastExpMod(2,9,5));
    return 0;
}