• 欧拉函数介绍及简单模板


    欧拉函数:对于一个正整数n,小于n且与n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。

    特殊性质:当n为奇数时,φ(2n)=φ(n)。

    当n为素数时:φ(n) = n - 1;

    (1)φ(n) = n * (1 - 1/p1) * (1 - 1 / p2) * ... * (1 - 1 / pn)    (pi是n的质因子)

    求小于n且与n互质的数有多少个

    http://poj.org/problem?id=2407

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    const ll INF = 0x3f3f3f3f;
    
    int main()
    {
        ll n;
        while(~scanf("%lld", &n), n)
        {
            ll ans = n;
            for(ll i = 2 ; i * i <= n ; i++)
            {
                if(n % i == 0)
                {
                    ans -= ans / i;
                    while(n % i == 0)
                    {
                        n /= i;
                    }
                }
            }
            if(n > 1)
                ans -= ans / n;
            printf("%lld
    ", ans);
        }
        return 0;
    }

    (2)当n = p^k时,φ(n)  = φ(p^k) = p^k - p^(k - 1)

    证明:比p^k小的数总共有p^k - 1个,与p^k不互质的数有:

     p*1, p * 2, p * 3, ... , p^k - p(即p(p^(k - 1)- 1))共p^(k - 1)- 1个

    所以与p^k互质的数有p^k - 1 - (p^(k - 1)- 1) = p^k - p^(k - 1)个

    即φ(n)  = φ(p^k) = p^k - p^(k - 1)

    (3)当n = p * q 时,φ(n) = φ(p * q) = φ(p) * φ(q), gcd(p, q) = 1;

    原根:
     
    如果a不被素数p整除,则a模p的阶是指使得a^e=1(mod m)(即a^e % m = 1)的最小指数e>=1;例如2、3、4、5、6模7的阶分别是3、6、3、6、2。
     
    一个重要的性质:一个数a模m的阶e总能整除m-1。
     
     
    设m是正整数,a是整数,若a模m的阶等于φ(m)(即a^φ(m) % m = 1),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数
     
    奇素数p的原根个数 = φ(p - 1)
     
     
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
        int n;
        while(~scanf("%d", &n))
        {
            n = n - 1;
            int ans = n;
            for(int i = 2 ; i * i <= n ; i++)
            {
                if(n % i == 0)
                {
                    ans -= ans / i;
                    while(n % i == 0)
                        n /= i;
                }
            }
            if(n > 1)
                ans -= ans / n;
            printf("%d
    ", ans);
        }
        return 0;
    }
     
  • 相关阅读:
    第二周:对Java面向对象的特点的基本感受
    第一周学习情况
    插入排序
    快速排序
    vue传值(小demo)
    Vue下简单分页及搜索功能
    js超简单冒泡算法
    vue框架中实现今天昨天前天最近时间
    vue简单的v-for
    ssm web.xml配置解析
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4920404.html
Copyright © 2020-2023  润新知