美国上市公司,专注Java培训22年

每个程序员都应该知道的基础数论


这篇文章讨论了数论中每个程序员都应该知道的几个重要概念。本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是做为数论的一篇参考。

0. 皮亚诺公理

整个算术规则都是建立在 5 个基本公理基础之上的,这 5 个基本公理被称为皮亚诺公理。皮亚诺公理定义了自然数所具有的特性,具体如下:

0 是自然数;

每个自然数都有一个后续自然数;

0 不是任何自然数的后续自然数;

不同自然数的后续自然数不同;

如果集合 S 包含了数字 0,并且包含S中每一个数字的后续自然数,那么集合 S 就包含了所有的自然数。

上述第5个公理也被称为“数学归纳法的基础”。

通常,除了我们想要证明其他算术定理的情况,我们很少直接使用上述公理。但作为算术的基石,这些公理是值得我们去了解的。

1. 算术基本定理和除法运算法则

正如这个定理的名称所言,算术基本定理是数论中所有概念的核心。

算术基本定理含义如下:任何一个大于 1 的整数都可以以某种特定的方式写成质数的乘积的形式(这种特定方式取决于乘积中质数的顺序)。

例如,18 = 2 * 9, 1755 = 33 *5 * 13.

这个定理在几乎所有的数论运算法则中都扮演着十分重要的角色,例如求一个数的质数因子、最大公约数、除数的和等等。

想要证明这个定理其实很简单,实际上它是欧几里得第一个定理的一个推论(下面小节会讨论到)。

除法运算法则含义是说:给定两个整数a,b(b不等于0),那么存在两个整数q和r使得下面的等式成立:

a = bq + r, 0 <= r < b

通常我们把q称为商,而把r称为余数。如果r = 0,那么我就说b整除a,并且表示为:b | a.

2. 欧几里得定理

数学中两个重要定理,被称为“欧几里德的第一定理(或欧几里德的引理)”和“欧几里德的第二定理(通常简称为”欧几里德定理“),内容如下:

第一定理:p|ab => p|a or p|b。该定理的直接结论就是算术基本定理。

第二定理:质数的数量是无限的。有很多简单的证明方法。

虽然确实存在无限多的质数,但也应该记住,质数之间存在任意大的差值。换句话说,给定n的前提下,总是可以获得一些列的n个连续复合数。

3. 最大公约数、最小公倍数和贝祖定理

欧几里得算法是求两个数的最大公约数最常用的算法,而且也是一个很高效的算法,因为使用欧几里得算法求解两个数的最大公约数的算法步骤最多不会超过这两个数中较小的那个数的5倍。

最大公约数通常使用圆括号表示—— (a,b) 表示 a 和 b 的最大公约数。

类似地,最小公倍数通常使用方括号表示—— [a,b] 表示 a 和 b 的最小公倍数。

如果 (a,b) = 1,即 [a,b] = ab,此时我们称 a 和 b 互质。

如果 (a,b) = d,那么 (a/d,b/d) = 1。

最大公约数和最小公倍数之间的关系可以由一个非常简单的等式来表示:(a,b) * [a,b] = ab.

该等式为我们提供了一种快速计算两个数的最小公倍数的方法。

贝祖定理是说,如果 d = (a,b) 那么一定存在整数 x 和整数 y 满足 ax + by = d.(当然,如果存在的话,那么线性双变量方程的理论保证了无穷多解的存在性)。

同样值得注意的是,k = d 是满足 ax + by = k 有一个关于 x 和 y 的解的最小正整数。

指定 a 和 b,我们可以通过递归或迭代的方式实现扩展的欧几里得算法来求解满足等式 ax + by = d 的 x 和 y。

4. 整数因式分解

整数因子分解的最常用的算法是 Eratosthenes 筛选法。在分解 N 时,将质数扫描到 sqrt(N) 就足够了。

另外,如果我们需要对 1 到 N 之间的所有数字进行因式分解,则可以使用该算法的单次运行来完成此任务 - 对于 1 到 N 之间的每个整数 k ,我们可以保持一对映射——整除 k 的最小质数、最大倍数,(p,a)。k 的剩余质因子与 k/(pa) 的相似。

5. 线性同余方程组

形如 ax≡b (mod n) 的方程式( x 是未知数)称为线性同余。当且仅当存在整数 x 使得 n | (ax-b) 成立时,这样的方程组将有一个解,即 ax -b = ny,y 是整数,换句话说,ax + n(-y)= b。

我们已经从 Bezout 的等式中得知,像这样的线性不定方程将只有在 (a,n) 的 gcd (假设该值为d) 整除 b 时才有解。

在这种情况下,让 b = dd',a = da',n = dn',所以我们有:

da'x + dn'( - y)= dd',其中 gcd(a',n')= 1

带入变量 d

a'x + n'( - y)= d'。

由于 gcd(a',n') = 1,现在我们可以使用扩展的欧几里德的算法来找到 a'x + n'( - y)= 1 的解,然后将该解乘以 d' 得到对于 a'x + n'( - y)= d' 的解。

注意:如果 ax≡b(mod n) 有一个解,则 mod(n / d) 有且仅有一个解。

如果这个解是用 x0 表示的,那么mod n将恰好有 d 个解,由 x0 + kn/d 给出,其中 0<= k

6.中国剩余定理

典型的问题形式是“寻找一个数,除以 2 余 1,除以 3 余 2,除以 7 余 5”其余各项可以被推广为一元线性同余方程组之后可以使用中国剩余定理来解决。

举个例子,下面的问题可以被表示为三个线性同余式:“x ≡ 1 (mod 2), x ≡ 2 mod(3), x ≡ 5 mod (7)”

也就是一元线性同余式方程组:

x ≡ a1 (mod n1)

x ≡ a2 (mod n2)

x ≡ a3 (mod n3)

....

x ≡ ak (mod nk)

假设整数 ni,nj 两两互质,则对任意的 n=n1n2...nk,方程组有解

对于任意的 i,当 0 <= di < ni,令 ci=n/ni,令 di 为同余式 cix=1(mod ni) 的解(这个解法可以在利用扩展的欧几里德算法)。

上面的线性方程组的通解可以给出为:

c = a1c1d1 + a2c2d2 + ... + akckdk

中国剩余定理的直接推论如下:假设 n = p1a1 * p2a2 * .... * pkak 为 n 的素因子分解。 那么,对于任何整数 a 和 b,我们对于每个 i 都有 a = b (mod n) iff a = b (mod piai ) 。

讨论一下 Ni 的不一定都是两两互质的中国剩余定理的推广,如下 - 线性同余系统

x≡a1(mod n1)

x≡a2(mod n2)

x≡a3(mod n3)

....

x≡ak(mod nk)

有解,当对于每个 i != j 都有 iff gcd(ni,nj) 除 (ai-aj) ,且存在唯一解 mod n,其中 n 是 n1,n2 ... k 的最小公倍数

7. 二次方一致性

给定 q 和 n,如果等式 x2≡q(mod n) 具有解,则 q 称为二次残差的模 n。

如果该方程不具有解,则q被称为“二次非残差”。

例如,x2≡9(mod 15) 具有解 x = 12,因此 9 是模 15 的二次余数。

另一方面,等式 x2≡11(mod 15) 没有解,因此 11 是二次非残差,为了简单起见,如果一个正方形可以取一些正整数 n 的形式(nk + q),则整数 q 是模 n 的二次余数。

发现具有质数模的二次一致性是否具有一个解,是有些容易的:x2≡a(mod p) 只有在 (p-1)/ 2 = 1(mod p) 时才具有解。

在这种情况下,可以使用 Shank-Tonelli 算法来获得解决方案。

8. 欧拉 Phi 函数、除数函数、约数和、Mobius 函数

欧拉的 Phi 函数 (又称为常数函数,由φ表示)是自然数的函数,给出与相应的自然数互质的正整数的数目。因此,φ(8) = 4, φ(9) = 6 等。

该函数的以下属性值得注意:

如果 p 是素数,则 φ(pk) = (p-1)pk-1

φ 函数是乘法的,即如果 if (a,b) = 1 则 φ(ab) = φ(a)φ(b)。

φ(n) 的值可以通过欧拉公式获得:令 n = p1a1 * p2a2 * .... * pkak 是 n 的素因子分解。则:

φ(n) = n * (1- 1/p1)) * (1- 1/p2)) * ... * (1- 1/pk))

以编程方式,如果我们欲求 1 到 n 的 φ , 那么我们可以非常好地使用筛选算法连同 φ 的乘法性质。中心思想是:如果 n 是素数,则 φ(n) = -1。否则,如果 n 是素数的幂,例如 n= pk,则 φ(n) = (p-1)pk-1。否则,对于某个素数p,令 n=pk*q 。使用乘法属性, 我们有 φ(n) = φ(pk)φ(q)

φ(n) 的两个重要属性:

i. aφ(n) ≡ 1 (mod n) 每当 (a,n) = 1。 具体来说, 对于素数p,如果 p 不能整除 a,则 ap-1 ≡ 1 (mod p)。 这种特化也被称为费马小定理。

ii. 令 d1, d2, ...dk 为 n 的所有除数(包括 n)。则 φ(d1) + φ(d2) + ... + φ(dk) = n

例如,18的除数是1、2、3、6、9 和 18。观察到 φ(1) + φ(2) + φ(3) + φ(6) + φ(9) + φ(18) = 1 + 1 + 2 + 2 + 6 + 6 = 18

该除数函数,表示为 d(n),给出了一个自然数的除数的数目。例如,d(18) = 6。类似地,除数函数之和,表示为 σ(n),给出了 n 的除数的和。

因此,σ(18) = 1+2+3+6+9+18 = 39。关于这两个函数以下属性毫无价值:

如果 p 是素数,则 d(p) = 2。另外, d(pk) = k+1, 并且 σ(p) = p+1

如果 n 是两个不同的素数的乘积,假使 n = pq, 则 σ(n) = n+1+(p+q)。另外观察到这种情况:φ(n) = +1-(p+q)。

一般来说,令 n = p1a1 * p2a2 * .... * pkak 。则 d(n) = (a1+1) * (a2+1) * ... (ak + 1),并且 σ(n) 由以下乘积给出:

σ(n) = ( (p1(a1+1) - 1) / (p1-1) ) * ( (p2(a2+1) - 1) / (p2-1) ) * ... * ( (pk(ak+1) - 1) / (pk-1) )

如果 σ(n) =2n,则 n 被称为“完全数”。换句话说, 完全数的真因子(即除了自身以外的除数)的和恰好等于它本身。

mobius函数µ(n) 在所有正整数中定义如下:

在 n 是非平方数(即 n 是不能被任意整数平方得到)并且 n 有偶数个不同的素数因子,则 µ(n) = 1

在 n 是非平方数(即 n 是不能被任意整数平方得到)并且 n 具有奇数个不同素数因子,则µ(n) = -1

在 n 是平方数,即 n 是某个整数的平方,则 µ(n) = 0

Mobius 函数是乘法分配性的,即 a 和 b 互为质数,则 µ(ab) = µ(a)*µ(b).

计算欧拉方程函数的一个有用公式可以用 mobius 函数给出:令 d1,d2,... dk 为 n 的所有除数。然后

φ(n) = (d1 * mu (n/d1) ) + (d2 * µ(n/d2) ) + .... + (dk * µ(n/dk) )

这也可以写成:

φ(n) = (µ(d1) * (n/d1) ) + (µ(d2) * (n/d2) ) + .... + (µ(dk) * (n/dk) )

使用筛选法计算 phi[n] 的 Java 实现如下:

每个程序员都应该知道的基础数论

阶乘

阶乘是非常重要的。N 的阶乘定义如下:N = (N)*(N-1)*(N-2)*(N-3)...1。在计算 nPr nCr 时需要使用阶乘。他们像这里描述的那样很快变得非常大,所以他们需要非常仔细的处理大数、大整数表示等。

到此我们完成了对基本数理论概念的讨论。

整数序列

流行的整数序列有很多。它们中的许多都基于递归关系。主要的定理被广泛用于了解其复杂性,边界与循环的关系。

很多流行的整数序列,例如:费布那切数列,鲁卡斯数字, 斯特恩双原子数字, 懒卡特数字, 帕多万数字 还有多边形数字,诸如 五角形数字, 六角形数字。

对数论的介绍:哈迪和赖特

初等数论: 琼斯和琼斯

数学诱导 - 一种技术教程,经常用于离散空间的证明。

具有数学归纳原理的问题和解决方案的教程。

感谢大家阅读由java培训机构分享的“每个程序员都应该知道的基础数论”希望对大家有所帮助,更多精彩内容请关注Java培训官网

免责声明:本文由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • java语言中,char 类型变量是否能保存一个汉字?
    java语言中,char 类型变量是否能保存一个汉字?
    在 Java 语言中,可以使用 char 类型的变量来存储单个的字符,请问是否能用 char 类型的变量来存储一个汉字呢? 详情>>

    2015-10-15

  • 有史以来最牛的一张程序员职业路线图!
    有史以来最牛的一张程序员职业路线图!
    最近在琢磨程序员到底路在何方,经过不断的自虐和代入,终于在迷雾森林中得图一张,看之豁然开朗。独乐乐不如众乐乐,share了: 详情>>

    2018-05-22

  • java中变量和常量有什么区别?
    java中变量和常量有什么区别?
    在使用 Java 语言进行程序设计时,经常需要用到常量和变量来存储信息。请简单叙述变量和常量有什么区别? 详情>>

    2015-10-15

  • short 和 char 类型的取值范围各是多少?
    short 和 char 类型的取值范围各是多少?
    在使用 Java 语言进行程序设计时,经常需要使用 short 型和 char 型存储数值,请简述short 型和 char 型的取值范围各是多少? 详情>>

    2015-10-15

  • Java开班时间

    收起