[学习笔记]数论
扩展欧几里得
求二元一次不定方程\(ax+by=gcd(a,b)\)的一组解。
当\(b=0\)时,有一组解\(x=1,y=0\);
当\(b>0\)时,因为\(gcd(a,b)=gcd(b,a\;mod\;b)\),
所以设\(x',y'\)满足\(bx'+(a\;mod\;b)y'=gcd(a,b)\),
则\(bx'+(a-a/b\;\times\;b)y'=gcd(a,b)\),
整理得\(ay'+b(x'-a/b\;\times\;y')=gcd(a,b)\)。
所以\(x=y',y=x'-a/b\;\times\;y'\)。
就可以在求\(gcd\)的过程中得到一组解。
inline int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;y=0;return a;
}
else{
int ret=exgcd(b,a%b,y,x);
y-=a/b*x;return ret;
}
}
BSGS
求最小的\(x\)使得\(a^{x}\;\equiv\;b(mod\;p),p\)为质数。
令\(s=\sqrt{p}\),则\(x=y\;\times\;s+r\;(0\;\leq\;r<s)\),即\(a^{x}=a^{y\;\times\;s}\;\times\;a^{r}\)。
将所有的\(a^{r}\)用\(map\)存起来,从小到大枚举\(y\),直到\(b/a^{y\;\times\;s}\)是某个\(a^{r}\),此时答案为\(y\;\times\;s+r\)。
typedef long long ll;
map<ll,ll> m;
inline ll po(ll x,ll k,ll p){
ll ret=1;
while(k){
if(k&1) ret=ret*x%p;
x=x*x%p;k>>=1;
}
return ret;
}
inline ll bsgs(ll a,ll b,ll p){
if(gcd(a,p)!=1)
if(b) return -1;
else return 1;
ll s=sqrt(p),k=1,x=1,y;
while(s*s<=p) ++s;
for(ll i=0;i<s;++i){
if(!m[k]) m[k]=i;
k=k*a%p;
}
for(ll i=0;i<s;++i){
y=b*po(x,p-2,p)%p;
if(m.count(y))
return i*s+m[y];
x=x*k%p;
}
return -1;
}
中国剩余定理
求方程组\(x\;\equiv\;a_i(mod\;m_i)(i\in[1,n])\)的解\(x\),其中\(m_i\)两两互质.
一般版本
令\(M_i=\prod_{j\not=i}m_j\),则\((M_i,m_i)=1\),所以存在\(M_ix_i+m_iy_i=1\).
(\(x_i\)为\(M_i\)在模\(m_i\)意义下的逆元)
令\(e_i=M_ix_i\),则\(e_i\equiv\begin{cases}0(mod\;m_j)&j\not=i\\1(mod\;m_j)&j=i\\\end{cases}\)
所以\(\sum_{i=1}^{n}e_ia_i\)是方程的一个解.
在\([0,\prod_{i=1}^{n}m_i)\)中只有唯一解,所以将求出的解对\(\prod_{i=1}^{n}m_i\)取模即可.
闫神
记\(q_{i,j}\)表示\(m_i\)在模\(m_j\)意义下的逆元.
\(x\equiv\sum_{i=1}^{n}(a_i\;\times\;\prod_{j=1}^{n}(m_j\;\times\;q_{j,i}))(mod\;\prod_{i=1}^{n}m_i)\)
不互质
若要合并\(x\;\equiv\;a_i(mod\;m_i),x\;\equiv\;a_j(mod\;m_j)\),
设\(x=k_im_i+a_i=k_jm_j+a_j\),则\(k_im_i-k_jm_j=a_j-a_i\).
用\(exgcd\)求出\(k_i\)(注意无解的情况),把两个方程合并为\(x\;\equiv\;k_im_i+a_i(mod\;lcm(m_i,m_j))\).
欧拉定理
若\(a,p\;\in\;N^{+},(a,p)=1\),则\(a^{\phi(p)}\;\equiv\;1(mod\;p)\).
阶
使得\(a^x\;\equiv\;1(mod\;p)\)的最小正整数\(x\)称为\(a\)模\(p\)的阶,记为\(ord_pa\).
实现
找一个数的阶可以暴力求解,原根为\(\phi(p)\)的因数.
例题
原根
原根:\(ord_pa=\phi(p)\)时,称\(a\)是\(p\)的原根.
\(a^1,a^2,...,a^{\phi(p)}\)在模p意义下互不相同.
如果\(p\)有原根,那么原根个数为\(\phi(phi(p))\).
lucas定理
求\(c_n^m\;mod\;p\).
将\(n,m\)写成\(p\)进制:\(n=a_0p^0\;\times\;a_1p^1\;\times\;...\;\times\;a_kp^k,m=b_0p^0\;\times\;b_1p^1\;\times\;...\;\times\;b_kp^k.\)
则\(C_{n}^{m}\;\equiv\;\prod\;C_{a_i}^{b_i}(mod\;p)\).
所以\(C_n^m\;\equiv\;C_{n\;mod\;p}^{m\;mod\;p}\;\times\;C_{n/p}^{m/p}\)
斐波那契数列
\(fib(n+m)=fib(n+1)\;\times\;fib(m)+fib(n)\;\times\;fib(m-1).\)
\(gcd(fib(i),fib(j))=fib(gcd(i,j))\).