很多自然数都可分解成一些更小的数(直至不可再分,即为素数)的乘积,例如 12=4×312=4\times 3,其中 4=2×24=2\times 2,因此 12=2×2×312=2\times 2\times 3。而此时,2 和 3都不可再继续进行分解了,它们是最基本、最纯净的数,我们就把这样的数叫做“质数”或者“素数”。同样地,2/3/5/7/11/13等等都是不可分解的,它们也都是质数。它们是自然数的构件(building blocks),是自然数世界的基本元素。12 由两个 2 和一个 3 组成,正如水分子(H2OH_2O)是由两个氢原子和一个氧原子组成的一样。只不过,和化学世界不同的是,自然数世界里的基本元素是无限的——质数有无穷多个。

关于为什么质数有无穷多个,欧几里得有一个非常漂亮的证明。反证法进行证明,假如质数只有有限个,其中最大的那个质数为 PP(既然是最大的,也即,凡大于 PP 的数均不是素数)。现在把所有的质数连乘起来,再加一,得到一个新的数 NN,也即,N=2⋅3⋅4⋅5⋅…⋅P+1N=2\cdot 3\cdot 4\cdot 5\cdot \ldots \cdot P+1,注意到 NN除以每一个质数都会余1。这意味着,NN 不能被任意一个质数整除,换句话说 NN 不可被分解,也即为素数。于是产生矛盾。质数有无限多个。

需要补充的的一点是,这个证明容易让人产生误解,即把头 nn个质数连乘起来再加1,总能产生一个新的质数。这是不对的,因为既然只是选择的前 nn个(哪怕 nn 很大),那么所得数就有可能是那些我们没有乘进去的质数构成的,比如2⋅3⋅4⋅5⋅7⋅11⋅13+1=300312\cdot 3\cdot 4\cdot 5\cdot 7\cdot 11\cdot 13+1=30031,它可以被分解为 59×50959\times 509。

从欧几里得时代就开始,人们近乎疯狂地想要认识自然数的本质规律。组成自然数的基本元素(也即是质数)自然就成为了一个绝佳的突破口,于是对质数的研究成为了探索自然数世界的一个永久的话题。也是今天所说的“数论”。

质数理论来研究说,真的会非常方便。aa 是 bb 的倍数(或者说 aa 能被 bb 整除,bb 是 aa 的约数),意为 aa 拥有 bb 所含的每一种质数,并且个数不会更少,12=2×2×3,a=12×15=2×2×3×3×512=2\times 2\times 3,a=12\times 15=2\times 2\times 3\times 3\times 5,

  • 12 中有两个2,180 中也有两个2
  • 12 中有一个3,180 中有两个3
  • 180 中还包含 12 中没有的质数,也即是 5;
  • 对于每一种质数,12 里面所含的个数都比不过 180,这其实是表明 12 是 180 的约数;

假设 a=36=2×2×3×3,b=120=5!=2×2×2×3×5a = 36=2\times 2\times 3\times 3,\;b=120=5!=2\times 2\times 2\times 3\times 5,那么,aa 和 bb 的最大公约数是多少?我们可以依次考察,最大公约数里面可能会包含哪些质数,以及每个质数的个数。

  • 这个最大公约数最多可以包含多少个质数2?显然最多包含 2 个,否则无法整除 3636
  • 这个最大公约数最多可以包含多少个质数 3?显然只有一个,否则无法整除 120.
  • 这个最大公约数最多可以包含多少个质数 5?显然一个都不能有,否则无法整除 36;
  • 因此,3636 和 120120 的最大公约数为 2×2×3=122\times 2\times 3=12

我们接着来看 aa 和 bb 的最小公倍数的构造。我们希望每种质数在数量足够的前提下越少越好(最小上界),为了让这个数既是 aa 的倍数,又是 bb 的倍数,三个2是必须的,两个3是必须的,一个5也是必须的。因此,aa 和 bb 的最小公倍数就是 23×32×51=3602^3\times 3^2\times 5^1=360。便会发现 12×360=36×36012\times 360=36\times 360.

这其实也不奇怪,在最大公约数里面,每种质数有多少个,取决于 aa 和 bb 当中谁含的这种质数更少一些,

36=2×2×3×3120=2×2×2×3×5

\begin{split} &36=\underbrace{2\times2}\times3\times3\underbrace{}\\ &120=2\times2\times2\times\underbrace 3\times5 \end{split}
在最小公倍数的构成里面,每种质数有多少个,取决于 aa 和 bb 当中谁所包含的这种质数更多一些,

36=2×2×3×3120=2×2×2×3×5

\begin{split} &36=2\times 2\times \underbrace{3\times3}\\ &120=\underbrace{2\times 2\times 2}\times 3\times \underbrace{5} \end{split}

两者“互补”,最大公约数与最小公倍数乘在一起,也就相当于把 aa 和 bb 各自所包含的质数都乘了一个遍。这即刻为我们带来了一个熟悉的推论:如果两数互质(最大公约数为1),这两个数的乘积就是它们的最小公倍数。

两数互质,相当于说这两个数不包含任何相同的质数,如果 aa 与 cc 互质,bb 与 cc 互质,显然 a⋅ba\cdot b 也与 cc 互质。还有另外一个结论,如果 aa 与 bb 是两个不同的质数,则这两个数一定是互质的。

关于质数,有很多有趣美妙的定理。1640年,法国业余数学家 Pierre de Fermat(也即是费马大定理的提出者:费马)发现,如果 nn 为质数,那么对于任意一个数 aa,aa 的 nn 次方减去 aa 都将是 nn 的倍数(n|an−an|a^n-a )。例如,7是一个质数,则 27−2,37−3,47−42^7-2,3^7-3,4^7-4,甚至 1007−100100^7-100,统统都能被 77 整除。

Fermat 小定理有一个等价的表述:如果 nn 是一个质数的话,那么对于任意一个数 aa,随着 ii 的增加,ai%na^i\;\%\;n(也即关于 nn 的余数)将会呈现长度为 n−1n-1 的周期性,也即 ai%n=ai+n−1%na^i\;\%\;n=a^{i+n-1}\;\%\;n。

  • 这是因为 n|an−an|a^n-a,也即 an≡a(modn)a^n\equiv a\pmod n,也即依次计算 a1,a2,…,ana^1,a^2,\ldots,a^n 关于 nn 的余数时,ana^n 余数将会变得和 a1a^1(最开始的)相同,
  • 另一方面,ai%na^i\;\%\;n 的余数,完全由前一项 ai−1%na^{i-1}\;\%\;n (所决定)。比如 33/73^3/7 的 3余6,这表明,333^3 里包含 3 个 7 以及一个 6;因此,343^4 里就包含 9 个 7(能够被7整除) 以及 3个6。为了得到 34=33⋅33^4=3^3\cdot 3 关于 77 的余数,只需要看 18 除以 7 余多少就行了。可见,要想计算 aia^i 关于 nn 的余数,ai%n=[a⋅(ai−1%n)]%na^{i}\;\%\;n=\left [a\cdot (a^{i-1}\;\%\;n) \right ]\;\%\;n
  • 综上,得证
>>> a, n, N = 3, 7, 20
>>> [a**i%n for i in range(1, N)][3, 2, 6, 4, 5, 1, 3, 2, 6, 4, 5, 1, 3, 2, 6, 4, 5, 1, 3]

需要注意的是,n−1n-1 并非是最小的周期。我们来看 2i2^i 除以7的余数情况,7−1=67-1=6 也是一个周期,但 3 其实是它更小的周期:

>>> a, n, N = 2, 7, 20
>>> [a**i%n for i in range(1, N)]
[2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2]

如果除数 nn 不是质数(而非质数是由质数构成),比如是两个质数的乘积(比如 35),周期的长度又会怎样呢?3i3^i 关于 35 的余数又有什么规律呢?注意到 5 和 7是两个不同的质数,它们显然直接就互质了。根据中国剩余定理,一个数除以 35 的余数就可以唯一地由它除以 5 的余数和除以 7 的余数确定出来。因而,为了研究 3i3^i 除以 35 的余数,我们只需要观察 3i%5,3i%73^i\;\%\;5,3^i\;\%\;7 即可。由费马小定理可知,数列 3i%53^i\;\%\;5 有一个长为 4 的周期,数列 3i%73^i\;\%\;7 有一个长为 6 的周期。4 和 6 的最小公倍数是 12,因此 3i%5,3i%73^i\;\%\;5,3^i\;\%\;7 存在一个长为 12 的周期。到了 i=13i=13 时,3i%5,3i%73^i\;\%\;5,3^i\;\%\;7 将会开始重复,也即 3i3^i 除以 35的余数将从此处开始发生循环。

>>> a, n, N = 3, 35, 37
>>> l = [a**i%n for i in range(1, 1+N)]
>>> print([l[i*12:(i+1)*12] for i in range(len(l))])[   [3, 9, 27, 11, 33, 29, 17, 16, 13, 4, 12, 1], [3, 9, 27, 11, 33, 29, 17, 16, 13, 4, 12, 1], [3, 9, 27, 11, 33, 29, 17, 16, 13, 4, 12, 1]
]

类似地,假如某个整数 nn 等于两个质数 pp、qq 的乘积,那么对于任意一个整数 aa,写出 aia^i 依次除以 nn 所得的余数序列,(p−1)、(q−1)(p-1)、(q-1)的最小公倍数将称为该序列的一个周期。事实上,p−1p-1 和 q−1q-1 的任意一个公倍数,比如表达起来最为方便的 (p−1)×(q−1)(p-1)\times (q-1),也将成为该序列的一个周期。这个规律可以用来解释很多数学现象。例如,大家可能早就注意过,任何一个数的乘方(aia^i),其个位数(%10\%\;10)都会呈现出长度为 4 的周期(这包括周期为1(5)和周期为2(4)的情况),其实是因为,10 等于 2 和 5 这两个质数的乘积,而 (2−1)×(5−1)=4(2-1)\times(5-1)=4。

1736年,瑞士大数学家 Leonhard Euler(欧拉)对此进行了进一步的研究,讨论了当 nn 是更复杂的数时推导余数序列循环周期的方法,得到了一个非常漂亮的结果:在 1 到 nn 的范围内有多少个数和 nn 互质(包括1在内),aa 的 ii 次方除以 nn 的余数序列就会有一个多长的周期。为了将上述定理和其他的 “Euler 定理”区别开来,有时也称它为 “Fermat-Euler” 定理。

质数的无穷性——从素数到数论相关推荐

  1. 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。...

    package com.heima.Coding;/*判断101-200之间有多少个素数(质数),并输出所有素数.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明 ...

  2. 用反证法证明有无穷多个素数

    如何用反证法证明有无穷多个素数 今天在数据结构和算法分析里第一张看到这个问题,感觉书上写的反证法不够通透,省略了一些思考的步骤.自己也琢磨了半天才完全理解. 补充一下素数的定义:一个大于1的自然数,而 ...

  3. 【牛客 - 327牛客寒假算法基础集训营2 I】处女座的测验(二)(积性函数性质,数论,素数唯一性分解,STL)

    题干: 链接:https://ac.nowcoder.com/acm/contest/327/I 来源:牛客网 现在处女座顺利的完成了测验,处女座想要知道知道自己输出的结果是否正确.他希望知道自己有自 ...

  4. 洛谷 - P1217 [USACO1.5]回文质数 Prime Palindromes(欧拉线性筛+数论小知识)

    题目链接:点击查看 题目大意:给出一个a和b,求出区间[a,b]中所有回文质数,回文质数指的是一个数既是回文数也是质数 题目分析:首先质数好判断,我们只需要用欧拉筛预处理打好表即可,判断回文数我们也只 ...

  5. java声明是否是质数,java判断是否为素数(质数)的方法

    质数的定义: 对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数. 判断一个数是否为质数(素数)方法: 如果是偶数,直接返回:然后从3开始,步长为2,一直到n的算术平 ...

  6. 题目 1084: 用筛法求之N内的素数(数论)

    文章目录 Question Ideas Code Question 题目描述 用筛法求之N内的素数. 输入 N 输出 0-N的素数 样例输入 100 样例输出 2 3 5 7 11 13 17 19 ...

  7. BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...

  8. 理解算法的有穷性和程序的无穷性

    有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成 算法必须是有穷的,而程序可以是无穷的

  9. python定义函数判断质数_用python3判定素数(自己定义的函数),这几步你要了解...

    本文,用python3写一个判别素数的自定义函数. 工具/材料 python3.6 math模块 time模块 操作方法 01 根据素数的定义,写一个粗略的自定义函数: def p(n): if st ...

最新文章

  1. Linux中的信号处理原理
  2. 【职场】是什么让女性在计算机史上“隐身”了?
  3. Android 集成微信支付详解
  4. python链接mysql系统结构设计_第11章:使用Python打造MySQL专家系统
  5. USACO Section2.2 Preface Numbering 解题报告 【icedream61】
  6. windows server 2003 IIS 调试 ASP时路径问题
  7. map 转 json格式string字符串
  8. 嵌入式C语言编程中经验教训总结(一) 详解const、static和volatile
  9. 零基础学习用labview制作温度采集系统
  10. 计算机台式电源3c号,电源3C认证流程详情介绍
  11. m227fdw恢复出厂设置_惠普M227fdw说明书
  12. php 配置 error_reporting,关于php中的错误配置display_errors与error_reporting说明
  13. 智能搬运机器人系列之使用旭日X3派实现机器人防脱轨功能
  14. GNU链接脚本(06) - SECTIONS指令
  15. c# 向Excel文件写入数据(Workbook 和Worksheet )
  16. BentoML核心概念(一):服务定义
  17. python语言语块句的标记_个人学习记录
  18. unity3d 2d游戏(太空大战)开发笔记
  19. TensorFlow官方教程《Neural Networks and Deep Learning》译(第一章)
  20. 74LS181 ALU 功能介绍

热门文章

  1. package关键字的使用
  2. eclipse中要让一个 Java 源文件打开时编码格式为 UTF-8
  3. OpenCV:框选某一特定区域并保存到图片
  4. OpenGL+VS2012环境搭建
  5. C语言/C++常见字符串函数
  6. 卷积神经网络CNN总结(转)
  7. Oracle常见五个服务的作用
  8. 基于uFUN开发板的RGB调色板
  9. 实现类似add(1)(2)(3)的效果
  10. 25个超有用的 AngularJS Web 开发工具