1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
int inverse(int a,int m){//求乘法逆元
int i,j,s;
for(i=1;i<m;i++){
j=1;
while(a*i-m*j>0){
if(a*i-m*j==1){
s=i;
goto end;
}
j++;
}
}
end:
if(i==m){
cout<<"无解!"<<endl;
return 0;
}
else return s;
}
int slove(int a,int b,int m){//求同余方程的解
int s=inverse(a,m);
if(s==0){
cout<<"无解!"<<endl;
return 0;
}
else{
return b*s%m;
}
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
int mod_exp(int x,int y,int m){
int tmp=x%m,res=1;
while(y>0){
if(y%2==1){
res*=tmp;
cout<<"res = "<<res<<endl;
}
tmp*=tmp;
tmp%=m;
y>>=1;
}
return res%m;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
p 是素数,所以可以由费尔马小定理得 a 22 ≡ 1 m o d 23 a ^ {22} ≡ 1 mod 23 a22≡1mod23
原式:
a 2020 m o d 23 a ^ {2020} mod 23 a2020mod23
= a 22 ∗ 91 + 18 m o d 23 = a ^ {22 * 91 + 18} mod 23 =a22∗91+18mod23
= a 22 ∗ 91 ∗ a 18 m o d 23 = a ^ {22 * 91} * a ^ {18} mod23 =a22∗91∗a18mod23
= a 18 m o d 23 = a ^ {18} mod 23 =a18mod23
= 5 18 m o d 23 = 5 ^ {18} mod 23 =518mod23
= 6 = 6 =6
4、使用欧拉定理计算2^{100000} mod 55。
ϕ ( 55 ) = 40 ϕ(55) = 40 ϕ(55)=40
由于 g c d ( 2 , 55 ) = 1 gcd(2,55) = 1 gcd(2,55)=1,所以可以由欧拉定理得 2 ∗ ϕ ∗ ( 55 ) ≡ 1 m o d 55 2 ^ {*ϕ*(55)} ≡ 1 mod 55 2∗ϕ∗(55)≡1mod55
原式:
2 100000 m o d 55 2 ^ {100000} mod 55 2100000mod55
= 2 40 ∗ 2500 m o d 55 = 2 ^ {40*2500} mod 55 =240∗2500mod55
= 1 m o d 55 = 1 mod 55 =1mod55
= 1 = 1 =1
5、手动计算7^{1000}的最后两个数位等于什么?
只看十位数和个位数:
7 1 = 07 7 ^ {1} = 07 71=07
7 2 = 49 7 ^ {2} = 49 72=49
7 3 = 43 7 ^ {3} = 43 73=43
7 4 = 01 7 ^ {4} = 01 74=01
7 5 = 07 7 ^ {5} = 07 75=07
每4次方,十位数和个位数就循环一次
1000 / 4 = 250 1000 / 4 = 250 1000/4=250
所以 7 1000 7 ^ {1000} 71000 的十位数和个位数分别是 0,1