趣味数学及编程拓展
上QQ阅读APP看书,第一时间看更新

2.5 素数对

本节探讨素数世家中两类素数对:经典的孪生素数对与新颖的逆序素数对。

2.5.1 孪生素数对

相差为2的两个素数称为孪生素数对,简称孪生素数。例如,3与5是一对孪生素数,41与43也是一对孪生素数。

1. 孪生素数对是否无限的探讨

素数有无穷多个,孪生素数对是有限还是无穷?

古希腊数学家欧几里得曾猜想,存在无穷多对素数,它们只相差2,例如,3和5,5和7,2003663613×2195000-1和2003663613×2195000+1,等等。

在1900年由数学家希尔伯特在国际数学家大会的报告上第8个问题中提出,可以这样描述:存在无穷多个素数p,使得p+2是素数。

这就是著名的孪生素数猜想,它与黎曼猜想、哥德巴赫猜想一样,让众多数论学者与数学爱好者为之着迷。

据《自然》(Nature)杂志网站报道,来自美国新罕布什尔大学的华人数学家张益唐证明,存在无穷多个之差小于7000万的素数对,从而在解决孪生素数猜想这一终极数论问题的道路上前进了一大步。

尽管从2到7000万是一段很大的距离,《自然》的报道还是称其为一个“重要的里程碑”。正如美国圣何塞州立大学数论教授Dan Goldston所言:“从7000万到2的距离(指猜想中尚未完成的工作)相比于从无穷到7000万的距离(指张益唐的工作)来说是微不足道的。”

到目前为止,这个常数已经从7000万降到了246,越来越接近孪生素数猜想的范围。如果这一常数改进到2,就相当于证明了孪生素数猜想成立。

目前已知最大的孪生素数共有388 342位数,通过分布式计算的Sophie Germain素数搜索项目于2016年9月14日发现孪生素数2 996 863 034 895×21 290 000±1。

2. 编程探求指定区间上的孪生素数对

(1)设计要点。

为扩大适应范围,相关变量采用双精度型。

应用试商法判定指定区间内的所有素数依次存储到a数组。检查a数组中若相邻元素之差为2,即对应的这两个素数相差为2,即为一对孪生素数。

(2)程序设计。

(3)程序运行示例与说明。

也可应用效率更高的筛法探求孪生素数对,有兴趣的读者不妨在以上应用筛法搜索素数程序的基础上作变通实现。

2.5.2 逆序素数对

逆序素数对是构造特点更为有趣的素数对。

逆序数对:由两个互为逆序数的不同整数组成的数对。例如,15与51是2位逆序数对,107与701是3位逆序数对。

逆序素数对:如果逆序数对的两个整数都是素数,则称逆序素数对(有些资料又称回文素数对)。

注意到至少2位才能形成逆序,因此从最简单的搜索2位逆序素数对开始讨论。

【问题】 共有多少组2位逆序素数对?

【探求】 先应用前面的搜索法求出所有21个2位素数如下所示。

考虑到“逆序”,凡首位即十位数字为偶数或为5的(标注下画线),其逆序非素数。因而可精简到只查十位数字为1,3,7,9的素数。

从第一个素数开始,凡没有标注下画线的素数,逐个配对构建。

13与31为第1对2位逆序素数对;

17与71为第2对2位逆序素数对;

37与73为第3对2位逆序素数对;

79与97为第4对2位逆序素数对。

共有以上4组2位逆序素数对。

进一步,共有多少3位逆序素数对?在[100,2019]区间中共有多少逆序素数对?

【拓展】 探求指定区间[x,y]中的所有逆序素数对。

输入正整数x,y(x<y),试统计并输出区间[x,y]中的所有逆序素数对(为避免重复,约定逆序素数对的较小素数在前,较大素数在后)。

1. 编程设计要点

(1)试商判别法搜索素数。

应用试商判别法搜索指定区间[x,y]中的所有素数(设共k个)存储在p数组,p[j]是这k个素数的升序排列的第j个(1≤j≤k)。

同时,为判别方便,把与区间起点x相距为m-x的素数m标注q[m-x]=1。

(2)产生逆序数。

对于素数d=p[j],设置条件循环(设初值r=0),应用取整与取余运算在分离d的各个数字c的同时,求得其逆序数

     while(d>0){c=d%10;r=r*10+c;d=d/10;}

则得素数p[j]的逆序数r。

(3)筛选与输出。

设p[j]与其逆序数r构成逆序素数对(p[j],r),根据约定p[j]<r。

若素数p[j]的逆序数r非素数(q[r-x]!=1),或r≤p[j],有违约定,返回。

否则,输出逆序素数对(p[j],r),并应用变量s统计逆序素数对的对数。

2. 程序设计
3. 程序运行示例与变通

顺便指出,网上有资料称Card经计算发现“有13对3位回文素数对”,这一结论明显少了一对,应更正为14对。

进一步,可输入区间[1001,9999],探索到该区间4位逆序素数对共有102对。

程序设置搜索区间,使搜索范围更广。例如,可输入区间[100,2019],探索到该区间上逆序素数对共23对,其中3位的有14对,4位的有9对。

程序中应用了p数组存储区间中的素数,注意区间中的素数个数k不能超过p数组的元素个数。

变通:把程序中筛选条件(q[r-x]!=1||r<=p[j])修改为q[r-x]!=1||r!=p[j],意味着输出的素数p[j]的逆序数r就是其本身,此时素数p[j]即为对称素数。