数论初步

中国剩余定理

内容:
对于同余方程组\(x\equiv a_i\pmod{m_i}\) \((i = 1...n)\),若\(m_i\)两两互质,则\(x\)\(mod M\)下有唯一解.

这里\(M = m_1m_2...m_n\).

构造解的方法:

\(M = m_1m_2...m_n\),\(M_i = M / m_i\).

显然\((M_i,m_i) = 1\),所以\(M_i\)关于模\(m_i\)的逆元存在.把这个逆元设为\(t_i\).

于是有:\(M_it_i\equiv 1\pmod{m_i}\),\(M_it_i\equiv 0\pmod{m_j} \ (j\neq i)\)

进一步:\(a_iM_it_i\equiv a_i\pmod{m_i}\),\(a_iM_it_i\equiv 0\pmod{m_j} \ (j\neq i)\)

因此解为:\(x\equiv a_1M_1t_1 + a_2M_2t_2+...+a_nM_nt_n\pmod{M}\)

代码实现:

int CRT(const int a[],const int m[],int n)
{
	int M = 1,ret = 0;
	for (int i = 1;i <= n;i++)
		M *= m[i];
	for (int i = 1;i <= n;i++)
	{
		int Mi = M / m[i];
		int ti = inv(Mi,m[i]);
		ret = (ret + a[i] * Mi * ti) % M;
	}
	return ret;//注意有的数乘起来可能超过了int范围,需要强制转换long long 
}

欧拉函数

\(\phi(n)\)定义为\([1,n]\)中与\(n\)互质的数的个数。

推论:若\(p\)为质数,则\(\phi(p) = p - 1\).


欧拉函数是积性函数:

\((a,b) = 1\),则\(\phi(ab) = \phi(a)\phi(b)\).


定理:

\(n = p^k\)\(p\)为质数,则\(phi(n) = n(1 - \large\frac{1}{p})\)

证明:

\((x,p^k)> 1\),则有\(p|x\)成立。

\(x\)共有\(\large\frac{n}{p}\)个,因此\(\phi(n) = n - \large\frac{n}{p} = n(1 - \frac{1}{p})\)


定理:

\(n\)所有不同的质因子为\(p_1p_2...p_k\),则\(\phi(n) = n(1 - \frac{1}{p_1})(1 - \large\frac{1}{p_2})...(1 - \frac{1}{p_k})\)

证明:\(\phi\)是积性函数。把\(n\)拆成\({p_i}^{a_i}\)的乘积即可得证。

由此得到一种基于质因数分解求欧拉函数的算法。

代码实现:

int phi(int x)
{
	int ret = x;
	for (int i = 2;i * i <= x;i++)
		if (x % i == 0)
		{
			while (x % i == 0)
				x /= i;
			ret = ret / i * (i - 1);
		}
	if (x > 1)
		ret = ret / x * (x - 1);
	return ret;
}

欧拉定理的应用


用欧拉定理求逆元:\(a*{a}^{\phi(n) - 1} \equiv 1\pmod{n}\)

特别地,若\(n\)是质数:\(a*{a}^{n -2}\equiv 1\pmod{n}\)

代码用快速幂实现:

int powermod(int a,int b,int Mod)
{
	int ret = 1;
	while (b)
	{
		if (b & 1)
			ret = (long long)ret * a % Mod;
		a = (long long)a * a % Mod;
		b >>= 1;
	}
	return ret;
}


\(a^b\mod\ m\)时,用欧拉定理缩小指数\(b\)


欧拉定理的扩展

咕着

posted @ 2021-11-10 22:50  Carlotta24  阅读(59)  评论(0)    收藏  举报