1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
//实现求乘法逆元的函数
#include <iostream>
using namespace std;
int multi_inverse(int a, int m);
int main()
{
int a, m;
cin >> a >> m;
int Multi_Inverse = multi_inverse(a, m);
if (Multi_Inverse == -1)
cout << "无解" << endl;
else
cout << "逆元是" << Multi_Inverse;
}
//求a模m的乘法逆元
int multi_inverse(int a, int m)
{
int s, t;
//gcd(a,m)!=1 无解
if (egcd(a, m, &s, &t) != 1)
{
return -1;
}
//gcd(a,m)=1 此时有解,且逆元取决于a前面的系数
else
{
//又基于egcd函数会将大的输入数与s系数配对,小的输入数反之则与t配对,下面进行对a和m判断大小
if (a > m) //此时s即是a前面的系数
{
if (s < 0)
s = s + m;//根据逆元定义:负数要转化为正数
return s;
}
else //对此时t即是a前面的系数
{
if (t < 0)
t = t + m;
return t;
}
}
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
#include<iostream>
#include<cmath>
using namespace std;
enum evenodd{even,odd};
evenodd Y;
//input x、y、m
//return (x^y)mod m
int ModulusIndex(int x,int y,int m)
{
if(y==0) return 1;
int next=ModulusIndex(x,y/2,m);
y%2==1?Y=odd:Y=even; //判断y为偶数还是奇数
if(Y==even) return (next*next)%m;
else return (x*next*next)%m;
}
int main()
{
int x=0,y=0,m=0;
int YorN=0; //again or exit
do
{
cout<<"请先后输入x、y、m:((x^y)mod m )";
cin>>x>>y>>m;
cout<<ModulusIndex(x,y,m);
cout<<"\nagian input 1,exit input 0:";
cin>>YorN;
}while(YorN==1);
return 0;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
23为素数,由费尔马小定理有 1 mod 23
mod 23 =6
4、使用欧拉定理计算2^{100000} mod 55。
gcd(2,55)=1,由欧拉定理
Φ(55)=40,1 mod 55
1 mod 55
5、手动计算7^{1000}的最后两个数位等于什么?
转化为求 mod 100
gcd(7,100)=1, Φ(100)=40
由欧拉定理 mod 100 = 1
1 mod 100
最后两位数位等于 01