快速幂就是通过比较的方式比较是否可以通过2的次数幂相乘得到想要的结果:
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
ll mod_pow(ll x,ll n,ll mod){
ll res = 1;
while(n>0){
if(n&1){
res = res*x%mod;
}
x = x*x%mod;
n>>=1;
}
return res;
}
int main()
{
ll a,b,c;
while(true){
cout<<"输入快速幂mod(x)的三个值"<<endl;
cin>>a>>b>>c;
ll d = mod_pow(a,b,c);
printf("%lld\n",d);
}
return 0;
}
矩阵快速幂不过就是把数字与数字的相乘改为矩阵与矩阵的点乘积:
#include <iostream>
#include <cstring>
#include <stdio.h>
#define N 2
using namespace std;
typedef int (*juzhen)[N];
int res[N][N];
void diancheng(int a[][N],int b[][N],int n,int mod){int temp[N][N];
memset(temp,0,sizeof(temp));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
temp[i][j] += a[i][k]*b[k][j];
temp[i][j]%=mod;
}
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
a[i][j] = temp[i][j];
}
}
}
juzhen mod_pow(int x[][N],int n,int mod){
memset(res,0,sizeof(res));
for(int i=0;i<N;i++){
res[i][i] = 1;
}
while(n>0){
if(n&1){
diancheng(res,x,N,mod);
}
diancheng(x,x,N,mod);
n>>=1;
}
return res;
}
int main()
{
int (*p)[N];
int a[N][N];
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;
int mod = 2;
p=mod_pow(a,3,mod);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
printf("%d ",p[i][j]);
}
printf("\n");
}
return 0;
}