zoukankan      html  css  js  c++  java
  • 数论篇6——欧拉函数

    欧拉函数

    记作$varphi (n)$,表示小于等于n的数中与n互质的数的数目。(根据定义,phi(1)=1)

    通式

    $$varphi(x)=xprod_{i=1}^{n}(1-frac{1}{p_{i}})$$其中$p_{i}$为$x$的所有质因数。

    举个例子:

    比如$varphi (12)$,把12质因数分解,$12=2 imes 2 imes 3$,得到了2和3两个质因数,然后把2的倍数和3的倍数都删掉

    2的倍数:$2,4,6,8,10,12$

    3的倍数:$3,6,9,12$

    如果直接用$12 - 12/2 - 12/3$,那么6和12就重复减了,所以还要把即是2的倍数又是3的倍数的数加回来,所以这样写$12 - frac{12}{2} - frac{12}{3} + frac{12}{2 imes 3}$

    然后变形一下

    $$varphi (12)   =   12 imes (1 - frac{1}{2} - frac{1}{3} + frac{1}{6})= 12 imes (1 - frac{1}{2}) imes (1 - frac{1}{3}) $$

    其实就是容斥原理,可以得到求解公式$$varphi (n)=n imes (1-frac{1}{p_1}) imes(1-frac{1}{p_2}) imes ... imes(1-frac{1}{p_n})$$即$$varphi(x)=xprod_{i=1}^{n}(1-frac{1}{p_{i}})$$其中$p_{1}......p_{n}$为n的素因子。

    基本性质

    (1)规定,$varphi(1)=1$

    (2)当$p$为质数,$varphi(p^{k})=p^{k}-p^{k-1}$

    (3)当$p$为质数,有$varphi(p)=p-1$

    (4)欧拉函数是积性函数,也就是若$m$和$n$互质,则$varphi(m imes n)=varphi(m) imes varphi(n)$

    (5)当$p$为质数,如果$i mod p=0$,那么$varphi (icdot p)=varphi(i)cdot p$ 

    证明:

    根据$varphi(x)=xprod_{i=1}^{n}(1-frac{1}{p_{i}})$,因为p是i的因子,所以$$varphi(xcdot p)=pcdot xprod_{i=1}^{n}(1-frac{1}{p_{i}})=varphi(x) imes p$$

    (6)当$p$为质数,如果$i mod p eq 0$,那么$varphi (icdot p)=varphi(i)cdot (p-1)$ 

    求解方法

    直接求

    使用通式直接求

    //欧拉函数
    int phi(int x) {
        int ans = x;
        for (int i = 2; i * i <= x; i++) {
            if (x % i == 0) {
                ans = ans / i * (i - 1);//先做除法,防止溢出
                while (x % i == 0) x /= i;
            }
        }
        if (x > 1) ans = ans / x * (x - 1);
        return ans;
    }

    复杂度是$O(sqrt {n})$,如果要你求n个数的欧拉函数,复杂度是$O(nsqrt {n})$,太慢了。

    打表

    埃氏筛思想

    const int N = 100000 + 5;
    int phi[N];
    void getPhi() {
        phi[1] = 1;
        for (int i = 2; i < N; i++) {
            if (!phi[i]) {
                for (int j = i; j < N; j += i) {
                    if (!phi[j]) 
                        phi[j] = j;
                    phi[j] = phi[j] / i * (i - 1);
                }
            }
        }
    }

     时间复杂度和埃氏筛一样,是$O(ncdot loglogn)$,基本上满足要求了。

    线性筛法(欧拉筛思想)

    借助欧拉函数的性质 的这两条性质,我们还可以继续优化一下,能够做到复杂度$O(n)$

    如果p是质数

    (1)如果$i mod p=0$,那么$varphi (icdot p)=varphi(i)cdot p$
    (2)如果$i mod p eq 0$,那么$varphi (icdot p)=varphi(i)cdot (p-1)$(这条不用证明)
    const int N = 100000 + 5;
    int phi[N], prime[N], cnt = 0;
    void Euler() {
        phi[1] = 1;
        for (int i = 2; i < N; i++) {
            if (!phi[i]) {
                phi[i] = i - 1;
                prime[cnt++] = i;
            }
            for (int j = 0; j < cnt && i * prime[j] < N; j++) {
                if (i % prime[j])
                    phi[i * prime[j]] = phi[i] * (prime[j] - 1);
                else {
                    phi[i * prime[j]] = phi[i] * prime[j];
                    break;
                }
            }
        }
    }

    公式拓展

    求$a^{b}\%p$

    公式1:a,p互质,$a^{b}mod p=a^{b\% varphi (p)}mod p$

    根据 $a^{varphi(p)} equiv 1(mod p)$ (欧拉定理)

    令 $$b\% varphi (p)=t$$

    则 $$b=kcdot varphi(p)+t (k=0,1,2,3...)$$

    根据$$a^{varphi(p)} equiv 1(mod p),a^{kcdot varphi(p) }mod p=(a^{varphi(p)}mod p)^k=1$$

    有$$a^{b}mod p=a^{kcdot varphi(p)+t}mod p=(a^{kcdot varphi(p)}mod p)*a^{t}mod p)mod p=a^{t}mod p$$
    所以
    $$a^{b}mod p=a^{b\% varphi (p)}mod p$$

    公式2:a,p不互质,$a^bequiv a^{bmod varphi(p)+varphi(p)}pmod p$

    原理:

    扩展欧拉定理

    先挖个坑,过两天再填。

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/czc1999/p/11707540.html
Copyright © 2011-2022 走看看