CINTA作业三

这篇博客介绍了如何求解模幂运算和同余方程。通过实现模指数运算函数以及利用欧拉定理和费尔马小定理,可以高效地计算大的指数模运算。同时,还探讨了求解乘法逆元和同余方程的方法,为解决此类问题提供了实用的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=9122+185231mod23=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(231)+18mod23=518mod23=((516mod23)(52mod23))mod23=32mod23=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 gcdgcd(i,55)=155iϕ(55)=40

由欧拉定理得2ϕ(55)≡1(mod55)即240≡1(mod55) 由欧拉定理得2^{\phi(55)}\equiv1(mod55)即2^{40}\equiv1(mod55) 2ϕ(55)1(mod55)2401(mod55)

所以2100000mod55=240∗2500mod55=1 所以2^{100000} mod 55=2^{40*2500}mod55=1 2100000mod55=2402500mod55=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 gcdgcd(i,100)=1100iϕ(100)=40

由欧拉定理得7ϕ(100)≡1(mod100)即740≡1(mod55) 由欧拉定理得7^{\phi(100)}\equiv1(mod100)即7^{40}\equiv1(mod55) 7ϕ(100)1(mod100)7401(mod55)

所以71000mod100=740∗25mod100=1 所以7^{1000} mod 100=7^{40*25}mod100=1 71000mod100=74025mod100=1

所以最后两位数是01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值