Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

    • 一些小问题
    • 二次剩余学习笔记
    • 卡特兰数学习笔记
    • 同余最短路学习笔记
    • 康托展开学习笔记
    • 快速傅里叶变换学习笔记
    • 拉格朗日插值学习笔记
    • 拓展欧几里得学习笔记
    • 斐波那契数列学习笔记
    • 斯特林数笔记
    • 本原勾股数组学习笔记
    • 模运算学习笔记
    • 欧拉函数
      • 性质
      • 求法
        • 计算单个数的欧拉函数
        • 线性筛
    • 类欧几里得学习笔记
    • 素性检测与大数分解
    • 素数计数问题
    • 组合数问题
    • 高斯整数学习笔记
  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

欧拉函数

仓促之下赶出来的笔记,以后再补充吧

# 欧拉函数

定义:

小于等于xxx中与xxx互质的数的个数,记作ϕ(x)\phi(x)ϕ(x)

(1与任何数互质)

特别的,ϕ(1)=1\phi(1)=1ϕ(1)=1

# 性质

  1. 欧拉函数为积性函数

    即对于互质的整数a,ba,ba,b,有ϕ(ab)=ϕ(a)ϕ(b)\phi(ab)=\phi(a)\phi(b)ϕ(ab)=ϕ(a)ϕ(b)

  2. ∑d∣nϕ(d)=n\sum_{d\mid n} \phi(d)=n∑d∣n​ϕ(d)=n

  3. [1,n][1,n][1,n]中与nnn互质的数的和为n×ϕ(n)2(n>1)n\times \frac{\phi(n)}{2}(n\gt 1)n×2ϕ(n)​(n>1)

    证明:若gcd(n,i)=1gcd(n,i)=1gcd(n,i)=1,则gcd(n,n−i)=1gcd(n,n-i)=1gcd(n,n−i)=1,这样的数成对出现且和为nnn

  4. aϕ(n)≡1modna^{\phi(n)}\equiv 1\mod naϕ(n)≡1modn

# 求法

# 计算单个数的欧拉函数

复杂度O(n)O(\sqrt{n})O(n​)

假设nnn为合数

当nnn为某一质数的幂,即n=pxn=p^xn=px(ppp为质数)时,有ϕ(n)=px−px−1\phi(n)=p^x-p^{x-1}ϕ(n)=px−px−1

否则,有

ϕ(n)=ϕ(p1x1p2x2⋯pyxk)=∏i=1k(pixi−pxi−1)=∏i=1kpixi−1(pi−1)=n∏i=1k(1−1pi)\begin{aligned}\phi(n)&=\phi(p_1^{x_1}p_2^{x_2}\cdots p_y^{x_k})\\&=\prod_{i=1}^k(p_i^{x_i}-p^{x_i-1})\\&=\prod_{i=1}^k p_i^{x_i-1}(p_i-1) \\&=n\prod_{i=1}^k(1-\frac{1}{p_i})\end{aligned} ϕ(n)​=ϕ(p1x1​​p2x2​​⋯pyxk​​)=i=1∏k​(pixi​​−pxi​−1)=i=1∏k​pixi​−1​(pi​−1)=ni=1∏k​(1−pi​1​)​

int GetPhi(int p) {
    int ans = 1;
    for(int i = 2; i * i <= p; i++) {
        if(p % i == 0) {
            int now = i - 1; p /= i;
            while(p % i == 0) now = now * i, p /= i;
            ans = ans * now;
        }
    }
    if(p != 1) ans *= (p - 1); 
    return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12

# 线性筛

  1. 若ppp为素数,ϕ(p)=p−1\phi(p)=p-1ϕ(p)=p−1

  2. 若nmodp≠0n \mod p \not= 0nmodp=0,且ppp为素数,

    ϕ(np)=ϕ(n)ϕ(p)=ϕ(n)(p−1)\phi(np)=\phi(n)\phi(p)=\phi(n)(p-1)ϕ(np)=ϕ(n)ϕ(p)=ϕ(n)(p−1)

  3. 若nmodp=0n \mod p =0nmodp=0,且ppp为素数

    ϕ(np)=ϕ(n)∗p\phi(np)=\phi(n)*pϕ(np)=ϕ(n)∗p

const int maxn = 1e5 + 1001;
int phi[maxn], prime[maxn], pcnt = 0;
bool not_prime[maxn];
void init(int n){
    not_prime[1] = true; 
    for(int i=2; i<=n; i++){
        if(!not_prime[i]) {
            prime[pcnt++] = i;
            phi[i] = i - 1;
        }
        for(int j=0; j<pcnt && i * prime[j] <= n; j++){
            not_prime[i * prime[j]] = true;
            if(i % prime[j] == 0){
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上次更新: 2021/02/24, 03:37:30
模运算学习笔记
类欧几里得学习笔记

← 模运算学习笔记 类欧几里得学习笔记→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式