• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • 用计算机在局部范围内验证数学猜想(一)

    日期:2003-09-20  地址:  作者:
      

      用计算机解决数学问题,首先要把问题的已知条件和要求搞清楚,然后确定算法,再用某种计算机语言来实现。最后通过运行程序,找出问题的解答来。由于计算机的运算速度快、存储的信息量大、并且有逻辑判断能力等特点,用计算机解决数学问题,有时要比手工算法简练得多。比如,许多数学猜想都是经过大量的试验之后才提出来的。但如果用手工进行试验,计算速度慢不说,试验次数一多,人可能很快就烦了。而计算机可以不厌其烦地把所有可能的情况一一罗列出来,并从中筛选出满足条件的解,这种方法就是计算机程序设计中最常用的穷举法。

      用计算机解决数学问题的另一外好处是,当程序运行时,你可以亲眼在屏幕上看到计算机按照你的意愿把计算结果以图形或文字的形式一步一步地展现在你的眼前。

      由于计算机语言有很多种,为了让广大的读者能看得懂程序,我们选择中学生比较熟悉的QBASIC语言作为程序设计语言。其实,用什么语言都是次要的,关键要掌握用计算机解决数学问题 一般方法。

      本文将围绕一些著名的数学猜想,讨论用计算机验证数学猜想,讨论用计算机验证数学猜想的一般方法。

      数学是研究客观世界中数学关系和空间形式的一门学科,数量之间的关系本来是一种客观存在,数学家的聪敏过人之处就在于他能够在茫茫的数字海洋中找出隐蔽着的客观存在,并能从理论上证明它的正确性,虽然数学家们能够发现某些客观规律,但却无法证明它是正确的,这就是所谓的数学猜想。

      纵观数学发展史,我们会发现许多还没有被人们所证实的数学猜想,最著名的可能要数哥德巴赫猜想了。

      德国数学家哥德巴赫(Goldbach)在1972年写给大数学家欧拉(Euler)的一封信中提出过这样的猜测:每个不小于6的偶数都是两个奇素数之和,每个不小于9的奇数都是三个奇素数之和。

      哥德巴赫本人对许多偶数和奇数进行了检验,都说明这个猜测是正确的。但是自然数是无限的,不可能对所有的偶数都进行检验,所以就不能肯定哥德巴赫的猜测是一条定理。因此,后人称之为哥德巴赫猜想。其中,第二个猜想可以由第一个猜想直接推出,所以,一般人们所说的哥德巴赫猜想是第一个猜想。

      200多年来,尽管一些伟大的数学家为证明哥德巴赫猜想付出了巨大的努力,我国著名的数学家陈景润先生离摘取这颗数学皇冠上的明珠只差一步之遥。然而,时至今日,它仍然是一个我们所熟悉的既不能证明也不能推翻的命题

      要想攻克一个数学猜想,可以从两个方向去考虑:或者证明它的正确性,或者举出一个反例否定它,无论是从理论上严格的证明,还是找到一个反例否定它,都算是解决了这一数学问题。

      但是,对于一个著名的数学猜想来说,要想从理论上证明它的正确性,是一件相当困难的事。而想要找到一个反例否定它,同样有如大海捞针。

      在这里,我们不想妄谈如何证明一个数学猜想,只是想谈一下如何利用计算机的高速计算能力验证一个数学猜想。

      由于计算机程序一旦设计好之后就可以快速准确地计算并打印出所有你需要的结果。它可以代替大量繁琐的手工计算,所以,计算机是在局部范围内验证一个数学命题是否正确的最好的试验工具。

      但是,由于计算机软、硬件条件限制任何一个计算机程序都只能在有限的范围内验证一个数学命题的正确性,而一个数学命题的正确性一般都建立在某一个无限集合之中。比如,自然数集合或实数集合。

      因此,客观地说,用计算机验证数学猜想,绝不是严格意义上的数学证明,充其量只是在局部范围内检验该数学命题的正确性,从数学量上增加该猜想正确的可能性,编制验证程序的另一个动机很可能是想通过大量的试验找到一个反例来否定它。

      当你的头脑里萌发了一个数学猜想而不知它是否正确时,最好的办法就是编写一段程序让计算机验证一下,如果在一个相当大的范围内计算机验证的结果都是正确的。你就很有可能发现一个新的数学规律,可以提出一个新的数学猜想,进而想办法去严格地证明它。但是,只要计算机举出了哪怕一个反例,你就不要再去胡思乱想了。

      下面,我们就来用计算机验证几个数学猜想。

      【例1】    用计算机验证哥德巴赫猜想。

      用计算机验证哥德巴赫猜想,就是对于一个大偶数2N,找出两个素数,使得

     传统的验证方法是:对于一个大偶数2N,从第一个奇素数3开始,进行试验,用2N减去3,然后判断2N-3是否为素数,如果是素数,就算找到了一组解,否则就继续用第二个奇素数5来试验,直到在2N的范围内找到一组解为止;如果在2N的范围内没有找到一组合适的素数,就算找到了一个反例否定哥德巴赫猜想。

      这种验证方法在许多有关计算机程序设计的杂志或书里都有过介绍,我们就不再重复了,在这里,我们向读者介绍一种新颖的验证方法。

       在用传统的方法验证哥德巴赫猜想时,我们发现了一个非常有趣的现象,并用计算机对这一现象进行了大理的试验,试验的结果都与我们的猜想相吻合,由此我们提出了一个新的数学猜想:对于任意一个大于3的自然数N总可以在它的左侧和右侧找到一对与N距离相等的素数,这样的一对素数被称为自然数N的对称素数。但因为还没严格的数学证明,所以暂且把它叫做对称素数猜想。

    例如,

        N        公差

        N        公差

    3     4     5      1

    3     5    7      2

    5      6    7      1

    3      7    11      4

    5      8    11      3

    7      9    11      2

    7     10   13      3

    5    11    17     6

    11   12    13      1

    7     13   19     6

    11   14    17      3

    13   15    17     2

    13   16    19     3

    11     17   23     6

    17     18    19    1

    7     19   31    12

    17     20    23    3

    19     21    23    2

    13     22     31    9

    17    23      29    6

    19     24      29    5

    19    25    31    6

    23     26    29    3

    23    27     31    4

      最重要的是,这是一个几乎与哥德巴赫猜想完全等价的数学命题。

      设自然数为N,两个素数分别为,根据对称素数的定义,一定有下式成立:

    N-=2-N。

      因此必有:

      而这正好就是哥德巴赫猜想的结论。

      所以,如果对称素数猜想能够得到证实,也将证明哥德巴赫猜想成立。

      为了在计算机上验证对称素数猜想,我们可以把程序分成两部分。

      第一部分,用筛选法找出所有小于2N的素数,首当其冲存放在数组A中,在计算机中,筛法可以用给变量置零的方法来实现。具体来说就是:先令所有的数组元素都等于下标值,即A(I)=I,当I不是素数时,令A(I)=0。当需要输出结果时,凡遇到A(I)=0时,则跳过去检查下一个A(I)。

      第二部分,从N开始,分别向左右两侧等距离地递减和递增(K=N-I,P=N+I),然后判断A(K)和A(P)这两个数是不是同时为素数。具体的方法是判断A(K)与A(P)的乘积是否为零,如果都是素数(A(K)*A(P)<>0),则找到了满足哥德巴赫猜想的一组解,将结果打印出来;如果其中任何一个数不是素数,则T向左右两侧再等距离地递减和递增,继续判断,如果当N左侧的数递减到3之后,N右侧与它等距离的数仍然不是素数时,则我们认为找到了一个反例,可以宣布“哥德巴赫猜想”不成立。

      下面这段程序在奔腾机上只用了不到半分钟的时间就验证完了10000以内的所有偶数2N均可以表示成为两上素数之和。而且,这两个素数都是某个自然数的对称素数。

       REM一验证哥德巴赫猜想——

    INPUT ”N=”;N

    DIM A(N+SQR(N))

    FOR I=3 TO N STEP 2

    A(I)=I

    NEXT I

    FOR I=3 TO SQR(N)

    IF A(I)= 0 THEN 70

    FOR J=I TO N STEP I

    A(I+J)=0

    NEXT J

    70 NEXT I

    FOR X =4 TO N/2

    FOR I=1 TO 2 *X

    LET K=X-1:P=X+I

    IF A(K) *A(P)< >0 THEN 140

    IF K<3 THEN PRINT “哥德巴赫猜想不成立”:

    END

    NEXT I

    140 PRINT 2*X; “=”;A(K) “+”;A(P)

    NEXT X

    END

    【程序部分运行结果】

       RUN

    N=?50

    8=3+5      22=5+17        36=17+19     50=19+31

    10=3+7     24=11+13       38=7+31

    12=5+7     26=7+19       40=17+23

    14=3+11     28=11+17       42=19+23

    16=5+11     30=13+17       44=13+31

    18=7+11      32=13+19       46=17+29

    20=7+13       34=11+23     48=19+29

    (待续)

    (选自《中学生数学》期刊 2000年12月(上))   

     

     


    对 用计算机在局部范围内验证数学猜想(一) 文章的评论    [查看网友评论]

    验证码:
    匿名发表: