博得一笑

编程只为博得一笑

所有的代码都自己敲……
    所有的BUG都自己找……
 

博得写的博客

写博客的博得
2005自制游戏《小鱼蛋与小仙女》 下载  Hot      学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!!  New Cool Hot

//By BodeSmile
//Start at : 2005-2-16 21:00
//Algorithm : 梅森合数(Mersenne Composite Numbers)
//note :
//关键字:梅森素数 完美数
//相关资料: 魅力无穷的梅森素数.doc
//  完美数 & 梅森素数.doc

#include <iostream>
#include <cmath>

using namespace std;

__int64 prime[1000];

bool Int64_cout( __int64 lgint )     //带符号64位整数输出
{
 char temp[24];
 int j=0;
 if(lgint<0)
 {
  cout<<'-';
  lgint=-lgint;
 }
 else if(lgint==0)
 {
  cout<<'0';
  return false;
 }
 
 while(lgint!=0)
 {
  temp[j++]='0'+lgint%10;
  lgint/=10;
 }
 while(--j>=0)
  cout<<temp[j];
 
 return true;
}

bool MCN(int mersenneCN)
{
 __int64 ans=1,j,temp,t2,t3;
 int i,k=0,l;
 double st,temp2;
 for(i=0;i<mersenneCN;i++)
  ans*=2;
 ans--;
//Int64_cout(ans);
//cout<<endl;
 //////////////////
 temp=ans;
 temp2=temp;
 st=sqrt(temp2);

 for(j=1;temp>1;j++)
 {
  t2=6*j-1;
  t3=6*j+1;
  if(temp%t2==0)
  {
   prime[k++]=t2;
   temp/=t2;
   temp2=temp;
   st=sqrt(temp2);
//Int64_cout(prime[k-1]);
//cout<<endl;
  }
  if(temp%t3==0)
  {
   prime[k++]=t3;
   temp/=t3;
   temp2=temp;
   st=sqrt(temp2);
//Int64_cout(prime[k-1]);
//cout<<endl;
  }
  if(st<=t2)
  {
   prime[k++]=temp;
   break;
  }
 }
 
 for(l=0;l<(k-1);l++)
 {
  Int64_cout(prime[l]);
  cout<<" * ";
 }
 Int64_cout(prime[l]);
 cout<<" = ";
 Int64_cout(ans);
 cout<<" = ( 2 ^ "<<mersenneCN<<" ) - 1"<<endl;
 
 
 return true;
}

int main()
{
 int MaxN;
 
 cin>>MaxN;
 
 int mersenneCN[9]={11,23,29,37,41,43,47,53,59};
 
 int i;
 
 for(i=0;i<9;i++)
 {
  if(mersenneCN[i]<=MaxN)
  {
   MCN(mersenneCN[i]);
  }
  else
   break;
 }
 
 
 return 0;
}





完美数 & 梅森素数

 

  古希腊人还对另一种数感兴趣。他们将它称为完美数。一个大于1的自然数叫完美数,如果它的所有因子(包括1,但不包括本身)之和等于它本身。比如说6=1+2+3就是最小的完美数,古希腊人把它看作维纳斯也就是爱情的象征。28=1+2+4+7+14是另一个完美数。欧几里德证明了:一个偶数是完美数,当且仅当它具有如下形式:

     2p-12p-1

其中2p-1是素数。上面的628对应着p=23的情况。我们只要找到了一个形如2p-1的素数,也就知道了一个偶完美数;我们只要找到所有形如2p-1的素数,也就找到了所有偶完美数。所以哈吉拉特瓦拉先生不但找到了世界上已知的最大的素数,还找到了世界上已知的最大的偶完美数。嗯,你要问,关于奇完美数又是怎么样的情况?回答是:我们现在连一个奇完美数也没有找到过,我们甚至根本不知道是不是有奇完美数存在。我们只知道,要是有奇完美数存在的话,它一定是非常非常大的!奇完美数是否存在这个问题,也是一个上面所说的既简单又美丽,但是极为困难的著名数学问题。





魅力无穷的梅森素数

           ——香港科技大学 方程

 

2004515日,美国国家海洋和大气局顾问、数学爱好者乔希·芬德利(Josh Findley)用一台装有2.4GHZ奔腾处理器的个人计算机,找到了目前世界上已知最大的梅森素数。该素数为224036583次方减1(2240365831),它有7235733位数,如果用普通字号将这个数字连续写下来,它的长度可达3万米!它是2000多年来人类发现的第41个梅森素数,也是目前已知的最大素数。世界上许多著名的新闻媒体和科学刊物都对这一消息进行了报道和评介,认为这是数学研究和计算技术中最重要的突破之一。

也许会有人感到奇怪:素数不就是在大于1的整数中只能被1和其自身整除的数吗?在数学和计算机科学高度发达的今天,为什么发现一个已知的最大素数竟如此困难?找到一个已知的最大梅森素数竟成了科学上的大事?是的,魅力无穷的梅森素数具有许多特异的性质和现象,千百年来一直吸引着众多的数学家和数学爱好者对它进行研究;虽然已经揭示了一些规律,但围绕着它仍然有许多未解之谜,等待着人们去探索。

 

梅森素数的由来

马林·梅森(Marin Mersenne,1588–1648)是17世纪法国著名的数学家和修道士,也是当时欧洲科学界一位独特的中心人物。他与大科学家伽利略、笛卡尔费马、帕斯卡、罗伯瓦、迈多治等是密友。虽然梅森致力于宗教,但他却是科学的热心拥护者,在教会中为了保卫科学事业做了很多工作。他捍卫笛卡儿的哲学思想,反对来自教会的批评;也翻译过伽里略的一些著作,并捍卫了他的理论;他曾建议用单摆来作为时计以测量物体沿斜面滚下所需时间,从而使惠更斯发明了钟摆式时钟。

梅森对科学所作的主要贡献是他起了一个极不平常的思想通道作用。17世纪时,科学刊物和国际会议等还远远没有出现,甚至连科学研究机构都没有创立,交往广泛、热情诚挚和德高望众的梅森就成了欧洲科学家之间的联系的桥梁。许多科学家都乐于将成果寄给他,然后再由他转告给更多的人。因此,他被人们誉为有定期学术刊物之前的科学信息交换站。梅森和巴黎数学家笛卡儿、费马、罗伯瓦、迈多治等曾每周一次在梅森住所聚会,轮流讨论数学、物理等问题,这种民间学术组织被誉为梅森学院,它就是法兰西科学院的前身。

16406月,费马在给梅森的一封信中写道:在艰深的数论研究中,我发现了三个非常重要的性质。我相信它们将成为今后解决素数问题的基础。这封信讨论了形如2P1的数(其中p为素数)。早在公元前300多年,古希腊数学家欧几里得就开创了研究2P1的先河,他在名著《几何原本》第九章中论述完美数时指出:如果2P1是素数,则2P12P1)是完美数。

梅森在欧几里得、费马等人的有关研究的基础上对2P1作了大量的计算、验证工作,并于1644年在他的《物理数学随感》一书中断言:对于p=23571317193167127257时,2P1是素数;而对于其他所有小于257的数时,2P1是合数。前面的7个数(即2357131719)属于被证实的部分,是他整理前人的工作得到的;而后面的4个数(即3167127257)属于被猜测的部分。不过,人们对其断言仍深信不疑,连大数学家莱布尼兹和哥德巴赫都认为它是对的。

虽然梅森的断言中包含着若干错误(后文详述),但他的工作极大地激发了人们研究2P1型素数的热情,使其摆脱作为完美数的附庸的地位。可以说,梅森的工作是素数研究的一个转折点和里程碑。由于梅森学识渊博,才华横溢,为人热情以及最早系统而深入地研究2P1型的数,为了纪念他,数学界就把这种数称为梅森数;并以Mp记之(其中M为梅森姓名的首字母),即Mp=2P1。如果梅森数为素数,则称之为梅森素数(即2P1型素数)。

梅森素数貌似简单,而研究难度却很大。它不仅需要高深的理论和纯熟的技巧,而且需要进行艰巨的计算。即使属于猜测部分中最小的M31=2311=2147483647,也具有10位数。可以想象,它的证明是十分艰巨的。正如梅森推测:一个人,使用一般的验证方法,要检验一个15位或20位的数字是否为素数,即使终生的时间也是不够的。是啊,枯燥、冗长、单调、刻板的运算会耗尽一个人的毕生精力,谁愿让生命的风帆永远在黑暗中颠簸!人们多么想知道梅森猜测的根据和方法啊,然而年迈力衰的他来不及留下记载,四年之后就去世了;人们的希望与梅森的生命一起泯灭在流逝的时光之中。看来,伟人的猜测只有等待后来的伟人来解决了。

 

充满艰辛与乐趣的探索历程

梅森素数就像数学海洋中的一颗璀璨明珠,吸引着一代又一代的研究者去探寻。自梅森提出其断言后,人们发现的已知最大素数几乎都是梅森素数;因此,寻找新的梅森素数的历程也就几乎等同于寻找新的最大素数的历程。而梅森断言为素数而未被证实的几个Mp当然首先成为人们研究的对象。

1772年,瑞士数学家欧拉在双目失明的情况下,靠心算证明了M31是一个素数,它共有10位数,堪称当时世界上已知的最大素数。欧拉的毅力与技巧都令人赞叹不已,他因此获得了数学英雄的美誉。这是寻找已知最大素数的先声。欧拉还证明了欧几里得关于完美数的定理的逆定理,即:每个偶完美数都具有形式2P12P1),其中2P1是素数。这就使得偶完美数完全成了梅森素数的副产品了。欧拉的艰辛给人们提示:在伟人难以突破的困惑面前要想确定更大的梅森素数,只有另辟蹊径了。

100年后,法国数学家鲁卡斯提出了一个用来判别Mp是否是素数的重要定理——鲁卡斯定理。鲁卡斯的工作为梅森素数的研究提供了有力的工具。1883年,数学家波佛辛利用鲁卡斯定理证明了M61也是素数——这是梅森漏掉的。梅森还漏掉另外两个素数:M89M107,它们分别在1911年与1914年被数学家鲍尔斯发现。

1903年,在美国数学学会的大会上,数学家柯尔作了一个一言不发的报告,他在黑板上先算出2671,接着又算出193707721×761838257287,两个结果相同。这时全场观众站了起来为他热烈鼓掌,这在美国数学学会开会的历史上是绝无仅有的一次。他第一个否定了“M67为素数这一自梅森断言以来一直被人们相信的结论。这短短几分钟的报告却花了柯尔3年的全部星期天。1922年,数学家克莱契克进一步验证了M257并不是素数,而是合数(但他没有给出这一合数的因子,直到20世纪80年代人们才知道它有3个素因子)。

1930年,美国数学家雷默改进了鲁卡斯的工作,给出了一个针对Mp的新的素性测试方法,即鲁卡斯-雷默方法:Mp3是素数的充分必要条件是Lp-2=0,其中L0=4Ln+1=(Ln2)ModMp。这一方法直到今天的计算机时代仍发挥重要作用。

手算笔录时代,人们历尽艰辛,仅找到12个梅森素数。而计算机的产生使寻找梅森素数的研究者如虎添翼。1952年,数学家鲁滨逊等人将鲁卡斯-雷默方法编译成计算机程序,使用SWAC型计算机在短短几小时之内,就找到了5个梅森素数:M521M607M1279M2203M2281。其后,M32171957年被黎塞尔证明是素数;M4253M44231961年被赫维兹证明是素数。1963年,美国数学家吉里斯证明M9689M9941是素数。196396日晚上8点,当第23个梅森素数M11213通过大型计算机被找到时,美国广播公司(ABC)中断了正常的节目播放,以第一时间发布了这一重要消息;发现这一素数的美国伊利诺伊大学数学系全体师生感到无比骄傲,以致于把所有从系里发出的信件都敲上了“2112131是个素数的邮戳。

197134日晚,美国哥伦比亚广播公司(CBS)中断了正常节目播放,发布了塔可曼使用IBM360-91型计算机找到新的梅森素数M19937的消息。而到197810月,世界几乎所有的大新闻机构(包括我国的新华社)都报道了以下消息:两名年仅18岁的美国高中生诺尔和尼科尔使用CYBER174型计算机找到了第25个梅森素数:M21701

随着素数P值的增大,每一个梅森素数MP的产生都艰辛无比;而各国科学家及业余研究者们仍乐此不疲,激烈竞争。1979223日,当美国克雷研究公司的计算机专家史洛温斯基和纳尔逊宣布他们找到第26个梅森素数M23209时,人们告诉他们:在两个星期前诺尔已得到这一结果。为此,史洛温斯基潜心发愤,花了一个半月的时间,使用CRAY-1型计算机找到了新的梅森素数M44497。这个记录成了当时不少美国报纸的头版新闻。之后,这位计算机专家乘胜前进,使用经过改进的CRAY-XMP型计算机在1983年至1985年间找到了3个梅森素数:M86243M132049M216091。但他未能确定M86243M216091之间是否有异于M132049的梅森素数。而到了1988年,科尔魁特和韦尔什使用NEC-FX2型超高速并行计算机果然捕捉到了一条漏网之鱼”——M110503。沉寂4年之后,1992325日,英国原子能技术权威机构——哈威尔实验室的一个研究小组宣布他们找到了新的梅森素数M7568391994114日,史洛温斯基和盖奇为其公司再次夺回发现已知最大素数的桂冠——这一素数是M859433。而下一个梅森素数M1257787仍是他们的成果。这一素数是使用CRAY-794超级计算机在1996年取得的。史洛温斯基由于发现7个梅森素数,而被人们誉为素数大王

使用超级计算机寻找梅森素数的游戏实在太昂贵了。1996年美国数学家及程序设计师乔治·沃特曼编制了一个梅森素数寻找程序,并把它放在网页上供数学家和数学爱好者免费使用;这就是著名的因特网梅森素数大搜索GIMPS)项目。1997年美国数学家及程序设计师斯科特·库尔沃斯基和其他人建立了"素数网"(PrimeNet),使分配搜索区间和向GIMPS发送报告自动化。现在只要人们去GIMPS的主页下载那个免费程序,就可以立即参加GIMPS项目来搜寻梅森素数。目前,全球有近7万名志愿者参加该项目,并动用20多万台计算机联网来进行大规模的分布式计算,以寻找新的梅森素数。看来,因特网联通的个人计算机要与高功能的超级计算机在计算技术上一较高低了。从1996年到2004515日,GIMPS项目发现了7个梅森素数:M1398269M2976221M3021377M6972593M13466917M20996011M24036583,它们都是使用奔腾型计算机得到的结果。

时至今日止,人们已经发现了41个梅森素数,并且确定M6972593位于梅森素数序列中的第38位。现把它们列表如下:

序号

梅森素数

位数

发现时间

 1

M2

1

公元前300

 2

M3

1

公元前300

 3

M5

2

公元前100

 4

M7

3

公元前100

 5

M13

4

15世纪中叶

 6

M17

6

1603

 7

M19

6

1603

 8

M31

10

1772

 9

M61

19

1883

 10

M89

27

1911

 11

M107

33

1914

 12

M127

39

1876

 13

M521

157

1952

 14

M607

183

1952

 15

M1279

386

1952

 16

M2203

664

1952

 17

M2281

687

1952

 18

M3217

969

1957

 19

M4253

1281

1961

 20

M4423 

1332

1961

 21

M9689

2917

1963

 22

M9941

2993

1963

 23

M11213

3376

1963

 24

M19937

6002

1971

 25

M21701

6533

1978

 26

M23209

6987

1979

 27

M44497

13395

1979

 28

M86293

25962

1983

 29

M110503

33265

1988

 30

M132049

39751

1983

 31

M216091

65050

1985

 32

M756839

227832

1992

 33

M859433

258716

1995

 34

M1257787

378632

1996

 35

M1398269

420921

1996

 36

M2976221

895933

1997

 37

M3021377

909526

1998

 38

M6972593

2098960

1999

 

M13466917

4053946

2001

 

M20996011

6320430

2003

 

M24036583

7235733

2004

由上表可见,梅森素数的分布极不规则。我们甚至可以看到,连找到梅森素数的时间分布都极不规则,有时许多年未能找到一个,而有时则一下找到好几个。探索梅森素数的分布规律似乎比寻找新的梅森素数更为困难。数学家们在长期的摸索中,提出了一些猜想。英国数学家香克斯、美国数学家吉里斯、法国数学家托洛塔和德国数学家伯利哈特就曾分别给出过关于梅森素数分布的猜测,但他们的猜测有一个共同点,就是都以近似表达式给出;而它们与实际情况的接近程度均未尽如人意。中国数学家及语言学家周海中经过多年的研究,于1992年首先给出了梅森素数分布的精确表达式,为人们寻找这一素数提供了方便;后来这一科研成果被国际数学界命名为周氏猜测。著名的《科学》杂志上有一篇评论文章指出,这是梅森素数研究中的一项重大突破。

不久前,国际电子新领域基金会(IEFF)宣布了由一位匿名者资助的为通过GIMPS项目来寻找新的更大的梅森素数而设立的奖金。它规定向第一个找到超过一千万位数的个人或机构颁发10万美元。后面的奖金依次为:超过1亿位数,15万美元;超过10亿位数,25万美元。但据悉,绝大多数研究者参与该项目不是为了金钱而是出于乐趣、荣誉感和探索精神。可以相信,梅森素数这颗数海明珠正以其独特的魅力,吸引着更多的有志者去寻找和研究。

 

梅森素数的意义

自古希腊时代直至17世纪,人们寻找梅森素数的意义似乎只是为了寻找完美数。但自梅森提出其著名断言以来,特别是欧拉证明了欧几里得关于完美数的定理的逆定理以来,完美数已仅仅是梅森素数的一种副产品了。

寻找梅森素数在现代已有了十分丰富的意义。寻找梅森素数是发现已知最大素数的最有效的途径,自欧拉证明M31为当时最大的素数以来,在发现已知最大素数的世界性竞赛中,梅森素数几乎囊括了全部冠军。

寻找梅森素数是测试计算机运算速度及其他功能的有力手段。如M1257787就是19969月美国克雷公司在测试其最新超级计算机的运算速度时得到的。梅森素数在推动计算机功能改进方面发挥了独特作用。发现梅森素数不仅仅需要高功能的计算机,它还需要素数判别和数值计算的理论与方法以及高超巧妙的程序设计技术等等,因而它还推动了数学皇后——数论的发展,促进了计算数学、程序设计技术的发展。

由于寻找梅森素数需要多种学科的支持,也由于发现新的最大素数所引起的国际影响使得对于梅森素数的研究能力已在某种意义上标志着一个国家的科学技术水平,而不仅仅是代表数学的研究水平。从各国各种传媒(而不仅仅是学术刊物)争相报道新的梅森素数的发现,我们也可清楚地看到这一点。

梅森素数在实用领域也有用武之地。现在人们已将大素数用于现代密码设计领域。其原理是:将一个很大的数分解成若干素数的乘积非常困难,但将几个素数相乘却相对容易得多。在这种密码设计中,需要使用较大的素数,素数越大,密码被破译的可能性就越小。

寻找梅森素数最新的意义是:它促进了分布式计算技术的发展。从最新的7个梅森素数是在因特网项目中发现这一事实,我们已可以想象到网络的威力。分布式计算技术使得用大量个人计算机去做本来要用超级计算机才能完成的项目成为可能;这是一个前景非常广阔的领域。

最后,有必要指出的是:素数有无穷多个,这一点早为欧几里得发现并证得。然而,梅森素数是否有无穷多个?这是目前尚未解决的著名数学难题;而揭开这一未解之谜,正是科学追求的目标。让我们以数学大师希尔伯特的名言来结束本文:我们必须知道,我们必将知道。

 

本文由香港科技大学 数学教师方程先生提供

 

 

posted on 2005-03-01 20:06  博得一笑  阅读(1147)  评论(0编辑  收藏  举报