处理项目Euler问题(26),并希望使用寻找素数的算法,p最大阶数为10模p。本质上问题是寻找以小数形式创建最长重复的分母。在一堆维基百科阅读之后,看起来上面描述的素数会实现这一点。但是,不幸的是,它看起来像10的非常大的权力导致错误。我的问题是:有没有办法解决这个错误(使数字更小),或者我应该放弃这个策略,只做长期划分(计划是专注于素数)。 [值得注意的是,在order_ten方法中,如果我将功率限制在10到300之间,我可以让它运行,并且可能会有点长,这与长的长度一致)
import math
def prime_seive(limit):
seive_list = [True]*limit
seive_list[0] = seive_list[1] = False
for i in range(2, limit):
if seive_list[i] == True :
n = 2
while i*n < limit :
seive_list[i*n] = False #get rid of multiples
n = n+1
prime_numbers = [i for i,j in enumerate(seive_list) if j == True]
return prime_numbers
def order_ten(n) :
for k in range(1, n) :
if (math.pow(10,k) -1)%n == 0:
return k
primes = prime_seive(1000)
max_order = 0
max_order_d = -1
for x in reversed(primes) :
order = order_ten(x)
if order > max_order :
max_order = order
max_order_d = x
print max_order
print max_order_d
&#13;
答案 0 :(得分:2)
我怀疑问题在于,当你首先获得10的大功率然后计算值mod n时,你的数字会变大。 (例如,如果我要求你计算10 ^ 11 mod 11,你可以评论10 mod 11是(-1)因此10 ^ 11 mod 11只是(-1)^ 11 mod 11即-1。)
也许你可以尝试编写自己的指数例程mod n,类似于(在伪代码中)
myPow (int k, int n) {
if (k==0) return 1;
else return ((myPow(k-1,n)*10)%n);
}
这样你就不会处理大于n的数字。 它的编写方式将得到k的线性复杂度,用于计算功效,因此函数order_ten(n)的n的二次复杂度。如果这太慢了你可以改进函数myPow使用一些智能取幂。