数论初步
中国剩余定理
内容:
对于同余方程组\(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\)
欧拉定理的扩展
咕着

浙公网安备 33010602011771号