zoukankan      html  css  js  c++  java
  • 欧拉定理及扩展

    • 本篇很多推论基于质数唯一分解定理,请读者先行了解。

    欧拉函数

    定义

    有两种:

    1. 定义欧拉函数 (varphi(x)) 表示小于 (x) 且与 (x) 互质的数的个数,定义 (1) 与任何数互质。

    2. 定义剩余类 (c_i)(mod;x=i) 的数的集和,即所有 (a\%x=i)(a)。一般可以用其中的一个 (a) 代表。

      由于 (gcd(a,x)=gcd(x,a\%x)) ,所以剩余类中的数和 (x)(gcd) 都是一样的。这代表了只要剩余类中有一个数和 (x) 互质,这个剩余类中的所有数都与 (x) 互质。

      定义缩剩余类 是与 (x) 互质的数所在的剩余类。所有的缩剩余类组成缩系,一般可以从每个缩剩余类中选一个数来组成一个数列代表缩系。

      定义欧拉函数 (varphi(x))(mod;x) 的缩剩余类个数。

    性质

    建议读者仔细品味欧拉函数的两个定义,下面的证明将从这两方面思考。

    1. 对于质数 (p) (varphi(p)=p-1) 。显然成立。

    2. 对于质数 (p)(varphi(p^k)=p^k-p^{k-1})(p^k) 只与 (p) 的整数倍不互质。(p^k) 以内 一共有 (frac{p^k}{p})(p) 的倍数。

    3. 任意大于 (2) 的数 (n)(varphi(n)) 是偶数。因为 (gcd(n,x)=gcd(x,n-x)) (不会可以在本人博客找到证明),所以与 (n) 互质的数都是成对出现的。

    4. 欧拉函数的积性 :(这个证法有点弱,有用 (CRT) 证明其通项再来证明这个的)

      对于互质的两个数 (m) , (n) ,有 (varphi(mn)=varphi(m)varphi(n))

      证明:

      将问题分成两个子问题

      (x_i)(n) 的一个缩剩余类,(y_i)(m) 的一个缩剩余类。

      1. 证明可以用 (x_im+y_in) 来表示 (mn) 的的一个缩剩余类,且不会重复。
      2. 证明 (mn) 的所有缩剩余类都可以用 (x_im+y_in) 表示。

      这样就可以证明积性

      下面来证明这些子问题:

      Ⅰ.

      (first) : 证明 (x_im+y_in)(mn) 的的一个缩剩余类

      [ecause gcd(m,n)=1\ egin{align} gcd(x_i,n)=1implies gcd(mx_i,n)=1implies gcd(mx_i+ny_i,n)=1 ag{更相减损} \ gcd(y_i,m)=1implies gcd(ny_i,m)=1implies gcd(ny_i+mx_i,m)=1\ end{align}\ herefore gcd(ny_i+mx_i,mn)=1 ]

      证毕。

      (second) :证明(x_im+y_in) 不会重复表示一个缩剩余类

      反证法:

      [f 设 mit x_km+y_kn f和mit x_im+y_inf 在varphi(mn)的同一个缩剩余类里\ 那么有:mit x_km+y_knequiv x_im+y_inquad(mod;mn)\ implies x_km+y_knequiv x_im+y_inquad(mod;m)\ implies y_knequiv y_inquad(mod;m) implies y_k=y_i\ f 同理,x_k=x_i ]

      与假设矛盾,所以(x_im+y_in) 不会重复表示一个剩余类。

      Ⅱ.

      (Z)(mn) 的一个缩剩余类中的元素。

      [egin{align} exists x_0m+y_0n=1 ag{裴蜀定理} end{align}\ implies Zx_0m+Zy_0n=Z\ implies mq+np=Zimplies gcd(mq+np,mn)=1 \implies gcd(mq+np,n)=1implies gcd(mq,n)=1\ ecause gcd(m,n)=1quad herefore gcd(q,n)=1 ]

      所以 (q)(n) 的缩剩余系中的元素,同理 (p)(m) 的缩剩余系中的元素。即所有的 (mn) 的缩剩余类都可以用(x_im+y_in) 表示。

    5. 欧拉函数的通项式:

      (varphi(m)=m(1-frac{1}{p_1})(1-frac{1}{p_2})dots(1-frac{1}{p_k})) 其中 (k)(m) 的质因子。

      证明:

      根据唯一分解定理,我们知道任意数 (m) 可以表示为:(p_1^{a_1}p_2^{a_2}dots p_k^{a_k})

      由于 (p) 是质数, 所以(varphi(p_i^{a_i})=p_i^{a_i}-p_i^{a_i-1}=p_i^{a_i}(1-frac{1}{p_i})) (见条目 (2.))。而质因子的幂彼此互质,所以

    [varphi(m)=varphi(p_1^{a_1})varphi(p_2^{a_2})dots varphi(p_k^{a_k})=m(1-frac{1}{p_1})(1-frac{1}{p_2})dots(1-frac{1}{p_k}) ]

    1. 小于 (n) 且与其互质的数之和为 (frac{varphi(n)}{2} imes n) 。由于 (gcd) 我们知道小于 (n) 且和 (n) 互质的数是成对出现的,且两两相加为 (n) 。于是易得。

    2. 欧拉反演(等会了再补)

    如何求欧拉函数

    通项公式

    根据欧拉函数的通项,我们可以质因数分解一个数,同时求其欧拉函数值。

    int get_euler_1(int x){
    	int ret=x;
    	for(int i=2;i*i<=x;i++){
    		if(x%i == 0){
    			ret=ret/i*(i-1);
    			while(x%i == 0){
    				x/=i;
    			}
    		}
    	} 
    	if(x>1) ret=ret/x*(x-1);
    	return ret;
    }
    

    线性求法

    欧拉函数是积性函数,有如下性质:

    1. 质数 (p) 的欧拉函数值为 (p-1)

    2. 互质两数 (a)(b)(varphi(ab)=varphi(a) imes varphi(b))

    3. 对于 (a)(p) ,如果 (p)(a) 的质因子,(varphi(ap)=p imesvarphi(a))

    这样我们就能在线性筛素数时求欧拉函数。

    int get_euler_2(int x){
    	inp[0]=inp[1]=1;
    	for(int i=2;i<=x;i++){
    		if(!inp[i]){
    			phi[i]=i-1;
    			prime[++tot]=i;
    		}
    		for(int j=1;j<=tot && prime[j]*i<=x;j++){
    			int tp=prime[j]*i;
    			inp[tp]=1;
    			if(i%prime[j] == 0){
    				phi[tp]=phi[i]*prime[j];
    				break;
    			}
    			phi[tp]=phi[i]*phi[prime[j]];
    		}
    	}
    	return phi[x];
    }
    

    欧拉定理

    定义

    对于互质的两数 (a)(m)

    [a^{varphi(m)}equiv 1quad(mod;m) ]

    证明

    (r_1,r_2,dots,r_{varphi(m)})(m) 的缩剩余系,由于 (a)(m) 互质,(ar_1,ar_2,dots,ar_{varphi(m)}) 也是 (m) 的缩剩余系。那么:

    [r_1r_2dots r_{varphi(m)}equiv a^{varphi(m)}r_1r_2dots r_{varphi(m)}quad(mod;m) \implies a^{varphi(m)} equiv1quad(mod;m) ]

    可以看出, (m) 是质数时 (varphi(m)=m-1) ,即费马小定理。

    代码

    直接看拓欧吧。没有欧拉的板子。

    扩展欧拉定理

    定义

    [a^{b}equiv egin{cases} a^{b\%varphi(m)}qquadqquad ext{gcd(a,m)=1}\ a^bqquadqquadqquad; ext{gcd(a,m)} eq1 quad &quad bleqvarphi(m)\ a^{b\%varphi(m)+varphi(m)}qquad ext{gcd(a,m)} eq1quad &quad b>varphi(m) end{cases} quad(mod m) ]

    证明

    首先,我们可以简化一下问题。

    我们要证

    [a^{b} equiv a^{b\%varphi(m)+varphi(m)}quad(mod;m) ]

    (a) 质因数分解,得:

    [a^b=p_1^{r_1}p_2^{r_2}dots p_k^{r_k} ]

    对于与 (m) 互质的 (p_i) ,显然有 (p_i^{b}=p_i^{bvarphi(m)+varphi(m)}quad (mod;p)) (欧拉定理)。

    那么只要证明了对于和 (m) 不互质的 (p_i) 也有此性质,就有:

    [a^b=(p_1^{r_1}p_2^{r_2}dots p_k^{r_k})^b=(p_1^{b})^{r_1}(p_2^{b})^{r_2}dots (p_k^{b})^{r_k}\ quad\ =(p_1^{b\%varphi(m)+varphi(m)})^{r_1}(p_2^{b\%varphi(m)+varphi(m)})^{r_2}dots (p_k^{b\%varphi(m)+varphi(m)})^{r_k}\ quad\ =(p_1^{r_1}p_2^{r_2}dots p_k^{r_k})^{b\%varphi(m)+varphi(m)}qquadqquadqquadqquad qquadqquad\ (mod;m) ]

    于是问题就简化成了求 (m) 的一个质因子 (p) 满足 (p^bequiv p^{b\%varphi(m)+varphi(m)})

    证明如下:

    • (m) 分解成 (p^ks) ,由于 (p)(s) 互质。就有:

      [p^{varphi(s)}equiv 1quad(mod;s) ]

      又因为 (aequiv b quad(mod s)quad&quad cequiv dquad(mod s)implies acequiv bdquad(mod s)) (想不通为什么可以从同余定义角度思考)。

      我们可以得出 (p^{x imesvarphi(s)}equiv 1quad(mod;s))

      又因为欧拉函数是积性函数,所以 (varphi(s)midvarphi(m))

      就可以得出 (p^{varphi(m)}equiv 1equiv p^{varphi(s)} quad(mod;s))

    • 继续推:

    [ p^{varphi(s)}equiv1quad(mod;s)iff p^{varphi(s)}=x imes s+1\ implies p^{varphi(s)+k}=x imes s imes p^k+p^k \ implies p^{varphi(s)+k}=xm+p^k\ implies p^{varphi(s)+k}equiv p^kquad(mod;m) ]

    又因为 (p^{varphi(m)}equiv p^{varphi(s)} quad(mod;m)) ,所以 (p^{varphi(m)+k}equiv p^kquad(mod;m))

    • 由此可知有:

      [p^bequiv p^{b-k}p^kequiv p^{b-k+varphi(m)+k}equiv p^{b+varphi(m)}quad(mod;m) ]

      条件是 (bgeq k)

      这时又有一个推论: 对于(m=p^qs) ,有(varphi(m)geq q)

      先单独考虑质因子 (p^q) ,即证明(varphi(p^q)=p^{q-1}(p-1)geq q) ,当 (p=2) 时为 (p^{q-1}geq q)

      首先 (q=2) 时成立。然后对于 (q> 2) 的情况,我们假设 (q-1)(2^{q-1}geq q-1) 成立:

      [2^q=2 imes 2^{q-1}geq 2 imes q-2 ]

      由于 (q>2) 所以 (2^qgeq q) ,当且仅当 (q=2) 时取等。

      又因为 (p^{q-1}(q-1)) 是个增函数,(p) 增大时就显然成立。

      那么就有 (bgeq k geq varphi(m)) 。即函数成立条件为 (bgeq varphi(m))

    • 我们要将 (b) 尽量变小,即减去尽量多的 (varphi(m)) 。而上面的函数可表示为:

      (p^{x}equiv p^{x+varphi(m)}quad(mod;m)) ,那么将 (x-varphi(m)) 代入 (x) 就有 (p^{x-varphi(m)}equiv p^xquad(mod;p)) 。注意这时定义域为 (x-varphi(m) geq varphi(m)implies xgeq 2varphi(m))

      我们不可能一个一个地减去 (varphi(m)) 最好的做法是取模,然而这样不能保证 (xgeq 2varphi(m))

      于是我们要再加上一个 (varphi(m)) 。即有 (p^bequiv p^{b\%varphi(m)+varphi(m)}quad(mod;m) qquad bgeq 2varphi(m))

      (b)(varphi(m))(2 varphi(m)) 之间时这么做也没有区别,我也不知道为什么要分在第三类中大概是好记

    证毕

    好长。

    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef int int_;
    #define int long long  
    
    char bb[20000050];
    int aa,m,bbb;
    int phi,ans;
    
    int gcd(int a,int b){
    	return b==0?a:gcd(b,a%b);
    }
    
    void exgcd(int a,int b,int &x,int &y){
    	if(b==0){
    		x=1,y=0;
    	}
    	else{
    		exgcd(b,a%b,y,x);
    		y-=(a/b)*x;
    	}
    }
    
    int getphi(int x){
    	int ret=1;
    	for(int i=2;i*i<=x && x!=1;i++){
    		if(x%i != 0) continue;
    		ret *=  i-1;
    		x/=i;
    		while(x%i==0){
    			ret*=i;
    			x/=i;
    		}
    	}
    	if(x>1) ret*=x-1;
    	return ret;
    }
    
    int ksm(int x,int q,int p){
    	int ret=1;
    	while(q>0){
    		if(q&1) ret=(ret*x)%p;
    		x=(x*x)%p;
    		q>>=1;
    	}
    	return ret;
    }
    
    int_ main()
    {
    	bool flag=false;
    	scanf("%lld %lld %s",&aa,&m,bb);
    	phi=getphi(m);
    	int len=strlen(bb);
    	for(int i=0;i<len;i++){
    		bbb=bbb*10+(int)(bb[i]-'0');
    		if(bbb>=phi){
    			bbb%=phi;
    			flag=true;
    		}
    	}
    	if(flag) ans=ksm(aa,bbb+phi,m);
    	else ans=ksm(aa,bbb,m);
    	printf("%lld",ans);
    	return 0;
    }
    

    部分证明思路来源:


    -EOF-
  • 相关阅读:
    netty 解决TCP粘包与拆包问题(二)
    Socket通讯-Netty框架实现Java通讯
    SpringBoot集成Swagger,Postman,newman,jenkins自动化测试.
    Java Console/控制台 打印表格
    mysql控制台的一些技巧,显示,输入换行,语法正则等
    “妈妈,我不想学了”,你的回答改变孩子一生(怅然若失,说了一句话:“为什么当初没有人逼我?”。我不愿意学,你就不让我学啦!那时候我还小,我还不懂事,难道你也不懂事吗。要做成一件事,就必须有延迟满足的能力)
    “太子”显然沉稳不足,急于把大权抓在自己手里,做的第一件事居然是想尽一切办法铲除父亲在公司的亲信(我很久以来的疑惑,看了这段才明白,相比之下,经过玄武门之变的李世民仍然忍了裴寂三年时间是何等的聪明和了不起)
    如何分析和提高大型项目(C/C++)的编译速度?(VS2015特有的:/LTCG:incremental选项)
    Duilib学习之基础(一个SDK程序)
    使用 QWorker 做为计划任务引擎
  • 原文地址:https://www.cnblogs.com/thornblog/p/11889797.html
Copyright © 2011-2022 走看看