java很少要用到非常复杂的算法,因为这门语言被创建就不是为了表述数学概念或是计算算法的。但有很多知识已经更偏向于算法概念,而且我们必须掌握。因为如果你一点都不了解,当面试官问你有关数论的问题的时候你只能说“不会”,如果你掌握了一些基础概念,做简单数论题目不会太费力,但是如果你对同余、原根、欧拉函数、扩展阿基米德、贝祖等式这些概念一点了解都没有,那你连思考的权利都没有了,当别人飞快的打代码时,你连题目都看不懂。
小于n且与n互质的数目 欧拉函数
精挑细选后,我们从欧拉函数开始学起,因为欧拉函数比较容易理解,且不涉及其他概念,而其他知识点会用到欧拉函数。欧拉函数φ(x)表示:对于正整数x,存在正整数a满足:x>a且(x,a)=1的a的数目。注:φ(1)=1。
(x,a)=1等价于gcd(x,a)=1,表示x和a的最大公因数为1,即x与a互质。
欧拉函数fai(x)表示:对于正整数x,存在正整数a满足:x>a且(x,a)=1的a的数目。
欧拉函数通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn)
其中p1、p2、p3…pn是x的不同质因数,x为正整数。
特殊性质:
- 除了φ(2)=1,当x为偶数时,φ(x)均为偶数。
- 欧拉函数是积性函数:如果(n,m)=1,φ(n*m)=φ(n)*φ(m)。
- 当x为奇数时,φ(2x)=φ(x)。
- 当x为素数时,φ(x)=x-1。
欧拉函数为我们阐释了一个快速求比n小且与n互素的数字数目的方法。欧拉函数有什么用呢?单独来说还没有什么用,但是别担心,欧拉函数很快会被用到其他更加复杂的定理与公式中。
那我们如何用代码实现欧拉函数呢?正确的做法是从通式入手,对于通式φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn),我们将每个括号中的内容通分,通过循环判断x的最小质因数,将保存结果的变量减去该质因数除以x,之后再用一个while循环,将x相同的质因数全部除去。
import java.util.Scanner;
public class Main {
public static void