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

1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。

//实现求乘法逆元的函数
#include <iostream>
using namespace std;
int multi_inverse(int a, int m);

int main()
{
	int a, m;
	cin >> a >> m;
	int Multi_Inverse = multi_inverse(a, m);
	if (Multi_Inverse == -1)
		cout << "无解" << endl;
	else
		cout << "逆元是" << Multi_Inverse;
}

//求a模m的乘法逆元
int multi_inverse(int a, int m)
{
	int s, t;
	//gcd(a,m)!=1 无解
	if (egcd(a, m, &s, &t) != 1)
	{
		return -1;
	}

	//gcd(a,m)=1  此时有解,且逆元取决于a前面的系数
	else
	{
		//又基于egcd函数会将大的输入数与s系数配对,小的输入数反之则与t配对,下面进行对a和m判断大小

		if (a > m) //此时s即是a前面的系数
		{
			if (s < 0)
				s = s + m;//根据逆元定义:负数要转化为正数
			return s;
		}
		else       //对此时t即是a前面的系数
		{
			if (t < 0)
				t = t + m;
			return t;
		}
	}
}

2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。

#include<iostream>
#include<cmath> 
using namespace std;
enum evenodd{even,odd};
evenodd Y; 
//input x、y、m		
//return (x^y)mod m 
int ModulusIndex(int x,int y,int m)
{
	if(y==0) return 1; 
	int next=ModulusIndex(x,y/2,m);
	y%2==1?Y=odd:Y=even;		//判断y为偶数还是奇数
	if(Y==even) return (next*next)%m;
	else return (x*next*next)%m; 
}

int main()
{
	int x=0,y=0,m=0;
	int YorN=0;			//again or exit
	do
	{ 
		cout<<"请先后输入x、y、m:((x^y)mod m )";
		cin>>x>>y>>m;
		cout<<ModulusIndex(x,y,m);
		cout<<"\nagian input 1,exit input 0:";
		cin>>YorN;
	}while(YorN==1);
	return 0;
}

3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
      23为素数,由费尔马小定理有 a^{22}\equiv 1 mod 23
      \therefore 5^{2020}\equiv5^{91*22+18}\equiv5^{18} mod 23 =6

4、使用欧拉定理计算2^{100000} mod 55。
      gcd(2,55)=1,由欧拉定理
      Φ(55)=40,2^{\Phi (55)}\equiv2^{40}\equiv1 mod 55
     2^{100000}\equiv2^{40*2500}\equiv1 mod 55

5、手动计算7^{1000}的最后两个数位等于什么?
       转化为求 7^{1000} mod 100
       gcd(7,100)=1, Φ(100)=40
       由欧拉定理  7^{40} mod 100 = 1  7^{1000}\equiv 7^{25*40}\equiv 1 mod 100
       最后两位数位等于 01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值