【总结】皇冠上的明珠——初等数论初步
皇冠上的明珠——初等数论初步
很杂,因为学得不多
整除的性质
-
若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)\)得证。
-
若\(\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\)
证毕
-
若\(b=qd+c\)那么\(d|b\)的充要条件是\(d|c\),证明如下:
\(d|b \Leftrightarrow dq|bc\)
其中\(b=dq+c\)
所以\(b\not| \ d\)且\(a\not| \ q\)
所以\(d|c\)。
-
\(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\)证毕
费马小定理/欧拉定理
证明如下:
对于\(n\)的简化剩余系\([n]\),我们有
证明如下:由简化剩余系的定义可以知道\((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\)
欧拉定理推论
证明如下
证明\((4)\)只要证对于所有质数\(p^r\)满足\(a=\prod p_i^{r_i}\)满足\(p^b \equiv p^{b {\mod \phi(n) } +\phi(n)} \mod n\)
暂咕。
扩展欧几里得定理
假设
对于后面的式子构造这样的方程
化简一下
比较一下系数
实际上揭示了两个方程之间解的关系:
所以当\(a=0\)的时候,构造一个\(x=0,y=1\)就可以一路回去得到最初解了。
扩展中国剩余定理
对于同余方程
可以由中国剩余定理得到有一个通解
假设我们已经知道了前\(n-1\)个方程的通解解\(x=t\times lcm(p_{n-1})+u_{n-1}\)
现在来了一个新的方程
我们把通解代进去\(x=t\times L+u\)
可以用扩欧解出这个方程
只有\(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>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\)
设\(u=(1 \times 2 \dots \times p-1)\)然后化一下
呵呵这是强行等于...理解一下我的意思就好了我其实不会证
扩展卢卡斯定理
假如\(p\)不是一个质数怎么办
先把\(p\)划分成为一个个互素的因子,然后求出每个因子模意义下的答案,然后中国剩余定理合并。这就是我们的大思路。
第一步和最后一步比较简单,看看第二步怎么做。
写出式子:就是求
也就是求
我们现在用不了逆元,因为\(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\)意义下一定存在一个循环节,
结论:
用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;
}
}
扩展大步小步(北上广深)
考虑这样一个方程
求\(x\)最小的解
普通的BSGS基于互质,如果\(\gcd(a,p)\not = 1\)会发生不可预测的事情。
假如\(a\perp p\)我们也可以做,因此我们朝着这个方向努力
故
同除 \(d=(a,p)\) 得到
即
除了多了一个\(a/d\)其他就是一个子问题。我们一直除下去直到\(d\not | p\),此时a和模数互质,就又可以用bsgs了
注意到如果\(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;
}

浙公网安备 33010602011771号