# 1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
代码如下:
#include<iostream>
using namespace std;
//求乘法逆元
int cfny(int a, int m)
{
//由题意知a的乘法逆元为正整数,因此大于0小于m
for (int i = 0; i < m; i++)
if ((i * a) % m == 1) return i;//有解时返回i
cout << "无解" << endl;//无解时给出提示
return -1;
}
//求解同余方程
int solve(int a,int b,int m)
{
if (cfny(a, m) == -1) {
cout << "无解" << endl;
return -1;
}//无解时给出提示
int y = 0;
for (; ((b + m * y) % a); y++)
continue;
return (b + m * y) / a;
}
# 2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
代码如下:
#include<iostream>
using namespace std;
int mod_exp(int x, int y, int m)
{
if (y == 0) return 1;
int z = 1;
while (y > 0)
{
if ((y & 1) == 1) z = (z * x) % m;
y = y / 2;
x = (x * x) % m;
}
return z;
}
# 3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
所以
# 4、使用欧拉定理计算2^{100000} mod 55。
因为,由欧拉定理有
所以
# 5、手动计算7^{1000}的最后两个数位等于什么?
手算7的n次方(n=1,2,3,...)可以发现后两数位有一定的规律,不难发现的最后两个数位为01