zoukankan      html  css  js  c++  java
  • [数论学习笔记]费马小定理、欧拉函数、欧拉定理、欧拉降幂公式

    前置知识

    完全剩余系

    百度百科:

    从模n的每个剩余类中各取一个数,得到一个由n个数组成的集合,叫做模n的一个完全剩余系。

    简单点说,n的完全剩余系就是0到n-1的集合。

    缩剩余系

    又叫简化剩余系。
    简单点说,n的缩剩余系就是其完全剩余系中与n互质的数组成的一个集合。


    费马小定理

    内容:

    [ ext{若 $p$ 为质数,且 $gcd(a,p)=1$ ,则 $a^{p-1}equiv1pmod p$ 。} ]

    证明:

    考虑p的缩剩余系,因为p是质数,所以p的缩剩余系为 ({1,2,3,cdots,p-1})
    把缩剩余系中的每个数乘上一个数k(要求:(gcd(k,p)=1) ),所得到的集合在模p意义下仍是p的缩剩余系。
    上一句如何证明?
    只需证明在新集合中任意两个数都不相等即可。
    反证:取出两个数 (k imes a_1,k imes a_2),若这两个数在模p移一下相等,则

    [k imes a_1equiv k imes a_2pmod p ]

    移项得:

    [k imes (a_1-a_2)equiv 0pmod p ]

    即:

    [pmid k imes(a_1-a_2) ]

    又因为

    [gcd(p,k)=1 ]

    所以得出

    [pmid(a_1-a_2) ]

    [0 < a_1 le p-1 ]

    [0 < a_2 le p-1 ]

    所以

    [p mid(a_1-a_2) ]

    不成立。
    所以所得到的集合在模p意义下仍是p的缩剩余系。
    这时候就有下面这个式子:

    [1 imes2 imes3 imescdots imes(p-1)equiv k imes2k imes3k imes(p-1)kpmod p ]

    化简一下可得:

    [(p-1)!equiv(p-1)! imes k^{p-1}pmod p ]

    因为

    [gcd((p-1)!,p)=1 ]

    所以两边约去后得

    [k^{p-1}equiv1pmod p ]

    证毕。

    应用

    逆元
    而逆元应用非常广泛。


    欧拉函数

    定义

    欧拉函数(psi(x))表示小于x的数字中与x互质的数的个数。

    公式

    [psi(x)=xprod_{i=1}^{n}(1-frac{1}{p_i}) ]

    其中n表示x的质因数个数。

    证明

    考虑容斥原理。
    (p_1,p_2)(x) 的两个质因数,则 (p_1)的倍数有 (frac{x}{p_1}) 个,(p_2) 的倍数有 (frac{x}{p_2}) 个。
    把这些数删去,还剩下 (x-frac{x}{p_1}-frac{x}{p_2}+frac{x}{p_1 imes p_2}) 个。(多删了 (frac{x}{p_1 imes p_2}) 个)
    然后就是化简变形:

    [egin{aligned} & quad x-frac{x}{p_1}-frac{x}{p_2}+frac{x}{p_1 imes p_2}\ & =x(-frac{1}{p_1}-frac{1}{p_2}+frac{1}{p_1 imes p_2})\ & =x(1-frac{1}{p_1})(1-frac{1}{p_2})\ end{aligned}]

    推广到n个质因数,得到公式:

    [psi(x)=xprod_{i=1}^{n}(1-frac{1}{p_i}) ]

    性质

    积性函数。
    满足:

    [psi(nm)=psi(n)psi(m)quadgcd(n,m)=1 ]

    若p是质数,则:

    [psi(p^k)=(p-1) imes p^{k-1} ]

    线性求代码实现

    线性筛可是很NB的,以至于所有积性函数都怕他(掩盖不了看似大的惊人的复杂度了)。
    ————某谷题解

    也就是说,所有线性求积性函数的关键就是用最小的质因子求。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=100005; 
    int phi[maxn],cnt,prime[maxn],vis[maxn],n; 
    int main(){
    	cin>>n;
    	phi[1]=1;//初始化 
    	for(int i=2;i<=n;i++){
    		if(!vis[i]) prime[++cnt]=i,phi[i]=i-1;//筛质数、质数i的欧拉函数值为 i-1 
    		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
    			vis[i*prime[j]]=1;//合数
    			if(i%prime[j]==0){//效率关键 
    				phi[i*prime[j]]=phi[i]*prime[j]; 
    				break;
    			}else{
    				phi[i*prime[j]]=phi[i]*(prime[j]-1);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++) cout<<phi[i]<<" ";
    	return 0;
    }
    

    欧拉定理

    内容:

    [forall a,m ext{,若 }gcd(a,m)=1 ext{,则有 }a^{psi(m)}equiv 1pmod m ]

    证明:

    欧拉定理算是费马小定理的拓展,所以证明很像。
    考虑 (m) 的缩剩余系,很显然缩剩余系中元素个数为 (psi(m))
    然后把缩剩余系中的每个数乘上一个数 (a),要求 (gcd(a,m)=1)
    根据费马小定理那里证明的命题,新的集合仍是 (m) 的缩剩余系。
    假设原来的缩剩余系为 (p),乘上 (a) 以后的缩剩余系为 (q),则有:

    [prod_{i=1}^{psi(m)}p_iequiv prod_{i=1}^{psi(m)}q_ipmod m ]

    即:

    [prod_{i=1}^{psi(m)}p_iequiv a^{psi(m)}prod_{i=1}^{psi(m)}p_ipmod m ]

    因为 (gcd(prod_{i=1}^{psi(m)}p_i,m)=1),所以两边可以同时约掉,得:

    [a^{psi(m)}equiv1pmod m ]

    证毕。


    欧拉降幂公式

    又叫做拓展欧拉定理
    有一道板子题:

    传送门

    内容:

    [a^bequiv a^{(bmod psi(m))+psi(m)}pmod m ,bge psi(m) ]

    证明:

    略。(挺实用的,一定要背过)
    注意当 (bge psi(m)) 时才能用公式,否则直接快速幂。

    AC代码

    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    long long a,m,mm;
    long long phi,res;
    int len,yyy; 
    string s;
    long long fp(long long a,long long b){
    	if(b==1) return a;
    	long long now=fp(a,b/2);
    	if(b&1) return now*now%m*a%m;
    	return now*now%m;
    }
    int main()
    {
        cin>>a>>m;
        phi=mm=m;
        for(int i=2;mm>1&&i<=sqrt(m);i++){
        	if(!(mm%i)){
        		phi/=i;
        		phi*=(i-1);
    			while(!(mm%i)) mm/=i;
    		}
    	}
    	if(mm>1) phi=phi/mm*(mm-1);
    	cin>>s;
    	len=s.length();
    	for(int i=0;i<len;i++){
    		res=res*10+s[i]-'0';
    		if(res>=phi) res%=phi,yyy=1;
    	}
    	if(yyy) res=res+phi;
    	cout<<fp(a%m,res);
        return 0;
    }
    
  • 相关阅读:
    为什么重写equals方法还要重写hashcode方法?
    提高数据库处理查询速度
    ibatis缓存初探(1)
    java四种数组排序
    前台将勾选的多个属性放到一个value里面,是一个字符串,传到后台
    Apache与Tomcat整合
    web服务器和应用服务器概念比较
    ibaits与spring整合的心得
    spring3.0的jar包详解
    JAVA:23种设计模式详解(转)2
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14851309.html
Copyright © 2011-2022 走看看