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

2023-12-11java编程
99

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

欧拉函数,又称为“φ函数”,表示小于等于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。

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

The End

相关推荐

一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用
Lambda表达式是Java 8中引入的新特性之一,它是一个匿名函数,可以捕获参数并表现为一个代码块,而不像方法一样需要一个固定的名称。它主要用于传递行为或代码块以及事件处理等操作。...
2023-12-11 java编程
30

基于Java 谈回调函数
下面为您详细讲解基于Java的回调函数。...
2023-12-11 java编程
21

java equals函数用法详解
在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自...
2023-12-11 java编程
63

JavaWeb学习笔记分享(必看篇)
JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。...
2023-12-11 java编程
8

Java中replace、replaceAll和replaceFirst函数的用法小结
在Java编程中,字符串操作是很常见的,而替换字符串是其中常用的操作之一。Java提供了三种函数用于替换字符串:replace、replaceAll和replaceFirst。这篇文章将为您详细介绍它们的用法。...
2023-12-11 java编程
121

基于Java中进制的转换函数详解
进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。...
2023-12-11 java编程
45