扩展欧拉定理

文章介绍了如何使用扩展欧拉定理和编程技巧(如欧拉函数计算、快速幂)来求解给定的大数a的b次方对模m的余数问题,包括处理大数输入和计算过程的优化。
摘要由CSDN通过智能技术生成

a^{b}\equiv \left\{\begin{matrix}a^{b}\left ( b<\psi \left ( m \right ) \right ) \\a^{bmod\psi\left ( m \right ) +\psi\left ( m \right ) }(b>=\psi\left ( m \right )) \end{matrix}\right.

为了求a^bmodm的余数,我们可以利用扩展欧拉定理给出的同余方程,转化成一个好求的式子,首先我们要能够解出欧拉函数.欧拉函数讲解可以看看这篇欧拉函数最全总结-CSDN博客(原理我不懂,只会用)

下面给出代码

using i64 = long long;
int phi(int n) {
	int res = n;
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			while (n % i == 0) n /= i;
			res = res / i * (i - 1);
		}
	}
	if (n > 1) res = res / n * (n - 1);
	return res;
}

由于b是一个很大的数,我们需要判断b是否大于mod,并处理bmod\psi\left ( m \right )

inline int read(int mod)//改进快读,让他边读边输入
{
	//g用来判断b与phi(m)的大小.
	int x = 0;
	bool g = false;
	char c = getchar();
	while (c < '0' || c>'9') c = getchar();
	while (c >= '0' && c <= '9')
	{
		//等价于x*8+x*2+c-'0'=x*10+c-'0'
		x = (x << 3) + (x << 1) + (c ^ '0');
		if (x >= mod) x %= mod, g = true;
		c = getchar();
	}
	if (g) return (x + mod);
	else return x;
}

此外计算乘方我们还需要一个函数快速幂,p是模数

这是快速幂的讲解:快速幂和矩阵快速幂-CSDN博客

int a, mod;
char b[20000005];
int power(int a, i64 b, int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}

最后,计算即可

int p;
int main()
{
    //读取a和mod
	scanf("%d%d", &a, &mod);
    //求解欧拉函数
	i64 p = phi(mod);
    //读取并处理b
	i64 cishu = read(p);
    //计算
	i64 s = power(a, cishu,mod);
    //打印
	printf("%d\n", s);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值