数论篇6——欧拉函数

欧拉函数

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

通式

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

举个例子:

比如$\varphi (12)$

把12质因数分解,$12=2\times 2\times 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\times 3}$

然后变形一下

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

其实就是容斥原理,可以得到求解公式$$\varphi (n)=n\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})\times ...\times(1-\frac{1}{p_n})$$即$$\varphi(x)=x\prod_{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\times n)=\varphi(m)\times \varphi(n)$

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

(6)当$p$为质数,如果$i\ mod\ p\neq 0$,那么$\varphi (i\cdot 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(n\sqrt {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(n\cdot loglogn)$,基本上满足要求了。

线性筛法(欧拉筛思想)

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

如果p是质数

(1)如果$i\ mod\ p=0$,那么$\varphi (i\cdot p)=\varphi(i)\cdot p$
证明:
根据$\varphi(x)=x\prod_{i=1}^{n}(1-\frac{1}{p_{i}})$,因为p是i的因子,所以$$\varphi(x\cdot p)=p\cdot x\prod_{i=1}^{n}(1-\frac{1}{p_{i}})=\varphi(x)\times p$$
(2)如果$i\ mod\ p\neq 0$,那么$\varphi (i\cdot 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=k\cdot \varphi(p)+t\ (k=0,1,2,3...)$$

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

有$$a^{b}mod\ p=a^{k\cdot \varphi(p)+t}mod\ p=(a^{k\cdot \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^b\equiv a^{b\bmod \varphi(p)+\varphi(p)}\pmod p$

原理:

扩展欧拉定理

先挖个坑,过两天再填。

猜你喜欢

转载自www.cnblogs.com/czc1999/p/11707540.html