2.6 素数表达式
著名的哥德巴赫猜想的1+1,实际上就是把偶数写成两个素数之和,无疑是素数表达式的简单形式。本节将编程在指定区间验证这一著名猜想。
同时,在素数世家中,有关产生素数的欧拉表达式与勒让德表达式曾在欧洲引起轰动。本节通过编程验证这两个著名素数表达式,并探索新的素数表达式。
2.6.1 哥德巴赫猜想
1. 背景简介
德国数学家哥德巴赫(Goldbach)在写给欧拉的信中提出了以下猜想:任何大于2的偶数都是两个素数之和。
两个多世纪过去了,这一猜想既无法证明,也没有被推翻。
如果把命题“任一充分大的偶数都可以表示为一个素因子不超过a个的数与另一个素因子不超过b个的数之和”记作a+b,则哥德巴赫猜想即为1+1。
摘录证明哥德巴赫猜想a+b的简要进程如下所示。
1920年,挪威数学家布朗证明了9+9,离目标1+1相距甚远。
1956年,中国数学家王元证明了3+4至2+3,离目标1+1近了些许。
1962年,中国数学家潘承洞证明了1+5,王元证明了1+4,首次出现了1,离目标1+1进一步拉近了。
1966年,中国数学家陈景润证明了1+2,即“任一充分大的偶数都可以表示为一个素数与另一个素因子不超过2个的数之和”,已经很接近目标1+1了。
由以上进程可见,中国的数学家在哥德巴赫猜想的证明中做出了巨大的努力并取得了一系列举世瞩目的成果。
陈景润先生的1+2结论发表已经过去50多年,至今还没有出现更进一步的结果。也就是说,此进程还停留在1+2,哥德巴赫猜想至今还是一个猜想。
试设计程序验证指定区间[c,d]上哥德巴赫猜想是否成立:
如果区间上的偶数能分解为两个素数之和,则输出该分解和式;
如果区间上某一偶数不能分解为两个素数之和,则输出该反例,推翻哥德巴赫猜想。
2. 验证设计要点
为了扩大验证哥德巴赫猜想的区间范围,把变量设置为双精度实型。
对于[c,d]上的所有偶数i,分解为奇数j与k=i-j(j=3,5,…,i/2)之和。用试商判别法分别对奇数j,k是否为素数进行检验判别:
若j或k不是素数(标记t=1),则j增2,用一组新的奇数j,k再试;
若j与k都是素数(保持标记t=0),则偶数i找到分解式i=j+k。
若某一偶数i枚举的所有奇数分解情形都不是两个素数,即已找到推翻了哥德巴赫猜想的反例,打印反例信息(作为完整的验证程序设计,这一步骤不能省,尽管其出现的可能性微乎其微)。
3. 验证哥德巴赫猜想程序设计
4. 程序运行示例与说明
验证仅仅只是验证,并不能代替哥德巴赫猜想的证明。
某一区间的验证只能说哥德巴赫猜想在该区间成立,不能据某一区间的验证断言哥德巴赫猜想成立。
但验证程序若找出某一不能分解的反例,只要一个反例就足可以推翻这一猜想。
2.6.2 欧拉与勒让德表达式
素数的个数是无穷的,是否存在一个表达式,能表达出所有素数?
这当然是不可能的。那么,退一步,能否找到一个表达式,能表达出部分素数?
于是,一场漫无边际的寻找素数表达式的风潮盛行于整个欧洲数百年。
1. 素数表达式的背景
在寻找素数表达式的进程中,很多数学家积极参与其中,成果卓著,影响深远。有成功的,也有失败的。
(1)欧拉表达式。
早在1772年,数学家欧拉发现,当x=0,1,…,40时,表达式y=x2-x+41的值都是素数。
欧拉的这一表达式推出,引发了关于素数多项式的深入探求。
(2)勒让德表达式。
在欧拉表达式面世的20多年后,数学家勒让德于1798年发现,当x=0,1,…,28时,二次多项式y=2x2+29的值都是素数。
我们当然有理由质疑,这些表达式真有这么神奇吗?
下面,我们设计一个简单的程序,具体验证这两个素数表达式的结论。如果能找到一个反例推翻这些表达式,那也是大功一件。
2. 验证欧拉表达式与勒让德素数表达式设计要点
设2次3项式为ax2+bx+c,通过两个多项式项目p的选择,分别落实这两个多项式的3个参数a,b,c值。
(1)欧拉表达式。
参数取a=1,b=-1,c=41。
为了验证欧拉表达式y=x2-x+41,当x循环取值0~40时,计算y的值。为了通过试商判别法判别y是不是素数,设置k=2,3,…,的试商循环。
若y不能被k整除(保持t=0),则说明y是素数,并标注“素数”。
若循环x(0~40)中的所有y都为素数,则完成欧拉表达式验证。
否则,如果存在某一y能被k整除(t=1),找到y为“非素”的反例,打印y的因数分解式y=k∗(y/k)后退出,则说明欧拉表达式不成立。
(2)勒让德表达式。
参数取a=2,b=0,c=29。
同样,验证勒让德表达式y=2x2+29,当x取值为0~28时y的值是否都为素数。
如果循环x(0~28)中的所有y都为素数,完成勒让德表达式验证。
如果存在某一y不是素数,则输出因数分解式,说明勒让德表达式不成立。
3. 验证素数多项式程序设计
4. 程序运行结果与说明
程序验证了当x=0,1,…,40时,欧拉表达式y=x2-x+41的值均为素数。
也验证了当x=0,1,…,28时,勒让德表达式y=2x2+29的值也均为素数。
既然是验证程序,那么其中输出“反例”的语句不能省略。
欧拉表达式与勒让德表达式的相继问世,在世界各地引发了关于素数表达式的广泛探求。
其中,有资料介绍:“毕格尔发现二次式x2-x+72491对于x=1,2,…,11000都产生素数,这个纪录至今没人打破。”
这一结论可简单验证为假。
例如,取x=1,二次式的值为72491=71×1021;
又如,取x=5,二次式的值为72511=59×1229。
在华罗庚教授的《数学归纳法》(见《华罗庚科普著作选集》,上海教育出版社,p110)上有“当n=1,2,…,11000时,式子n2+n+72491的值都是素数。”
这一结论也不成立,可能是笔误造成的。
设f(n)=n2+n+72491,则在n≤10范围内就有5个不是素数:
f(4)=72511=59×1229
f(5)=72521=47×1543
f(8)=72563=149×487
f(9)=72581=181×401
f(10)=72601=79×919
那么,是否还存在新的素数多项式?
2.6.3 创建素数表达式
1. 素数表达式定义与设计要点
定义2次3项式y=ax2+bx+c为素数表达式:当x=0,1,…,c-1时,函数y的值都是素数。
因此,如果2次3项式y=ax2+bx+c为素数表达式,则只有当c为素数,且x取值为[0,c-1]时,所对应的y值全为素数。
在编程时,用变量统计某一表达式生成的素数个数,只有当素数个数为c时,才符合素数表达式定义。
素数表达式的探求与系数a,b,c密切相关。对于同样的参数a,b,常数项c越大,表达式表达素数的个数就越多。因此,参数c可约定为奇数从大到小枚举,当找到并输出一个素数表达式后即行退出c循环,避免探求较小c参数的表达式。
试在一定整数范围内枚举a,b,c的值(注意,系数b可为负整数,也可为0),应用试商判别法,探求2次3项式y=ax2+bx+c型的素数表达式。
2. 程序设计
3. 程序运行示例与说明
以上运行输出中的第1个是欧拉表达式,第3个是勒让德表达式,其他则是程序探索到的新的素数表达式。
遗憾的是,新的素数表达式所产生的素数个数并不比欧拉表达式或勒让德表达式所产生的多。
如果修改程序中a,b,c的循环参数,例如,把表达式中一次项系数b修改为[-10,10],则生成的素数表达式会相应增多。