数学范围错误 - 有没有办法进一步限制此算法以避免

时间:2015-04-10 11:49:12

标签: algorithm math primes

处理项目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;
&#13;
&#13;

1 个答案:

答案 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使用一些智能取幂。