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$

    原理:

    扩展欧拉定理

    先挖个坑,过两天再填。

  • 相关阅读:
    题目:返回一个整数数组中最大子数组的和。(要求程序必须能处理1000 个元素)
    四则运算三(接受用户输入答案,并判断对错。)
    二维数组
    结对开发(一位数组)
    测试四则运算
    四则运算2
    程序设计思路
    项目计划总结
    小学二年级题目的改进
    二年级题目的改进
  • 原文地址:https://www.cnblogs.com/czc1999/p/11707540.html
Copyright © 2011-2022 走看看