CINTA作业三:同余、模指数、费尔马小定理、欧拉定理

1.求乘法逆元函数以及求解同余方程函数

int* my_egcd(int a, int b)
{
	int r1 = 1, r2 = 0, s1 = 0, s2 = 1;
	int c[3];//存放r,s,d
	for (int p = 0, temp = 0; a % b != 0; )
	{
		p = a / b;
		temp = r2;
		r2 = r1 - p * r2;
		r1 = temp;
		temp = s2;
		s2 = s1 - p * s2;
		s1 = temp;
		temp = a;
		a = b;
		b = temp % b;
	}
	c[0] = r2;
	c[1] = s2;
	c[2] = b;
	return c;
}
int fun1(int a, int m)//求乘法逆元
{
	int* egcd = my_egcd(a, m);//接收EGCD算法返回的r,s,d
	if (egcd[2] != 1)return 0;
	return egcd[0];
}
int fun2(int a, int b,int m)//求解同余方程
{
	int A = fun1(a,m);//a模m的乘法逆元
	return A * b;
}
int main()
{
	int a, b, m;
	cin >> a >> b >> m;
	int result = fun2(a, b, m);
	if (result)cout << "x mod " << m << " = " << result << " mod " << m << endl;
	else cout << "无解" << endl;
	return 0;
}

2.模指数运算函数

int exp_mod(int x,int y,int m)
{
	if (y == 0)return 1;
	int z = exp_mod(x, y / 2, m);
	if (y % 2 == 0)return z * z % m;
	else return x * z * z % m;
}

3.用费尔马小定理计算52020mod23
解:因为52020=522*91+18,所以52020 ≡ \equiv 518 (mod 23),
同时,用第二题模指数运算函数求出了518 (mod 23)=6
因此答案为6

4.用欧拉定理计算2100000mod55
解:因为2与55互素,且均为正整数,则根据欧拉定理得
2 ∅ \emptyset (55) ≡ \equiv 1 (mod 55),又因为55的因子只有{1,5,11,55},而且gcd(1,55)=1,
且[1,55)内5或者11的倍数共有14个
所以可知 ∅ \emptyset (55)=40,同时100000=40*2500
所以可得:
2100000 ≡ \equiv 1 mod 55
所以答案为1

5.计算71000的最后两位数
解:取模100即可得到最后两位数,因此题目等同于求71000mod100
利用欧拉定理得7 ∅ \emptyset (100) ≡ \equiv 1 (mod 100)
又通过gcd函数做排除法得到 ∅ \emptyset (100)=40,而且1000=40*25
所以71000mod 100 ≡ \equiv 1 mod 100
答案为01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值