• 【数论数学】扩展欧拉定理


    本文感谢@burnside神仙和@ddosvoid神仙的帮助审稿qwq

    Definition

    (forall~a~,~m~in~Z^+~,~s.t.~gcd(a,m)=1),则一定满足(~a^{phi(m)}~equiv~1~(Mod~m)~)。该定理被称作欧拉定理。

    Demonstration

    (x_i)为第(i)个与(m)互质的数,则共有(phi(m))(x_i)

    (p_i~=~a~ imes~x_i)

    引理一:

    ({p_i})间两两模(m)不同余,({x_i})间两两模(m)不同余。

    证明:

    先证({x_i})间两两模(m)不同余:

    因为(~forall~i~in~[1,phi(m)]~,~x_i~<~m~),故

    [~x_i~Mod~m~equiv~x_i~ ]

    (~forall~i,j~in~[1,phi(m)],i~ eq~j~)都有(~x_i~ eq~x_j~)。于是

    [~x_i~Mod~m~ eq~x_j~Mod~m~ ]

    ({x_i})间两两模(m)不同余

    再证({p_i})间两两模(m)不同余:

    反证法,若存在一对(~i,j~in~[1,phi(m)]~,~i~ eq~j~,~s.t.~p_i~equiv~p_j~(Mod~m)~),则

    [a~ imes~x_i~equiv~a~ imes~x_j~(Mod~m) ]

    [Rightarrow~x_i~equiv~x_j~(Mod~m)$$。 根据${x_i}$间两两模$m$不同余,产生矛盾,于是${p_i}$间两两模$m$不同余 ##### 证毕 ### 引理二: $forall~i~in~[1,phi(m)]~,~p_i~$与$m$互质。 ##### 证明: 写出$m,a,x_i,p_i$的唯一分解式: $$m~=~q_1^{c_1}~q_2^{c_2}~dots~q_k^{c_k}]

    [a=q_1^{d_1}~q_2^{d_2}~dots~q_k^{d_k} ]

    [x_i~=~q_1^{e_1}~q_2^{e_2}~dots~q_k^{e_k} ]

    [p_i~=~q_1^{e_1+d_1}~q_2^{e_2+d_2}~dots~q_k^{e_k+d_k} ]

    (forall~i~,~s.t.~c_i~ eq~0~)都有(d_i~=~e_i~=~0),于是(d_i+e_i~=~0)

    于是(forall~i~in~[1,phi(m)]~,~p_i~)(m)互质。

    证毕

    根据上述引理,可得所有(p_i)的模(m)的解的集合与({x_i})相等,于是他们的积模(m)的值也相等。

    于是有

    [prod_{i=1}^{phi(m)}~p_i~equiv~a^{phi(m)}~prod_{i=1}^{phi(m)}~x_i~equiv~prod_{i=1}^{phi(m)}~x_i~(Mod~m) ]

    于是有(a^{phi(m)}~equiv~1~(Mod~m))。证毕。

    Extension

    对于(a)(m)不一定互质的情况,有:

    (a^c~equiv~egin{cases}a^{c~Mod~phi(m)} &gcd(a,m)~=~1 \a^c &gcd(a,m)~ eq~1~land~c~<~phi(m) \ a^{c~Mod~phi(m)~+~phi(m)} &gcd(a,m)~ eq~1~land~c~geq~phi(m)end{cases})

    Demonstration

    (m~=~1)时显然成立,以下讨论(m~ eq~1)的情况。

    对于(gcd(a,m)~=~1~)的情况,因为(a^{phi(m)}~equiv~1),所以每(phi(m))(a)就相当于乘(1)。于是只需要算(c~Mod~phi(m))次。

    对于(c~<~phi(m))的情况,直接爆算

    下面证明第三种情况。

    先证明(a)是一个质数的情况:

    引理1:

    (forall~p~)为质数,(r~in~Z^+),都有(phi(p^r)~=~(p-1)~ imes~p^{r-1})

    证明:

    由于(p)是一个质数,所以(~1~sim~(p^r-1)~)中有且仅有(i~ imes~p,~i~in~(0,p^{r-1})~)(p^r)不互质。

    于是(phi(p^r)~=~p^r~-~p^{r-1}~=~p^{r-1}~ imes~(p~-~1)~)

    证毕。

    引理2:

    (forall~k~in~Z)(exists~a,b,x,y~in~Z^+~,~s.t.~x^a~ imes~y^b~=~k),都有(~a,b~leq~phi(k)~)

    证明:

    先考虑(k)为一个质数(p)(r)次幂的情况。根据引理1有:

    (phi(k)~=~phi(p^r)~=~(p-1)~ imes~p^{r-1})

    下面说明((p-1)~ imes~p^{r-1}~geq~r)

    (p=2)时:

    经验证(~r=1,2,3~)时成立。当(~r>3~)时按照(r)的大小做数学归纳,可证正确性。

    (~p~>~2~)时,不等号左侧增大,右侧不变,不等式仍然成立。

    考虑(k)是多个质数幂时的情况,按照质数个数做数学归纳,正确性成立。

    任意组合质数,引理得证。

    证毕
    引理3:(exists~r~leq~c~,~s.t.~a^{phi(m)+r}~equiv~a^r~(Mod~m))
    证明:

    (m~=~t~ imes~a^r),其中(gcd(t,a)=1)(t)的存在性显然。

    因为(gcd(t,a)~=~1),且(phi)函数是一个积性函数,所以(phi(t)~|~phi(m))

    根据欧拉定理,(a^{phi(t)}~equiv~1~(Mod~t)),于是有

    [a^{phi(m)}~equiv~1~(Mod~t) ]

    同余式同乘(a^r),于是有

    [a^{phi(m)+r}~equiv~a^r~(Mod~m) ]

    已经证明可以构造出这样的(r)。根据引理2,(r~leq~phi(m))。又(c~geq~phi(m)),于是可证构造出的(r~leq~c)。定理得证。

    证毕

    于是

    [a^c~equiv~a^{c-r+r}~equiv~a^{c-r+phi(m)+r}~equiv~a^{c+phi(m)}~(Mod~m) ]

    对上式做数学归纳,可得(a^c~equiv~a^{c+kphi(m)}~,~k~in~Z),需保证指数为正。

    于是最小的合法的指数即为(c~Mod~phi(m)~+~phi(m))

    于是有$$a^c~equiv~a^{c~Mod~phi(m)~+~phi(m)}$$

    (a)是一个质数的幂次时,设(a=p^k),则

    [a^c~equiv~p^{ck}~equiv~p^{ck+phi(m)}~equiv~p^{ck+kphi(m)}~equiv~(p^k)^{c+phi(m)}~equiv~(p^k)^{c~Mod~phi(m)~+~phi(m)}~~(Mod~m) ]

    (a)时多个质数次幂的乘积时,依据唯一分解定理做数学归纳,即证正确性。证毕。

    Example

    传送门

    Description

    你有一个本子,你要往上面写全部的长度为(n)(b)进制数字,每一页可以写(c)个。要求所有数字必须严格不含前导(0)。求最后一页上有多少个数字

    Input

    三个数,依次是进制数(b),数字长度(n),每一页的个数(c)

    Output

    一行一个整数代表答案

    Hint

    (Forall:)

    (2~leq~b~<~10^{10^6}~,~1~leq~n~<~10^{10^6}~,~1~leq~c~leq~10^9)

    Solution

    考虑计数原理,第一个位置可以填(~1~sim~(b-1)~)(~(b-1)~)个数字,剩下的位置可以填(~0~sim~(~b~-~1~)~)(~b~)个数字。于是答案即为(~(b-1)~ imes~b^{(n-1)})。后面的应用扩展欧拉定理即可解决。

    Code

    #include<cstdio>
    #include<cstring>
    #define rg register
    #define ci const int
    #define cl const long long
    
    typedef long long int ll;
    
    template <typename T>
    inline void qr(T &x) {
    	rg char ch=getchar(),lst=' ';
    	while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
    	while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    	if(lst == '-') x=-x;
    }
    
    namespace IO {
    	char buf[120];
    }
    
    template <typename T>
    inline void qw(T x,const char aft,const bool pt) {
    	if(x < 0) {x=-x,putchar('-');}
    	rg int top=0;
    	do {IO::buf[++top]=x%10+'0';} while(x/=10);
    	while(top) putchar(IO::buf[top--]);
    	if(pt) putchar(aft);
    }
    
    const int maxn = 1000010;
    
    char B[maxn],N[maxn];
    ll m,phi,b;
    
    int ReadMod(char*,cl&);
    int GetPhi(ll);
    void MinuN();
    int mpow(int,ll);
    bool judge();
    
    int main() {
    	freopen("1.in","r",stdin);
    	scanf("%s %s",B+1,N+1);qr(m);
    	b=ReadMod(B,m);
    	if(judge()) return 0;
    	int k=GetPhi(m);
    	MinuN();
    	int n=ReadMod(N,k)+k;
    	int ans=1ll*(b-1)*mpow(b,n)%m;
    	ans=(ans+m)%m;
    	qw(ans?ans:m,'
    ',true);
    	return 0;
    }
    
    int ReadMod(char *str,cl & p) {
    	int l=strlen(str+1);
    	ll _ret=0;
    	for(rg int i=1;i<=l;++i) _ret=((_ret<<1)+(_ret<<3)+(str[i]^48))%p;
    	return _ret;
    }
    
    int GetPhi(ll x) {
    	ll _ret=x;
    	for(ll i=2;i*i<=x;++i) if(!(x%i)) {
    		_ret=_ret*(i-1)/i;
    		while(!(x%i)) x/=i;
    	}
    	if(x != 1) _ret=_ret*(x-1)/x;
    	return _ret;
    }
    
    void MinuN() {
    	int l=strlen(N+1);
    	--N[l];
    	for(rg int i=l;i;--i) if(N[i] < '1') {
    		N[i]+=10,--N[i-1];
    	} else break;
    	if(N[1] == '0'+10) N[1]='0';
    }
    
    int mpow(int x,ll k) {
    	int _ret=1,_temp=x;
    	while(k) {
    		if(k&1) _ret=1ll*_ret*_temp%m;
    		_temp=1ll*_temp*_temp%m;
    		k>>=1;
    	}
    	return _ret%m;
    }
    
    bool judge() {
    	int l=strlen(N+1);
    	if(l >= 17) return false;
    	ll _tp=0;
    	for(rg int i=1;i<=l;++i) _tp=(_tp<<1)+(_tp<<3)+(N[i]^48);
    	int ans=1ll*(b-1)*mpow(b,_tp-1)%m;
    	ans=(ans+m)%m;
    	qw(ans?ans:m,'
    ',true);
    	return true;
    }
    

    Summary

    扩展欧拉定理可以用在底数与模数不互质的情况下,将质数将至与模数同阶的大小,从而可以使用快速幂进行运算。

    注:本篇内容部分证明参考该BAJim_H的博客,在此表示衷心的感谢。

  • 相关阅读:
    Java反编译代码分析(一)
    Java信号量Semaphore
    Ubuntu SVN安装&使用&命令
    Android -- Dialog动画
    Android -- EventBus使用
    Android -- queryIntentActivities
    解决:fatal: authentication failed for https
    MySQL表名大小写敏感导致的问题
    Publish to a Linux Production Environment
    layer.js 弹窗组件API文档
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/9997009.html
Copyright © 2020-2023  润新知