zoukankan      html  css  js  c++  java
  • [学习笔记]数论

    扩展欧几里得

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

  • 相关阅读:
    JAVA中线程同步的方法(4种)汇总
    java
    指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。(解决问题总结)
    无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转换为类型“System.Collections.Generic.IList`1
    foreach---集合已修改;可能无法执行枚举操作。
    WPF_View中控件使用单例ViewModel
    判断s2是否能够被通过s1做循环移位(rotate)得到的字符串是否包含
    多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')
    异步对象(XMLHttpRequest)的帮助脚本
    在vs2010使用EF出现CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/AireenYe/p/Math.html
Copyright © 2011-2022 走看看