欧拉相关定理的运用

本文详细介绍了欧拉函数的概念,包括定义、性质(如欧拉定理),以及与欧拉函数相关的定理,如定理一(积性函数性质)、定理二(因子分解公式)和定理三(质数情况下的欧拉函数计算)。还探讨了如何用线性筛法降低求解欧拉函数的时间复杂度。
摘要由CSDN通过智能技术生成

欧拉相关公式的结论

  • 欧拉函数定义:设n是一个正整数,欧拉函数 φ ( n ) φ(n) φ(n)为1~n的所有与n互素的数的个数。

    • 例子: φ ( 6 ) = 2 ,即 1 , 2 , 3 , 4 , 5 , 6 中与 6 互素的有 1 , 5 φ(6)=2,即1,2,3,4,5,6中与6互素的有1,5 φ(6)=2,即123456中与6互素的有15
  • 欧拉定理:设一个正整数m,a是一个整数且a与m互素(互质),即gcd(a,m) = 1,则有 a φ ( m ) ≡ 1 ( m o d   m ) a^{φ(m)}≡1(mod\ m) aφ(m)1(mod m)。该公式表示:a的 φ ( m ) φ(m) φ(m)次幂后对m取模与1同余。

    • 例子: a = 5 , m = 6 , 则 5 与 6 互素, φ ( 6 ) = 2 , − − > 5 φ ( 6 ) m o d   6 = 5 2   m o d   6   = 1 a =5, m = 6, 则5与6互素,φ(6)=2, -->5^{φ(6)} mod\ 6 = 5^2\ mod\ 6\ =1 a=5,m=6,56互素,φ(6)=2,>5φ(6)mod 6=52 mod 6 =1

  • 欧拉函数的相关定理:

  • 定理一:设p和q是互素的正整数,则 φ ( p q ) = φ ( p ) φ ( q ) φ(pq)=φ(p)φ(q) φ(pq)=φ(p)φ(q)

    • 由定理一可知:欧拉函数是一个积性函数
    • 推论
      • n = p 1 α 1 p 2 α 2 . . . . p k α k n = p_1^{α_1}p_2^{α_2}....p_k^{α_k} n=p1α1p2α2....pkαk,其中 p 1 , p 2 , p 3 . . . p k p_1,p_2,p_3...p_k p1,p2,p3...pk互素, a 1 , a 2 , a 3 . . a k a_1,a_2,a_3..a_k a1,a2,a3..ak为相应的幂,则 φ ( n ) = φ ( p 1 α 1 ) φ ( p 2 α 2 ) . . . . φ ( p k α k ) φ(n) = φ(p_1^{α_1})φ(p_2^{α_2})....φ(p_k^{α_k}) φ(n)=φ(p1α1)φ(p2α2)....φ(pkαk),其中 p 1 α 1 , p 2 α 2 , . . . . p k α k p_1^{α_1},p_2^{α_2},....p_k^{α_k} p1α1p2α2....pkαk也互素
      • 例子:n=84, 84 = 2 2 ∗ 3 ∗ 7 , φ ( 84 ) = φ ( 2 2 ∗ 3 ∗ 7 ) = φ ( 2 2 ) φ ( 3 ) φ ( 7 ) 84 = 2^2*3*7,φ(84)=φ(2^2*3*7)=φ(2^2)φ(3)φ(7) 84=2237φ(84)=φ(2237)=φ(22)φ(3)φ(7)
  • 定理二:设n为正整数,那么 n = Σ d ∣ n φ ( d ) , 其中 d 为 n 的因子 n =Σ_{d|n}φ(d),其中d为n的因子 n=Σdnφ(d),其中dn的因子

  • 定理三:设 n = p 1 α 1 p 2 α 2 . . . . p k α k n=p_1^{α_1}p_2^{α_2}....p_k^{α_k} n=p1α1p2α2....pkαk,为n的质因数分解(即分解成素数的乘积),则有:
    φ ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) = φ ( p 1 α 1 ) φ ( p 2 α 2 ) . . . . . . . φ ( p k α k ) 若, N 为质数,则 φ ( N ) = N − 1 (其前面 N − 1 个数都与其互质) 若, N = p k , p 是素数,则 φ ( N ) = p k − p k − 1 ,即, p 是质数,则与 p 不互质的数一定为 p 的倍数,那么,在 P k 范围内,共有 p k − 1 个倍数。 φ(N)=N(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\\=φ(p_1^{α_1})φ(p_2^{α_2}).......φ(p_k^{α_k})\\ 若,N为质数,则φ(N)=N-1(其前面N-1个数都与其互质)\\ 若,N=p^k,p是素数,则φ(N) = p^k-p^{k-1},即,p是质数,则与p不互质的数一定为p的倍数,那么,在P^k范围内,共有p^{k-1}个倍数。 φ(N)=N(1p11)(1p21)...(1pk1)=φ(p1α1)φ(p2α2).......φ(pkαk)若,N为质数,则φ(N)=N1(其前面N1个数都与其互质)若,N=pkp是素数,则φ(N)=pkpk1,即,p是质数,则与p不互质的数一定为p的倍数,那么,在Pk范围内,共有pk1个倍数。


相关公式的模板题

  • 题目来源:Acwing 873:欧拉函数

  • 试除法分解质因数+公式 φ ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) φ(N)=N(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k}) φ(N)=N(1p11)(1p21)...(1pk1)求解单欧拉函数

    • 时间复杂度: O ( n ) O(\sqrt{n}) O(n )
    	#include<iostream>
    	using namespace std;
    	void get_euler(int a) //即求互质个数
    	{
    	    int sum = a; //N*(1-1/p1)(1-1/p2)...
    	    for(int i = 2; i <= a/i; i++) //分解质因数
    	    {
    	        if(a % i == 0)
    	        {
    	            while(a % i == 0)
    	            {
    	                a /= i;
    	            }
    	            sum = sum / i * (i-1);
    	        }
    	    }
    	    if(a > 1) sum = sum / a * (a - 1);
    	
    	    cout << sum << endl;
    	}
    	
    	int main()
    	{
    	    int n;
    	    cin>>n;
    	
    	    for(int i = 0; i < n; i++)
    	    {
    	        int a;
    	        cin>>a;
    	        get_euler(a);
    	    }
    	    return 0;
    	}
    
  • 题目来源:Acwing 874:筛法求欧拉函数

  • 求1~n的欧拉函数,可用线性筛降低时间复杂度至 O ( n ) O(n) O(n),若试除法,复杂度为 O ( n n ) O(n\sqrt{n}) O(nn )

    • 原理:
    • 一个质数p的欧拉函数显然有p-1个,因为从1~p-1都与p互质。
    • n = p k , p 是质数,则与 p 不互质的数一定为 p 的倍数,那么,在 P k 范围内,共 p k − 1 个倍数 n=p^k, p是质数,则与p不互质的数一定为p的倍数,那么,在P^k范围内,共p^{k-1}个倍数 n=pk,p是质数,则与p不互质的数一定为p的倍数,那么,在Pk范围内,共pk1个倍数
    #include<iostream>
    using namespace std;
    
    const int N = 1e6+10;
    
    
    int phi[N];//欧拉函数集,1~n,每一个除了质数就是合数,合数一定由质数组成,那么,每一个都会存下互素个数
    int primes[N]; //存素数(质数),需要用时,直接用p,or:(p-1)。
    int cnt;
    bool vis[N]; //筛合数
    
    
    int euler(int n)
    {
        phi[1] = 1; //规定,1的互素个数为1,也为1本身。其余的正整数互素个数是  没有  本身的。
        for(int i = 2; i <= n; i++) //求1~n所有素数
        {
            if(!vis[i]) 
            {
                primes[cnt++] = i; //素数
                phi[i] = i-1;//素数前有i-1个数字与其互素
            }
            //欧拉筛
            for(int j = 0; j < cnt; j++)//筛掉倍数
            {
                if(primes[j] * i > n) break; //只需要1~n范围内的
                vis[primes[j] * i] = true;
                //保证最小质数筛
                if(i % primes[j] == 0) 
                {
                    //求欧拉函数:此时i与j不互素,由欧拉推论:phi(i*p) = phi(i)*prime[p]-->p*phi(i)(i=p^k...只要有约数就可以用)
                    phi[primes[j] * i] = primes[j]*phi[i];
                    break;//确保了不会再再算下面的互质情况
                }
                //如果互素
                phi[primes[j] * i] = phi[i] * (primes[j] - 1); //即phi[i] * phi[primes[j]],即:phi(pq) = phi(p)phi(q),每一个质数其前面都有(prime[j]-1个互素的数字,即p有p-1个)
            }
    
        }
    }
    
    int main()
    {
        int n;
        cin>>n;
        euler(n);
        long long sum = 0; //爆数据了
        for(int i = 1; i <= n; i++)
            sum += phi[i];
        cout<<sum<<endl;
        return 0;
    }
    
  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值