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,且523−1mod23=1
因为2020=91*22+18,且5^{23-1}mod23=1
因为2020=91∗22+18,且523−1mod23=1
所以52020mod23=591∗(23−1)+18mod23=518mod23=((516mod23)∗(52mod23))mod23=3∗2mod23=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
由gcd算法求满足gcd(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(mod55)即240≡1(mod55) 由欧拉定理得2^{\phi(55)}\equiv1(mod55)即2^{40}\equiv1(mod55) 由欧拉定理得2ϕ(55)≡1(mod55)即240≡1(mod55)
所以2100000mod55=240∗2500mod55=1 所以2^{100000} mod 55=2^{40*2500}mod55=1 所以2100000mod55=240∗2500mod55=1
5、手动计算7^{1000}的最后两个数位等于什么?
由题意可得求71000mod100
由题意可得求7^{1000}mod100
由题意可得求71000mod100
由gcd算法求满足gcd(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(mod100)即740≡1(mod55) 由欧拉定理得7^{\phi(100)}\equiv1(mod100)即7^{40}\equiv1(mod55) 由欧拉定理得7ϕ(100)≡1(mod100)即740≡1(mod55)
所以71000mod100=740∗25mod100=1 所以7^{1000} mod 100=7^{40*25}mod100=1 所以71000mod100=740∗25mod100=1
所以最后两位数是01