文章目录
一、编程题
1、写一个模指数运算函数Mod_Exp,输入a、b和m,输出a^b mod m,即a的b次方模m
#include<iostream>
using namespace std;
int Mod_Exp(int a, int b, int m)
{
if(b == 0)
return 1;
int z = Mod_Exp(a,b/2,m);
if(b % 2 == 0)
{
return z*z%m;
}
else
{
return a*z*z%m;
}
}
int main()
{
int a,b,m;
cout<<"请分别输入x,y,m的值"<<endl;
cin>>a>>b>>m;
cout<<"a^b mod m = "<<Mod_Exp(a,b,m)<<endl;
}
2、写一个求乘法逆元的函数Mul_Inverse,输入a和m,求a模m的乘法逆元。提示,要求只输出正整数
根据扩展的欧几里得算法 ax + my = gcd(a,m)= 1
x为乘法逆元,
a*x mod m = 1
#include<iostream>
using namespace std;
int egcd(int a,int b,int&x,int&y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ret = egcd(b,a%b,x,y);
int temp = x;
x = y;
y = temp -a/b*y;
return ret;
}
int Mul_lnverse(int a,int m)
{
int x,y,gcd;
gcd = egcd(a,m,x,y);
if(gcd==1)
{
x = (x%m+m)%m;
return x;
}
else{
cout<<"a与m不互质,无乘法逆元"<<endl;
return 0;
}
}
int main()
{
int a,m;
cout<<"请输入a,m的值:"<<endl;
cin>>a>>m;
cout<<"a模m的乘法逆元为:"<<Mul_lnverse(a,m)<<endl;
return 0;
}
二、计算题
1.设p=23和a=3,使用费尔马小定理计算a^2019 mod p?
2.请证明13整除2^70 + 3^70
3.使用欧拉定理计算2^100000 mod 55
4.手动计算7^1000的最后两个数位等于什么?
总结
可能有问题,请指正