数论基础:扩展欧几里得和乘法逆元,欧拉函数
扩展欧几里得算法(求ax+by=gcd(a,b)的一组特解)
欧几里得算法(求最大公约数)
gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
扩展欧几里得
exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return;
}
斐蜀定理:一定存在ax+by=gcd(a,b)的解
$gcd(a,b)|a => gcd(a,b)|ax $ ----------(1)
$gcd(a,b)|b => gcd(a,b)|by $ ----------(2)
\((1)(2) => gcd(a,b)|ax+by =>ax+by=gcd(a,b)\) 两边同除\(gcd(a,b)\)得
\(a_{1}\) \(x_{1}\) + \(b_{1}\) \(y_{1}\) =1 ( \(a_{1}\) , \(b_{1}\) 互质)
\(=>exgcd()\)
扩展欧几里得
求\(ax+by=gcd(a,b)\) 的一组特解
若\(b=0\)令\(x=1,y=0\)
否则先求 \(b,a%b\)的解
求得\(b x_{1} +(a\%b)y_{1} =gcd(b,a\%b)=gcd(a,b)\)
\(bx_{1}+[a-\lfloor a/b \rfloor*b] * y_{1}\)
\(ay_{1}+b(x_{1}-\lfloor a/b \rfloor*y_{1})\)
与ax+by对比,发现只要令\(x=y_{1} y=x_{1}-\lfloor a/b \rfloor*y_{1}\)就能得到特解因此,只要一直递归就能求解
通解(没有遗漏)
\(x= x_{0} +b/gcd(a,b)\)
\(y= y_{0} -a/gcd(a,b)\)
x,y同时变化,带入原式可发现ax+by不变
证明挖坑优秀的证明
upd: 之前一直忽略的点,关于通解,实际上对于\(ax + by = c\)都可以用同样的通解式子
乘法逆元
exgcd
求解逆元\(a\equiv 1(mod\;b)\)相当与解不定方程\(ax+by=1\)
\(a,b\)如果互质,\(exgcd()\)求解即可
费马小定理:
定理: 若p为素数,则有
$ a^{p-1} ≡1(mod p)$
$ a^{p-2} ∗a≡1(mod p)$
\(a^{p-2}\)就是\(a\)在\(mod\) \(p\)意义下的逆元
递推求逆元
upd: 记不住怎么办,有个好记的方法,类似求阶乘逆元的方法,处理前缀积,然后费马求出总的逆元再乘回去,实际上这种做法可扩展性非常强
原理:p是模数,i是待求的逆元,我们求的是\(i^{-1}\)在\(mod\) \(p\)意义下的值
\(p=k∗i+r\)令 \(r < i\),则\(k=p/i,r=p\%i\)
\(k∗i+r≡0(mod\;p)\)
\(k∗ r^{-1}+ i^{-1}≡0(mod \;p)\)(两边同乘 $ r^{-1}$ $ i^{-1}$ )
$ i^{-1}≡−k∗ r^{-1}(mod;p)$
$ i^{-1}≡−p/i∗inv[p\%i](mod p)$
所以\(inv[i]=-(p/i)*inv[ p\%i ]\)
边界\(inv[1]=1\)
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=(p-p/i)*inv[p%i]%p;
//(p-p/i)处理了负数问题 因为p%p=0所以对结果无影响
递推求阶乘逆元
因为
\(\frac{1}{(n+1)!} \times (n+1) = \frac{1}{n!}\)
所以处理出\(inv[n!]\)再逆推\(inv[(n-1)!] inv[(n-2)!]\)........
欧拉函数
定义
\(\varphi(n)\)表示\(\sum_{i=1}^{n-1}gcd(i,n)==1?1:0\)
一些性质
-
\(n\)为质数时有\(\varphi(n)=n-1\)
-
\(\varphi(n)\)为积性函数,但不是完全积性函数
即,当\(gcd(a.b)=1\)时有\(\varphi(a*b)=\varphi(a)\times\varphi(b)\)
- \(n=\sum_{d|n}\varphi(d)\)
证明:
若\(gcd(x,n)=y\),那么\(gcd(\frac{x}{y},\frac{n}{y})=1(x<n)\)
设\(f_i\)表示\(gcd(x,n)=i\)的数的个数,那么有\(n=\sum_{i=1}^nf_i\)
有\(f_i=\varphi(\frac{n}{i})\)
那么\(n=\sum_{i=1}^nf_i=\sum_{d|n}\varphi(\frac{n}{d})\)
\(d\)与\(\frac{n}{d}\)具有对称性,所以可以化为\(n=\sum_{d|n}\varphi(d)\)
- \(p\)为质数,\(n=p^k\),那么\(\varphi(n)=p^k-p^{k-1}\)
因为\(1-p^k\)除了\(p,2p,3p.....p^{k-1}p\)共\(p^{k-1}\)个\(p\)的倍数外都与\(p^k\)互质
所以\(\varphi(p^k)=p^k-p^{k-1}=p^{k-1}\times(p-1)\)
- 由唯一分解定理,设\(n = \prod_{i=1}^{s}p_i^{k_i}\) ,其中 \(p_i\)是质数,有 \(\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}\)
证明:
因为积性
\(\begin{aligned} \varphi(n) &= \prod_{i=1}^{s} \varphi(p_i^{k_i})\end{aligned}\)
因为上一个性质
\(\begin{aligned} &= \prod_{i=1}^{s} (p_i-1)\times {p_i}^{k_i-1}\end{aligned}\)
整理
\(\begin{aligned}&=\prod_{i=1}^{s} {p_i}^{k_i} \times(1 - \frac{1}{p_i})\end{aligned}\)
\(\begin{aligned}&=n~ \prod_{i=1}^{s} (1- \frac{1}{p_i}) \end{aligned}\)
求值
求单个欧拉函数使用\(\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}\),对\(n\)进行质因数分解即可
求\(1-n\)的欧拉函数,使用线性筛
对于质数,显然\(\varphi(n)=n-1\)
对于合数\(n=prime[j]\times i\),分两种情况,就是\(i\%prime[j]\)是否为0
-
\(i\% prime[j]!=0\) 那么 \(i\)与\(prime[j]\)互质\(phi[n]=phi[i]*phi[prime[j]]\)
-
\(i\%prime[j]=0\)那么\(i\)中有\(n\)的所有因子
\(phi[n] = n \times \prod_{k = 1}^s{\frac{p_k - 1}{p_k}} = prime[j] \times i \times \prod_{k = 1}^s{\frac{p_k - 1}{p_k}} = prime[j] \times phi[i]\)
欧拉定理
若\(gcd(a,m)=1\),则\(a^{\varphi(m)} \equiv 1 \pmod{m}\)
特别的,当\(m\)为质数时,就是费马小定理
证明:
设\(r_1, r_2, \cdots, r_{\varphi(m)}\)为模\(m\)意义下的一个简化剩余系,则\(ar_1, ar_2, \cdots, ar_{\varphi(m)}\)也为模 意义下的一个简化剩余系。所以\(r_1r_2 \cdots r_{\varphi(m)} \equiv ar_1 \cdot ar_2 \cdots ar_{\varphi(m)} \equiv a^{\varphi(m)}r_1r_2 \cdots r_{\varphi(m)} \pmod{m}\),可约去\(r_1r_2 \cdots r_{\varphi(m)}\),即得\(a^{\varphi(m)} \equiv 1 \pmod{m}\)。
扩展欧拉定理
\(a^b \equiv \begin{cases} a^{b\bmod\varphi(p)},\,&\gcd(a,\,p)=1\\ a^b,&\gcd(a,\,p)\ne1,\,b<\varphi(p)\\ a^{b\bmod\varphi(p)+\varphi(p)},&\gcd(a,\,p)\ne1,\,b\ge\varphi(p) \end{cases} \pmod p\)
证明,转一下大佬的博客