【总结】皇冠上的明珠——初等数论初步

皇冠上的明珠——初等数论初步

很杂,因为学得不多

 

[TOC]

 

整除的性质

  1. 若a|b\(且\)a|c\(\Leftrightarrow\)对于任意\(x,y \in Z\),有\(a|(bx+cy)\)证明如下:

    由于\(a|b\)\(a|c\),不妨设\(b=ta,c=ia\),则\(bx+cy=a(tx+iy)\)得证。

  2. \(\exists x,y\in Z\)使得\(ax+by=1\),且\(a|n,b|n\),则有\(ab|n\)证明如下:

    \(a|n\)\(a|n\Leftrightarrow ab|bn,ab|an\)

    由一可得:

    \(ab|(bnx+any)\)

    \(LHS=n(bx+ay)=n \times 1=n\)

    \(ab|LHS,LHS=n\)

    \(ab|n\)

    证毕

  3. \(b=qd+c\)那么\(d|b\)的充要条件是\(d|c\),证明如下:

    \(d|b \Leftrightarrow dq|bc\)

    其中\(b=dq+c\)

    所以\(b\not| \ d\)\(a\not| \ q\)

    所以\(d|c\)

  4. \(ax+by=c\)该不定方程有整数解的充分必要条件是\((a,b)\)也就是\(gcd(a,b))|c\)证明如下:

    由1可得,

    因为\((a,b)|a\)\((a,b)|b\)

    所以对于\(x,y \in Z\)

    存在\((a,b)|ax+by\)

    \(ax+by=c\)

    所以\((a,b)|c\)证毕

费马小定理/欧拉定理

\[a^{\phi(n) } \equiv 1 \mod n \]

证明如下:

对于\(n\)的简化剩余系\([n]\),我们有

\[\forall k \in Z,k\not=0 ,a \not \equiv b,a,b \in[a]\rightarrow ka\not\equiv kb \]

证明如下:由简化剩余系的定义可以知道\((a,n)=1,(b,n)=1\)\((2)\)显然成立

构造恒等式,结合\((2)\)可得\(\prod_{i=1}^{\phi(n)}aa_i\)互不相同,所以\(\prod_{i=1}^{\phi(n)}aa_i \equiv \prod_{i=1}^{\phi(n)}a_i\)

\[\because a^{\phi(n)}\prod_{i=1}^{\phi(n)}a_i\equiv\prod_{i=1}^{\phi(n)}aa_i \equiv \prod_{i=1}^{\phi(n)}a_i\mod n \\ \because (a_i,n)=1 \\ \therefore(\prod_{i=1}^{\phi(n)}a_i,n)=1 \\ \because a^{\phi(n)}\prod_{i=1}^{\phi(n)}a_i\equiv \prod_{i=1}^{\phi(n)}a_i \mod n \\ \therefore a^{\phi(n)} \equiv 1 \mod n \]

欧拉定理推论

\[(a,n)=1,\forall b \ge \phi(n) \rightarrow a^b \equiv a^{b {\mod \phi(n) } +\phi(n)} \mod n \]

证明如下

证明\((4)\)只要证对于所有质数\(p^r\)满足\(a=\prod p_i^{r_i}\)满足\(p^b \equiv p^{b {\mod \phi(n) } +\phi(n)} \mod n\)

\[assume: n=mp^r,n\perp p \\ \therefore \phi(m)|\phi(n) \\ \because p^{\phi(m)} \equiv 1 \mod m \\ \therefore p^{\phi(n) } \equiv 1 \mod m \\ \because n\perp p^r \\ \therefore p^{\phi(n)+r}\equiv p^r \mod {mp^r=n} \\ \therefore \forall x\in Z^+,p^x \equiv p^{x+r-r}\equiv p^{x+\phi(n)}\equiv p^{x+\phi(n)+r-r}\equiv p^{x+2\phi(n) }\dots \equiv p^{x+k\phi(n)}\mod n \\ \]

暂咕。

扩展欧几里得定理

\[(x,y)=(y,x \mod y) \]

假设

\[ax+by=(a,b) =(b,a\% b) \]

对于后面的式子构造这样的方程

\[bx'+(a\% b)y'=(b,a\% b) \]

化简一下

\[bx'+(a-[{a \over b}]b)y'=(b,a\%b)=ax+by \]

比较一下系数

\[x=y',y=x'-[{a\over b}]by' \]

实际上揭示了两个方程之间解的关系:

\[ax+by=(a,b)=d\text{和}bx'+(a\%b)y'=(b,a\%b)=d \]

所以当\(a=0\)的时候,构造一个\(x=0,y=1\)就可以一路回去得到最初解了。

扩展中国剩余定理

对于同余方程

\[\begin{equation} \left\{ \begin{array} &x \equiv a_1 \mod p_1\\ x \equiv a_2 \mod p_2\\ \dots \\ x \equiv a_3 \mod p_3\\ \end{array} \right. \end{equation} \]

可以由中国剩余定理得到有一个通解

\[x\equiv u \mod lcm(p_i)\text{或}x=t\times lcm(p_i)+u \]

假设我们已经知道了前\(n-1\)个方程的通解解\(x=t\times lcm(p_{n-1})+u_{n-1}\)

现在来了一个新的方程

\[x\equiv a_n \mod p_n \]

我们把通解代进去\(x=t\times L+u\)

\[x=t\times L+u\equiv a_n \mod p_n \]

可以用扩欧解出这个方程

\[y\times p_n+ t\times L+u= a_n \]

只有\(y,t\)是未知数,显然因为这个和方程和同余方程是等价的,故这个方程若无解则方程组无解。

我们只要确定\(t\)就好了,确定了\(t\),则新的\(x'=t\times L+u\),对\(lcm(p_n)\)取膜保证最小。

可以看出来,最后的解是在\(\mod lcm(p_n)\)意义下的,也就是说,我们若知道了\(x\)在一个数的互素因子中的同余值,就可以解出来。复杂度是\(O(\sum \text{互素因子})\)


ll gcd(const ll&a,const ll&b,ll&x,ll&y){
      if(b==0){x=1;y=0;return a;}
      ll g=gcd(b,a%b,y,x);
      y-=a/b*x;
      return g;
}



ll mul(ll a,ll b,ll mod){
      a=(a%mod+mod)%mod;b=(b%mod+mod)%mod;
      register ll ret=0;
      for(register ll t=b;t;t>>=1,a=(a<<1)%mod)
	    if(t&1) ret=(ret+a)%mod;
      return ret;
}

ll inv(ll x,ll mod){
      ll ret=0,t;
      gcd(x,mod,ret,t);
      return (ret%mod+mod)%mod;
}

inline ll equation(const ll&a,const ll&b,const ll&c,ll&x,ll&y,const ll&mod){
      ll g=gcd(a,b,x,y);//ax+by=gcd(a,b)
      x=mul(c/g,x,mod);y=mul(y,c/g,mod);
      return g;
}

ll M=1,x=0;
void CRT(ll rest,ll mod){
      ll X,Y,g;
      g=equation(M,mod,((rest-x)%mod+mod)%mod,X,Y,mod);
      Y=mod/g*M;
      x=(x+mul(M,X,Y))%Y;
      M=Y;
}

卢卡斯定理

普通卢卡斯:对于质数\(p\)

\[{n\choose m}\equiv{[n/p]\choose [m/p]}{n \mod p \choose m \mod p} \mod p \]

证明(口胡警告):考虑把阶乘写成这样的形式

\[n! \equiv 1 \times 2 \times 3 \times 4 \times \dots \times p \times 1 \times 2 \times 3\dots \times p \times 1 \times 2\dots n \mod p \]

所以当\(n>p\)的时候,$n!= (1\times 2 \times 3 \dots p-1)^{[n/p]}\times p^{[n/p]} $

设一下这个函数\(f(x)=(1\times 2 \dots p-1)^{[n/p]}\times p^{[n/p]}\)

所以上下就变成了,其中\(2p>n,m,n-m > p\)

\[{n\choose m}=\dfrac {f(n)} {f(n-m)f(m)} \]

\(u=(1 \times 2 \dots \times p-1)\)然后化一下

\[\dfrac {f(n)} {f(n-m)f(m)}={u^{n/p-m/p-(n-m)/p}p^{n/p-m/p-(n-m)/p}}={n \mod p \choose m \mod p}={1\choose 1}{n \mod p \choose m \mod p}={[n/p]\choose [m/p]}{n \mod p \choose m \mod p} \]

呵呵这是强行等于...理解一下我的意思就好了我其实不会证

扩展卢卡斯定理

假如\(p\)不是一个质数怎么办

先把\(p\)划分成为一个个互素的因子,然后求出每个因子模意义下的答案,然后中国剩余定理合并。这就是我们的大思路。

第一步和最后一步比较简单,看看第二步怎么做。

写出式子:就是求

\[{n \choose m} \mod p_i^{c_i} \]

也就是求

\[\dfrac {n!} {m!(n-m)!} \mod p_i^{c_i} \]

我们现在用不了逆元,因为\(m!(n-m)!\)不互素,所以我们把阶乘里所有\(p_i\)提出来,但是假如只提下面的\(p_i\)的话提出来是个分数,又没得逆元。但是我们把上面提出来的话就不是个分数了。

\(f(n!)\)\(n!\)中最多提出多少个\(p_i\)。很好求\(f(n!)= \sum_{j=1} [\dfrac {n} {p_i^j}]\)

现在的问题就是得到 去\(p_i\)阶乘 了,去的意思是\(\div\)

\(g(n)\)表示去\(p_i\)阶乘,考虑怎么求\(g(n)\)

首先去除所有\(p\)的倍数:\(p,2p,3p,4p,...,{\lfloor {n\over p} \rfloor}p\),把\(p\)了之后还有个\(\lfloor {n\over p}\rfloor\)的阶乘,递归下去

剩下的部分和\(p\)互质,因此在\(\mod p^c\)意义下一定存在一个循环节,

结论:

\[g(n)=g(n/p)(\prod_{i=1}^{n\%p^c}i)^{[n/p^c]} \]

用CRT就回去就求出来了

namespace lucas{
      
      inline ll mul(ll a,ll b,ll mod){
	    ll ret=0;
	    a=(a%mod+mod)%mod;
	    b=(b%mod+mod)%mod;
	    if(a>b)swap(a,b);
	    while(a){
		  if(a&1) ret=(b+ret)%mod;
		  b=(b<<1)%mod;
		  a>>=1;
	    }
	    return ret;
      }
      
      inline ll ksm(ll base,ll p,ll mod){
	    ll ret=1;
	    while(p){
		  if(p&1) ret=mul(ret,base,mod);
		  base=mul(base,base,mod);
		  p>>=1;
	    }
	    return ret;
      }
      
      inline ll ksm(ll base,ll p){
	    ll ret=1;
	    while(p){
		  if(p&1) ret=ret*base;
		  base=base*base;
		  p>>=1;
	    }
	    return ret;
      }
      
      ll gcd(const ll&a,const ll&b,ll&x,ll&y){
	    if(!b) return x=1,y=0,a;
	    ll k=gcd(b,a%b,y,x);
	    return y-=a/b*x,k;
      }
            
      inline ll equation(const ll&a,const ll&b,const ll&c,ll&x,ll&y,const ll&mod){
	    ll g=gcd(a,b,x,y);
	    x=mul(x,(ll)c/g,mod);y=mul(y,(ll)c/g,mod);
	    return g;
      }
      
      inline ll inv(const ll&a,const ll&mod){
	    ll x,y;
	    equation(a,mod,1,x,y,mod);
	    return x;
      }
      
      ll M,x;
      inline void CRT(ll rest,ll mod){
	    ll X,Y,g=equation(M,mod,((rest%mod-x%mod)%mod+mod)%mod,X,Y,mod);
	    x=(x+mul(X,M,Y=mod/g*M));
	    x%=Y;M=Y;
      }

            
      inline ll getp(ll n,ll p){
	    ll ret=0;
	    while(n) ret+=n/p,n/=p;
	    return ret;
      }
      
      inline ll getjc(ll n,ll p,ll ci){
	    if(n<=1)return 1;
	    ll mod=ksm(p,ci);
	    ll sav=1,ret=1;
	    for(ll t=1;t<=mod&&n>=mod;++t)
		  if(t%p) sav=mul(sav,t,p);
	    ret=mul(ret,ksm(sav,n/mod,mod),mod);
	    for(ll t=1;t<=n%mod;++t)
		  if(t%p) ret=mul(ret,t,mod);//qaq
	    return mul(ret,getjc(n/p,p,ci),mod);
      }
      
      inline ll single(const ll&n,const ll&m,const ll&p,const ll&c){
	    ll ci=getp(n,p)-getp(m,p)-getp(n-m,p);
	    if(ci>=c)return 0;
	    ll mod=ksm(p,c);
	    ll ret=1;
	    ret=mul(ret,ksm(p,ci,mod),mod);
	    ret=mul(ret,getjc(n,p,c),mod);
	    ret=mul(ret,inv(getjc(m,p,c),mod),mod);
	    ret=mul(ret,inv(getjc(n-m,p,c),mod),mod);
	    return ret;
      }
      
      inline ll c(const ll&n,const ll&m,const ll&mod){
	    if(n<m)return 0;
	    if(m==1)return n;
	    if(n==1||m==0) return 1;
	    M=1;x=0;
	    ll k=mod;
	    for(ll t=2,ed=sqrt(k);t<=ed;++t){
		  if(mod%t==0){
			ll temp=1,cnt=0;
			while(k%t==0) temp*=t,++cnt,k/=t;
			CRT(single(n,m,t,cnt),temp);
		  }
	    }
	    if(k>1) CRT(single(n,m,k,1),k);
	    return x;
      }
}


扩展大步小步(北上广深)

考虑这样一个方程

\[a^x \equiv b \mod p \]

\(x\)最小的解

普通的BSGS基于互质,如果\(\gcd(a,p)\not = 1\)会发生不可预测的事情。

假如\(a\perp p\)我们也可以做,因此我们朝着这个方向努力

\[a^x \equiv b \mod p \]

同除 \(d=(a,p)\) 得到

\[a^x/(a,p) \equiv b \mod p/(a,p) \]

\[a^{x-1} \times a/(a,p) \equiv b/(a,p) \mod p/(a,p) \]

除了多了一个\(a/d\)其他就是一个子问题。我们一直除下去直到\(d\not | p\),此时a和模数互质,就又可以用bsgs了

\[a^{x-i}(a^i/d^i) \equiv b/d^i \mod p/d^i \]

注意到如果\(d^i \not | b\)则无解,证明略。


map < int ,int > s;
inline int exBSGS(int a,int b,int mod){
      int cnt=0,AD=1,d;
      while(1!=(d=gcd(a,mod))){
      	    if(b%d) return -1;
      	    ++cnt,AD=1ll*AD*(a/d)%mod,mod/=d,b/=d;
	    if(AD==b) return cnt;
      }
      int ret=1,M=sqrt(mod)+1;
      map< int ,int >().swap(s);
      for(register int t=0;t<M;++t,ret=1ll*ret*a%mod)
	    s[1ll*ret*b%mod]=t;
      for(register int t=1,w=1ll*ret*AD%mod;t<=M;++t,w=1ll*w*ret%mod)
	    if(s.find(w)!=s.end())
		  return t*M-s[w]+cnt;
      return -1;
}

posted @ 2019-07-20 21:46  谁是鸽王  阅读(115)  评论(5)    收藏  举报