[学习笔记]数论

扩展欧几里得

求二元一次不定方程\(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)\)的因数.

例题

yayamao的神题

原根

原根:\(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))\).

原文地址:https://www.cnblogs.com/AireenYe/p/Math.html