Java欧拉函数的计算代码详解

首先介绍下欧拉函数的定义:

欧拉函数,又称为“φ函数”,表示小于等于n的正整数中有多少个与n互质。记做φ(n)。

Java中计算欧拉函数的代码如下(假设要计算的数为n):

public static int eulerFunction(int n) {
    int res = n;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res = res / i * (i - 1);
            while (n % i == 0) {
                n /= i;
            }
        }
    }
    if (n > 1) {
        res = res / n * (n - 1);
    }
    return res;
}

这段代码中,我们需要对n的每个质因数i进行操作,res就是最终结果,初始值为n本身,然后对于每个i:

  • 如果i是n的质因数,我们需要将res除以i,然后乘上i-1,这是因为对于每个i,该质因数与n的其他质因数都互斥,我们只需要将互斥的质因数个数乘起来即可。同时,我们需要将n变为n/i的值,因为我们已经统计了i这个质因数。
  • 如果i不是n的质因数,我们什么都不用做,继续找下一个质因数。

最后,如果n最终仍然大于1,由于n是质因数,所以直接将res除以n,然后乘上n-1即可。

示例1:计算n为10的欧拉函数,即φ(10)。

用上面的代码进行计算,得到res的初始值为10。然后我们发现2是10的一个质因数,于是执行如下操作:

res = res / 2 * (2 - 1);  // res变为5
n = 10 / 2;  // n变为5

接着我们发现3不是10的质因数,继续往下找,发现5是10的质因数,于是执行如下操作:

res = res / 5 * (5 - 1);  // res变为4
n = 5 / 5;  // n变为1

此时n已经为1了,循环结束,最终结果为4,即φ(10)=4。

示例2:计算n为21的欧拉函数,即φ(21)。

用上面的代码进行计算,得到res的初始值为21。然后我们发现2不是21的质因数,于是继续往下找,发现3是21的一个质因数,于是执行如下操作:

res = res / 3 * (3 - 1);  // res变为12
n = 21 / 3;  // n变为7

此时7不是完全平方数,继续往下找,发现7是21的一个质因数,于是执行如下操作:

res = res / 7 * (7 - 1);  // res变为6
n = 7 / 7;  // n变为1

此时n已经为1了,循环结束,最终结果为6,即φ(21)=6。

希望上面的解释能够帮到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java欧拉函数的计算代码详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java之Spring简单的读取和存储对象

    Java之Spring简单的读取和存储对象 在Java开发中,Spring框架是一个非常优秀的框架,其提供了丰富的功能,其中包括对象的读取和存储。本文将详细讲解Spring框架中简单的读取和存储对象的攻略。 存储对象 Spring框架中存储对象的方式主要有两种,分别是JdbcTemplate和HibernateTemplate。 使用JdbcTemplate…

    Java 2023年5月19日
    00
  • 详解spring整合hibernate的方法

    下面是详解spring整合hibernate的方法的完整攻略: 一、准备工作 1.1 项目结构 首先,我们需要新建一个Maven项目,并在其中引入Spring和Hibernate的相关依赖,具体的pom.xml文件可以参考以下代码: <!– Spring –> <dependency> <groupId>org.spr…

    Java 2023年5月19日
    00
  • Java字符串比较方法equals的空指针异常的解决

    Java中,字符串比较方法equals是常用的判断两个字符串是否相等的方法,但在使用equals方法比较字符串时,若其中一个字符串为null,就会抛出空指针异常,如下所示: String str1 = "Hello World"; String str2 = null; if (str1.equals(str2)) { //空指针异常 S…

    Java 2023年5月27日
    00
  • Spring Security在标准登录表单中添加一个额外的字段

    接下来我将为您详细讲解“Spring Security在标准登录表单中添加一个额外的字段”的攻略。 1. 概述 Spring Security是一个非常受欢迎的安全框架,在实现用户认证和授权等方面提供了很多强大的功能。在标准的登录表单中,只包含了用户名和密码两个字段。但是,在某些情况下,我们可能需要添加额外的表单字段用于用户登录。本文将介绍如何在Spring…

    Java 2023年5月20日
    00
  • Linux 查看空间使用情况的实例详解

    Linux 查看空间使用情况的实例详解 Linux 文件系统的空间使用率不容忽视。虽然 Linux 操作系统的存储空间非常大,但在服务器运行一段时间后,可能会发现服务器的可用空间急剧减少而百思不得其解。因此,理解如何查看Linux文件系统的空间使用情况是非常有必要的。 在 Linux 中,有许多工具可用于检查和监视文件系统空间使用情况。本文将介绍一些最常用的…

    Java 2023年5月20日
    00
  • 常见的并发集合有哪些?

    常见的并发集合是指线程安全的集合类,用于在多线程的环境下进行数据操作。Java中提供了多种并发集合,常见的包括ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentSkipListMap、ConcurrentSkipListSet等,下面就这些集合类进行详细讲解和使用攻略。 …

    Java 2023年5月10日
    00
  • Java实现监听文件变化的三种方案详解

    Java实现监听文件变化的三种方案详解 在Java编程中,经常需要对文件进行监听,以便在文件发生更新时及时做出相应的处理。下面将介绍三种实现文件监听的方案,分别是Java 7的WatchService、commons-io库、以及第三方库jnotify。 1. Java 7的WatchService Java 7引入了WatchService API,它可以…

    Java 2023年5月20日
    00
  • springMVC配置环境实现文件上传和下载

    SpringMVC配置环境实现文件上传和下载的完整攻略 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速开发Web应用程序。在SpringMVC中,我们可以使用MultipartResolver来实现文件上传,使用ResponseEntity来实现文件下载。本文将介绍如何配置SpringMVC环境,实现文件上传和下载,并提供两个示例说明。…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部