欧拉函数:求小于等于n且与n互质的数的个数

简介: 求小于等于n且与n互质的数的个数互质穷举法互质:两个数互质代表两者最大公约数为1最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值辗转相除法:较大的数a取模较小的数b,得取模值c若取模值等于0 则最大公约数为取模值,否则继续下一步a与c再次取模,回到第二步//求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 结束最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/g

👏 Hi! 我是 Yumuing,一个技术的敲钟人

👨‍💻 每天分享技术文章,永远做技术的朝拜者

📚 欢迎关注我的博客:Yumuing's blog

求小于等于n且与n互质的数的个数

互质穷举法

  1. 互质:两个数互质代表两者最大公约数为1
  2. 最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值
  3. 辗转相除法:
    1. 较大的数a取模较小的数b,得取模值c
    2. 若取模值等于0 则最大公约数为取模值,否则继续下一步
    3. a与c再次取模,回到第二步
      //求最大公约数gcd以及最大公倍数lcm
      // 36 24 36/24
      // 24 12 24/12
      // 0 结束最大公约数为12
      // 求最小公倍数
      // lcm(a, b) = (a * b)/gcd(a, b)
      public static int gcd(int a, int b){
             
             
        //a>=b
        //辗转相除法
        if (b==0){
             
             
            return a;
        }
        return gcd(b,a%b);
      }
      
  4. 穷举到n,一一判断该数与n的最大公约数是否为1,即是否为互质

结论:可以实现,但时间复杂度太高

采取欧拉函数进行求取

在数论,对正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目.

n为正整数n,p1、p­­­­2 ……pn 为正整数n的质因数

n的质因数:既是n的因数,又是质数的数

计算方法:
$$ \phi (n) = n \times (\frac{p_1-1}{p_1})\times (\frac{p_2-1}{p_2})\cdots\times (\frac{p_n-1}{p_n}) $$
例:
$$ \phi (10) = 10 \times \frac{1}{2}\times \frac{4}{5} = 4 $$

  1. 质数的求法:因数只有1和其本身

    1. 单个质数n的判断

      依次判断2到$ \sqrt{n} $的数被n取模的值是否等于零,存在任意一个即不为质数

      当p大于$\sqrt{n}$时,代表数p一定可以得到一个小于!$\sqrt{n}$的数和一个大于$\sqrt{n}$的成对因数,不为质数

    2. 从2到n的质数的判断

      非穷举,穷举时间复杂度为O(n),使用素数筛法为O($\log_{}{n}$)

      为保证效率,质数为false,合数为true

      1. 标记2到n的数都为质数,为false,布尔数组默认值为false,无需再一一标记

      2. 从2开始标记数,找到第一个为false的数p

      3. 标记数p的倍数为合数,即为true,倍数标记从 $p \times p$ 开始,直至数p等于$ \sqrt{n} $,结束标记

        原因:

        p的倍数的因数必有p,不符合质数条件,每次从 $p \times p$ 开始标记是由于$p-p$的部分已经进行了标记,不再重复标记,

4) 使得下一个数p 为未被标记为合数的数,即数值仍为false的数,重复第三步

5) 将标记为false 的,即为质数的全部输出

  1. 采取素数筛法求取质数时,可将倍数标记的操作修改为乘以(1-1/p),使得每一个数都能乘以其质因数

img

  1. 依次存入数组中,最后统一依次输出结果。

    public static int f1(int n){
         
         
          int res = n;
          for (int i = 2;i*i<=n;i++){
         
         
              if (n % i==0){
         
         
                  res = res / i*(i-1);//res/i
                  while (n % i == 0){
         
         
                      n/=i;
                  }
              }
          }
          if (n>1){
         
         
              res = res/n*(n-1);
          }
          return res;
      }
      //区间内欧拉函数取值
      public static int[] f2(int n){
         
         
          int[] count = new int[n+1];
          for (int i = 1;i <= n;i++){
         
         
              count[i]=i;
          }
          for (int i =2 ;i <= n;i++){
         
         
              if (count[i] == i){
         
         
                  for (int j = i;j <= n;j+=i){
         
         
                      count[j] = count[j]/i*(i-1);
                  }
              }
          }
          return count;
      }
    

知识点:

  1. 最大公约数、最小公倍数

  2. 单一质数判断

  3. 质数筛法:埃氏筛法

  4. 欧拉函数

求点赞转发

目录
相关文章
|
JavaScript 前端开发 索引
用Three.js搞个炫酷3D地球
地球人怎么可以不会画地球!从canvas画地球贴图开始,用Three.js手把手教你实现一个炫酷的3D地球!
用Three.js搞个炫酷3D地球
|
10月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
378 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
8月前
|
机器人 数据安全/隐私保护
基于PID控制器的六自由度串联机器人控制系统的simulink建模与仿真
本课题基于MATLAB2022a的Simulink环境,对六自由度串联机器人控制系统进行建模与仿真,采用PID控制器实现关节的位置、速度或力矩控制。PID控制器通过比例、积分、微分三种策略有效减小系统误差,提高响应速度和稳定性。仿真结果显示系统运行良好,无水印。尽管PID控制简单实用,但在复杂动力学环境下,常结合其他控制策略以增强鲁棒性。
|
关系型数据库 MySQL
cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
|
9月前
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
1380 82
|
数据挖掘 Python
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
1315 0
|
机器学习/深度学习 缓存 自然语言处理
一文揭秘|预训练一个72b模型需要多久?
本文讲述评估和量化训练大规模语言模型,尤其是Qwen2-72B模型,所需的时间、资源和计算能力。
872 12
|
JSON 数据格式
DTHttpJson UE4插件使用说明
DTHttpJson UE4插件使用说明
769 0
|
存储 人工智能 弹性计算
自动化搭建专属 AI 绘图服务
本文介绍了如何使用通义万相AIGC技术和阿里云的计算和存储产品来搭建自己的AI绘画服务。首先,通过创建基础云产品资源和部署AI绘画服务的步骤来开始搭建服务。然后,介绍了模板的原理和内容,以及ROS编排引擎的作用。接下来,详细介绍了AI绘画服务的一键部署过程,包括定义参数、模板的编写和ROS的使用。最后,提到了应用运行环境的搭建和自定义应用页面的方法。通过ROS的自动化部署,用户可以方便快捷地拥有自己的AI绘画服务。