(e.com中的第一个10位数素数)python google challenge 2004
我刚刚提出了一个挑战,它声称是谷歌2004年使用的(e.com中的第一个10位数素数)python google challenge 2004,python,math,exp,gmpy,Python,Math,Exp,Gmpy,我刚刚提出了一个挑战,它声称是谷歌2004年使用的 (the first 10-digit prime in e).com 独立于此,我想接受挑战并用python解决它 >>> '%0.52f' % math.exp(1) '2.71828182845904509079**5598298427**6488423347473144531250' >>> '%0.52f' % numpy.exp(1) '2.71828182845904509079**5598
(the first 10-digit prime in e).com
独立于此,我想接受挑战并用python解决它
>>> '%0.52f' % math.exp(1)
'2.71828182845904509079**5598298427**6488423347473144531250'
>>> '%0.52f' % numpy.exp(1)
'2.71828182845904509079**5598298427**6488423347473144531250'
我的程序返回了一个素数5598298427
在浏览互联网后,正确的答案是7427466391
但是python中的exp数字不包括上面所示的数字
import numpy
import math
def prime(a):
if a == 2: return True
if a % 2 == 0: return False
if a < 2: return False
i = 2
n = math.sqrt(a) + 1
while(i < n):
if a % i == 0:
return False
i += 1
return True
def prime_e():
e = '%0.51f' % math.exp(1)
e = e.replace("2.","")
for i in range(len(e)):
x = int(e[i:10+i])
if prime(x):
return [i, x]
print prime_e()
在99次迭代后返回7427466391
实际e(欧拉常数)值为
2.718281828459045235602874713526624977572470936999595749667627724076630355354759457138217852516642742746639193200305991817413596629043572903342952695630
因此,这个挑战的正确答案是7427466391
。你不能计算
数学实验(1)有一种方法可以做到这一点: 使用@quantum in给出答案的方法生成e的前1000位数字,该方法来自@wnoise in给出的答案,这是“Haskell代码的一种改编……它一直在浮动”: 函数,用于测试从以下位置为效率选择的整数的素性: 这张照片是:
7427466391
98
7427466391
98
7427466391
98
这意味着e中的前10位素数出现在小数点后的第98位,与“答案位置”一致
生成e的数字的一种更简单的方法是,通过使用Python的Decimal类获得足够精度的代码,可以如下所示:
import operator
import decimal as dc
def edigits(p):
dc.getcontext().prec = p
factorial = 1
euler = 2
for x in range(2, 150):
factorial *= x
euler += dc.Decimal(str(1.0))/dc.Decimal(str(factorial))
return euler
estring = edigits(150).to_eng_string()[2:]
for i in range(len(estring)-10):
x = int(reduce(operator.add,estring[i:i+10]))
if isprime(x):
print x
print i
break
这张照片是:
7427466391
98
7427466391
98
7427466391
98
正如@MarkDickinson所指出的,更简单的方法是直接使用十进制模块以必要的精度生成e。例如:
import operator
import decimal
decimal.getcontext().prec = 150
e_from_decimal = decimal.Decimal(1).exp().to_eng_string()[2:]
for i in range(len(e_from_decimal)-10):
x = int(reduce(operator.add,e_from_decimal[i:i+10]))
if isprime(x):
print x
print i
break
这张照片是:
7427466391
98
7427466391
98
7427466391
98
问题是,您的“e”在第15位小数点后(09079及以后)是错误的,其他人在这里已经解释了原因。然而,python本身拥有所有工具来提供几乎无限精度的“e”。我还没有遇到这个解决方案,所以我决定把它发布在这里。神奇之处在于“long”int,它可以是机器内存允许的最长长度。因为一个浮点数只不过是一个整数除以10的某个幂,我们可以很容易地计算(并存储)e_为_int=e*10**d,其中d是所需的小数位数。下面的简单代码从自然对数序列生成e:
import itertools
count = itertools.count
def ape(digits):
# e = sum(1/k! for k in count())
# calculate some extra digits to compensate for loss of precision:
r = 3
m = 10**(digits+r)
e = 2*m
f = 1 #initial value for k!
for k in count(2):
f *= k
if f>m: break
# remember, we're doing int division, so m/f = 0 for f>m
e += (m/f)
return e/10**r #truncate to required precision
“ape”代表“e的近似值”,并很好地反映了它的简单性:-)此算法在我的机器上大约一秒钟内找到10000位e。要进一步扩展,IEEE double仅精确到53位二进制数字,即15或16位十进制数字。
math.exp(1)
的结果是一个53位二进制数字,在第53位二进制数字的e的1位之内。除此之外,它与e没有任何关系,尽管Python仍然会给出精确的十进制表示,精确到小数点后53位。@ElTero:至于这个精确问题的素数测试,它是。然而,一(1)不是一个素数,不管你怎么说它是;另一个值得怀疑的问题是i+=1
:你不能检查每一个电位分压器(2,3,4,5…
),但可以检查奇数(3,5,7…
)@DmitryBychenko你是对的,但是对于1,我只是复制了上面的一行:如果a<2==0:return False
->如果a<2:return False
忘记删除==0
。如果要导入十进制模块,您最好以适当的精度执行decimal.decimal(1.exp()
。@MarkDickinson:谢谢。我对你的评论投了更高的票,并添加了直接使用十进制模块生成e的功能,其精度足以使我的答案归功于你。谢谢!我承认自己有偏见:我负责实现Decimal.exp
方法(至少在Python 2中,在将Decimal模块转换为C之前),所以看到它偶尔被使用很好。(即使是非常偶然的:-)我不明白这有什么作用reduce(operator.add
。我检查了没有它的代码,仍然可以int(euler_number[I:I+10])
你也可以使用标准库decimal
模块:例如decimal.getcontext().prec=1000;e=decimal.decimal(1).exp()
。非常感谢,在互联网上搜索精度时,我只找到了bigfloat
和gmpy2
。我在windows上编译这两个版本时遇到了问题,但gmpy2已经有了windows的编译版本是的,我的错:我从来没有时间或资源为windows正确打包bigfloat
。除此之外第二,gmpy2
绝对是正确的选择。