CINTA作业三
1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
#include<iostream>
using namespace std;
int gcd(int x, int y)
{
if (x < y)swap(x, y);
int tem = 0;
while (y != 0)
{
tem = x % y;
x = y;
y = tem;
}
return x;
}
int get_multiplicative_inverse(int a, int m)//求乘法逆元
{
if (gcd(a, m) != 1)
{
cout << "无解" << endl;
return -1;
}
int x = 1;
while ((a * x) % m != 1)x++;
return x;
}
int solve_equation(int a,int b,int m)//求同余方程,只取最小正整数解
{
if (gcd(a, m) != 1)
{
cout << "无解" << endl;
return -1;
}
int x = b * get_multiplicative_inverse(a, m) % m;
return x;
}
int main()
{
cout << solve_equation(3, 2, 11);
return 0;
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
#include<iostream>
using namespace std;
int rec_mod_exp(int x, int y, int m)
{
if (y == 0) return 1;
int z = rec_mod_exp(x, y / 2, m);
if ((y % 2) == 0)return z * z % m;
else return x * z * z % m;
}
int main()
{
cout << rec_mod_exp(2, 16, 11);
return 0;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
因
为
2020
=
91
∗
22
+
18
,
且
5
23
−
1
m
o
d
23
=
1
因为2020=91*22+18,且5^{23-1}mod23=1
因为2020=91∗22+18,且523−1mod23=1
所 以 5 2020 m o d 23 = 5 91 ∗ ( 23 − 1 ) + 18 m o d 23 = 5 18 m o d 23 = ( ( 5 16 m o d 23 ) ∗ ( 5 2 m o d 23 ) ) m o d 23 = 3 ∗ 2 m o d 23 = 6 所以5^{2020}mod23=5^{91*(23-1)+18}mod23=5^{18}mod23=((5^{16}mod23)*(5^{2}mod23))mod23=3*2mod23=6 所以52020mod23=591∗(23−1)+18mod23=518mod23=((516mod23)∗(52mod23))mod23=3∗2mod23=6
4、使用欧拉定理计算2^{100000} mod 55
由
g
c
d
算
法
求
满
足
g
c
d
(
i
,
55
)
=
1
且
小
于
55
的
i
的
个
数
,
可
得
ϕ
(
55
)
=
40
由gcd算法求满足gcd(i,55)=1 且小于55的i的个数,可得\phi(55)=40
由gcd算法求满足gcd(i,55)=1且小于55的i的个数,可得ϕ(55)=40
由 欧 拉 定 理 得 2 ϕ ( 55 ) ≡ 1 ( m o d 55 ) 即 2 40 ≡ 1 ( m o d 55 ) 由欧拉定理得2^{\phi(55)}\equiv1(mod55)即2^{40}\equiv1(mod55) 由欧拉定理得2ϕ(55)≡1(mod55)即240≡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
m
o
d
100
由题意可得求7^{1000}mod100
由题意可得求71000mod100
由 g c d 算 法 求 满 足 g c d ( i , 100 ) = 1 且 小 于 100 的 i 的 个 数 , 可 得 ϕ ( 100 ) = 40 由gcd算法求满足gcd(i,100)=1 且小于100的i的个数,可得\phi(100)=40 由gcd算法求满足gcd(i,100)=1且小于100的i的个数,可得ϕ(100)=40
由 欧 拉 定 理 得 7 ϕ ( 100 ) ≡ 1 ( m o d 100 ) 即 7 40 ≡ 1 ( m o d 55 ) 由欧拉定理得7^{\phi(100)}\equiv1(mod100)即7^{40}\equiv1(mod55) 由欧拉定理得7ϕ(100)≡1(mod100)即740≡1(mod55)
所 以 7 1000 m o d 100 = 7 40 ∗ 25 m o d 100 = 1 所以7^{1000} mod 100=7^{40*25}mod100=1 所以71000mod100=740∗25mod100=1
所以最后两位数是01