同余、模指数、费尔马小定理、欧拉定理
1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
代码如下:
#include<iostream>
using namespace std;
//求乘法逆元
//3和52得研究研究
int MIM(int a, int m)
{
int r_or_b=0, res = m;//用这个来判断应该输出哪个数,默认a>m,输出r0
if (a < m)
{
int temp = a;
a = m;
m = temp;
r_or_b = 1;
}
int temp_r, temp_b, temp_ab, n, r0 = 1, r1 = 0, b0 = 0, b1 = 1;//n用来计算要减的倍数
while (m != 0)
{
n = a / m;
//实现a和b交换
a %= m;
temp_ab = a;
a = m;
m = temp_ab;
//实现系数交换
r0 -= n * r1, b0 -= n * b1;
temp_r = r0, temp_b = b0;
r0 = r1, b0 = b1;
r1 = temp_r, b1 = temp_b;
}
if (b0 >= res)
{
cout << "该乘法逆元无解!" << endl;
return -1;
}
if (r_or_b == 0)
{
if (r0 < 0)//小于0的话就加上m
{
return r0+res;
}
return r0;
}
if (r_or_b == 1)//小于0的话就加上m
{
if (b0 < 0)
{
return b0 + res;
}
return b0;
}
}
//解同余方程
int solve_CE(int a, int b, int m)
{
int x, ans = 1;//ans默认1,表示有解
if (MIM(a, m) == -1)
{
ans = 0;
cout << "该同余方程无解" << endl;
}
else x = b * MIM(a, m);
return (ans == 1) ? x : -1;
}
int main()
{
/*int a, b, m;
cout << "请依次输入a,b,m:" << endl;
cin >> a >> b >> m;
if (solve_CE(a, b, m) == -1)cout << endl;
else {
cout << "该方程的一个解为:" << solve_CE(a, b, m) << endl;
}*/
int a, m;
cin >> a >> m;
cout << MIM(a, m) << endl;
return 0;
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
//模指数运算
int mod_exp(int x, int y, int p) {
int res = 1;
while (y > 0)
{
if ((y & 1) == 1)res = (res * x) % p;
y = y / 2;
x = (x * x) % p;
}
return res;
}
int main()
{
int x, y, p;
cout << "请依次输入x,y,p:" << endl;
cin >> x>> y>> p;
cout <<"结果为:"<< mod_exp(x, y, p) << endl;
return 0;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
解:
a
2020
m
o
d
p
=
a
(
23
−
1
)
∗
91
+
18
m
o
d
p
a^{2020}modp=a^{(23-1)*91+18}modp
a2020modp=a(23−1)∗91+18modp
故有:
5
2020
m
o
d
23
=
5
(
23
−
1
)
∗
91
+
18
m
o
d
23
=
5
18
m
o
d
23
=
6
5^{2020}mod23=5^{(23-1)*91+18}mod23=5^{18}mod23=6
52020mod23=5(23−1)∗91+18mod23=518mod23=6
4、使用欧拉定理计算2^{100000} mod 55。
解:由于
ϕ
\phi
ϕ(55)=40,由欧拉定理有:
2
ϕ
(
n
)
≡
1
(
m
o
d
55
)
2^{\phi (n)}\equiv 1 \pmod {55}
2ϕ(n)≡1(mod55)
所以:
2
100000
m
o
d
55
=
2
40
∗
2500
m
o
d
55
=
1
2^{100000} mod 55=2^{40*2500}mod55=1
2100000mod55=240∗2500mod55=1
5、手动计算7^{1000}的最后两个数位等于什么?
解:计算
7
1000
7^{1000}
71000最后两位数莫过于求
7
1000
m
o
d
100
7^{1000}mod100
71000mod100,有欧拉定理得:
ϕ
(
100
)
=
40
\phi(100)=40
ϕ(100)=40,故有:
7
40
≡
1
(
m
o
d
100
)
7^{40}\equiv 1 \pmod {100}
740≡1(mod100)
所以:
7
1000
m
o
d
100
=
7
40
∗
25
m
o
d
100
=
1
7^{1000}mod100=7^{40*25}mod100=1
71000mod100=740∗25mod100=1
故最后两位数位为:01