(e.com中的第一个10位数素数)python google challenge 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

我刚刚提出了一个挑战,它声称是谷歌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**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
绝对是正确的选择。