您的位置:首页 > 其它

Project Euler 97 :Large non-Mersenne prime 非梅森大素数

2015-12-06 20:21 411 查看
Largenon-Mersenneprime

Thefirstknownprimefoundtoexceedonemilliondigitswasdiscoveredin1999,andisaMersenneprimeoftheform26972593−1;itcontainsexactly2,098,960digits.SubsequentlyotherMersenneprimes,oftheform2p−1,havebeenfoundwhichcontainmoredigits.

However,in2004therewasfoundamassivenon-Mersenneprimewhichcontains2,357,207digits:28433×27830457+1.

Findthelasttendigitsofthisprimenumber.

非梅森大素数

1999年人们发现了第一个超过一百万位的素数,这是一个梅森素数,可以表示为26972593−1,包含有2,098,960位数字。在此之后,更多形如2p−1的梅森素数被发现,其位数也越来越多。

然而,在2004年,人们发现了一个巨大的非梅森素数,包含有2,357,207位数字:28433×27830457+1。

找出这个素数的最后十位数字。

解题

感觉很简单。。。

JAVA

packageLevel3;

importjava.io.BufferedReader;
importjava.io.FileReader;
importjava.io.IOException;
importjava.math.BigInteger;
importjava.util.ArrayList;

publicclassPE097{
publicstaticvoidrun(){
BigIntegerm=newBigInteger("10000000000");
BigIntegerr1=newBigInteger("28433");
BigIntegert=newBigInteger("2");
BigIntegerexp=newBigInteger("7830457");
BigIntegerres=t.modPow(exp,m);
res=r1.multiply(res).add(newBigInteger("1"));
res=res.mod(m);
System.out.println(res);
}
publicstaticvoidmain(String[]args)throwsIOException{
longt0=System.currentTimeMillis();
run();
longt1=System.currentTimeMillis();
longt=t1-t0;
System.out.println("runningtime="+t/1000+"s"+t%1000+"ms");

}
}

//8739992577
//runningtime=0s2ms



就这样

或者这样

publicstaticvoidrun2(){
longbase=2;
longmod=1000000000;
longexp=7830457;
longres=28433;
for(longi=1;i<=exp;i++){
res=(res*2)%mod;
}
res+=1;
res%=mod;
System.out.println(res);
}
//739992577
//runningtime=0s163ms


上面mod少个0求的是后9位的数,因为多个0就越界了,少一位手工0到9可以暴力遍历。。。

Python

#coding=gbk
importcopy
importtimeastime
defmain():
print((28433*(2**7830457))+1)%10000000000
t0=time.time()
main()
t1=time.time()
print"runningtime=",(t1-t0),"s"
#8739992577
#runningtime=0.0190000534058s


也就这样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: