当前位置: 首页 > news >正文

欧拉函数

欧拉函数

欧拉函数就是求小于 n n n且与 n n n互质的整数个数

n n n的唯一分解式为 n = p 1 a 1 p 2 a 2 . . . p n a n n=p_1^{a_1}p_2^{a_2}...p_n^{a_n} n=p1a1p2a2...pnan

φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_n}) φ(n)=n(1p11)(1p21)...(1pn1)

求欧拉函数

求单个数的欧拉函数

ll euler_phi(ll n) {
    int m = sqrt(n + 0.5);
    ll ans = n;
    for (int i = 2; i <= m; i++) {
        if (n % i == 0) {
            ans = ans / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}

埃氏筛法求欧拉函数

根据上述公式,类似埃氏筛,每求得一个素数就更新其倍数所有的 p h i phi phi

int phi[maxn];

void phi_table(int n) {
    memset(phi, 0, sizeof phi);
    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);
            }
        }
}

欧拉筛法求欧拉函数

使用此方法需要知道欧拉函数的以下性质:

  • 对于素数 p p p,若 n % i = = 0 n\%i==0 n%i==0,那么 φ ( p n ) = p ∗ φ ( n ) \varphi(pn)= p*\varphi(n) φ(pn)=pφ(n);若 n % i ! = 0 n\%i!=0 n%i!=0,那么 φ ( p n ) = φ ( p ) φ ( n ) = ( p − 1 ) ∗ φ ( n ) \varphi(pn)= \varphi(p)\varphi(n) = (p-1)*\varphi(n) φ(pn)=φ(p)φ(n)=(p1)φ(n)
  • n n n为某一素数的幂次,那么 φ ( p a ) = ( p − 1 ) ∗ p a − 1 \varphi(p^a)=(p-1)*p^{a-1} φ(pa)=(p1)pa1

证明:
在这里插入图片描述

vector<int> prime;
bitset<maxn> vis;
int phi[maxn];

void euler() {
    phi[1] = 1;
    for (int i = 2; i < maxn; i++) {
        if (!vis[i]) {
            phi[i] = i - 1;
            prime.push_back(i);
        }
        for (int j = 0; j < prime.size() && i * prime[j] < maxn; j++) {
            vis[i * prime[j]] = 1;
            if (i % prime[j]) {
                prime[i * prime[j]] = phi[i] * (prime[j] - 1);
            } else {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
        }
    }
}

性质

  1. m , n m,n m,n互质时,有 φ ( m ∗ n ) = φ ( m ) ∗ φ ( n ) \varphi(m*n)= \varphi(m)*\varphi(n) φ(mn)=φ(m)φ(n)

  2. 对于素数 p p p,若 n % i = = 0 n\%i==0 n%i==0,那么 φ ( p n ) = p ∗ φ ( n ) \varphi(pn)= p*\varphi(n) φ(pn)=pφ(n);若 n % i ! = 0 n\%i!=0 n%i!=0,那么 φ ( p n ) = φ ( p ) φ ( n ) = ( p − 1 ) ∗ φ ( n ) \varphi(pn)= \varphi(p)\varphi(n) = (p-1)*\varphi(n) φ(pn)=φ(p)φ(n)=(p1)φ(n)

  3. 对于互质的 x x x p p p,有 x φ ( p ) ≡ 1 ( m o d   p ) x^{\varphi(p)}≡1(mod~p) xφ(p)1(mod p),因此 x x x的逆元为 x φ ( p ) − 1 x^{\varphi(p)}-1 xφ(p)1,即欧拉定理。特别地,当 p p p为质数时, φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1,此时逆元为 x p − 2 x^{p-2} xp2,即费马小定理 x p − 1 ≡ 1 ( m o d    p ) x^{p-1} \equiv 1(mod~~p) xp11(mod  p)

  4. n n n为奇数时, φ ( 2 ∗ n ) = φ ( n ) \varphi(2*n)=\varphi(n) φ(2n)=φ(n)

    证明:因为 n n n为奇数,那么 2 n 2n 2n为偶数,偶数和偶数一定不互素,所以只需考虑 2 n 2n 2n和小于它的奇数互素的情况

  5. n > 1 n>1 n>1,不大于 n n n且和 n n n互质的所有正整数的和是 φ ( n ) ∗ n 2 \frac{\varphi(n)*n}{2} 2φ(n)n

相关文章:

  • UVA - 1636 Headshot(条件概率)
  • Oracle RAC日常基本维护命令
  • UVA - 11181 Probability|Given(条件概率+状压dfs)
  • UVA - 1637 Double Patience(全概率+记忆化搜索)
  • Oracle检查对象[第八章笔记]
  • 魔法数字(dfs/bfs)
  • Win32 OpenGL编程(8) 3D模型变换及其组合应用
  • 牛妹的春游(二维费用背包+技巧)
  • 2019 ICPC 南京区域赛 - C Digital Path(多段图DP)
  • 去年我们在哪儿?——09年SD2.0大会侧记(2)
  • 2019 CSP-J 纪念品(完全背包+思维)
  • 从MTK的BIN文件里提取图片资源
  • 无题(Floyd的理解)
  • 一个MTK的百叶窗特效
  • 无题(贪心+优先队列)
  • __proto__ 和 prototype的关系
  • Android优雅地处理按钮重复点击
  • Centos6.8 使用rpm安装mysql5.7
  • EOS是什么
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue-cli在webpack的配置文件探究
  • 成为一名优秀的Developer的书单
  • 深度学习在携程攻略社区的应用
  • 怎样选择前端框架
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Semaphore
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 整理一些计算机基础知识!
  • (1)SpringCloud 整合Python
  • (11)MATLAB PCA+SVM 人脸识别
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二十四)Flask之flask-session组件
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转) Android中ViewStub组件使用
  • (转)mysql使用Navicat 导出和导入数据库
  • *1 计算机基础和操作系统基础及几大协议
  • .Family_物联网
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 反射的使用
  • .net 中viewstate的原理和使用
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET6 命令行启动及发布单个Exe文件
  • .stream().map与.stream().flatMap的使用
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [20171113]修改表结构删除列相关问题4.txt
  • [20190416]完善shared latch测试脚本2.txt
  • [AIGC] Spring Interceptor 拦截器详解
  • [Angular] 笔记 21:@ViewChild