CINTA hw2

发布时间 2023-10-18 03:53:13作者: Sophiawxr
1、写一个模指数运算函数Mod_Exp,输入a、b和m,输出a^b mod m,即a的b次方模m。
点击查看代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

// 模运算函数
int Mod(int num,int m) 
{
    return (num%m+m)%m;
}

// 平方并求模
int SquareMod(int a,int m) 
{
    a = (a*a)%m;
    return Mod(a,m);
}

// 右移除首位
string RShift(string s) 
{
    return s.substr(1);
}

// 快速幂取模
int ModExp(int a, int b, int m) 
{
    int res = 1;
    while (b!= 0) 
	{
        if (b&1) 
		{
            res = Mod(res*a,m);
        }
        a = SquareMod(a,m);
        b >>= 1;
    }
    return res;
}

int main() 
{
    int a, b, m;

    cout << "Enter a,b and m: ";
    cin >> a >> b >> m;

    int result = ModExp(a,b,m);
    cout << "Result: " << result << endl;
	system("pause");
    return 0;
}


运行结果
image
image

2、写一个求乘法逆元的函数Mul_Inverse,输入a和m,求a模m的乘法逆元。提示,要求只输出正整数。
点击查看代码
#include <iostream>
using namespace std;

int egcd(int a, int b, int& x, int& y) 
{

	if(b==0) 
		{
			x=1;
			y=0;
			return a;
		}

	int x1,y1;
	int g=egcd(b,a%b,x1,y1);

	x = y1;
	y = x1-(a/b)*y1;

	return g;
}
int Mul_Inverse(int a,int m) 
{
	//egcd递归计算乘法逆元 
	int x,y;
	int g = egcd(a,m,x,y);
  
	//若a和m不互质,则逆元不存在
	if(g!=1) return -1; 
  
	//使x为正整数
	int res=(x%m+m)%m;

	return res;
}

int main() 
{
	int a, m;
	cin >> a >> m;

	int result = Mul_Inverse(a, m);

	if(result == -1) {
		cout << "无乘法逆元";
  }
	else {
		cout << "乘法逆元为:" << result<<endl; 
  }
	system("pause");
	return 0;
}

运行结果
image

设 p = 23 和 a = 3,使用费尔马小定理计算 a 2019 mod p?

3^2019 mod 23 =3^(91 * 22+17) mod 23=3^17 mod 23=16

请证明 13 整除 2 70 + 370(提示:这是一道名为证明题的计算题。)

270mod 13=21215+10mod 13=10
370mod13=312
5+10mod 13=3
余数相加为13,故二者和可整除13.

使用欧拉定理计算2100000 mod 55

2与55互质,根据欧拉定理,有:254 ≡ 1 (mod 55)
2100000 = 2541841+36 ≡ 11841 236(mod 55) ≡ 236 (mod 55)
236 = 29*4 * 20 ≡ 1 (mod 55)
所以,2100000 mod 55 = 1

手动计算71000的最后两个数位

法一:
求71000最后两个数位
φ(100)=φ(22)φ(52)=40
71000≡(74025≡1(mod 100)
最后两个数位为01。

法二:一些野路子(
71=7
72=49
73=343
74=2401
······
后两位为07,49,43,01循环,1000可以被4整除,故计算后两位结果为01