Polya's conjecture是一个数学猜想,假设第一个(-1)^(Ω(n))的和,其中ω(n)是n的重数的素数,始终为负或零。在
一个反例是906316571,它是五十年前发现的。我想知道他们怎么会找到它,因为它需要大量的时间,我试图优化我的python算法,但仍然需要大量的时间,你能帮我优化吗?在
这是我的代码(我用记忆法)
>>> class Memoize:
def __init__(self, f):
self.f = f
self.memo = {}
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.f(*args)
return self.memo[args]
>>> def sieve(m):
n=m+1;
s=[];
for i in range(2,n):
s.append(i);
k=0;
while k<len(s):
for i in range(2,int(n/s[k])+1):
x=i*s[k];
if s.count(x)==1:
s.remove(x);
k=k+1;
return s;
>>> s=sieve(100000);
>>> def omega(n):
k=0;
if n==1:
return 0;
else :
while k<len(s) and n%s[k]!=0 :
k=k+1;
if k<len(s):
return omega(int(n/s[k]))+1;
else :
return 1;
>>> omega=Memoize(omega)
>>> def polya(n):
h=omega(n);
if n==1:
return 0;
else :
if omega(n)%2==0:
return polya(n-1)+1;
else :
return polya(n-1)-1;
>>> polya=Memoize(polya);
>>> while polya(k)<=0 :
k=k+1;
正如{}告诉你的那样,最初1958年的证据并不是用暴力来完成的。它也没有透露最小的违反规则的数字,它是1980年才发现的。我根本没有研究过这个案子,但1980年的证据可能是用电脑做的。这更多的是可用RAM的数量问题,而不是处理速度的问题。在
然而,在现代计算机中,用蛮力来解决这个问题应该不难。Python并不是这里的最佳选择,但是仍然可以在合理的时间内找到这些数字。在
这不是最快或最优化的函数,其背后的数学原理应该非常明显。在我的机器(i7)中,运行在一个核心上,大约需要2800秒来计算全表的素数因子,最大可达1×10^9。(但请注意,在没有64位python和至少8gb RAM的情况下不要尝试此操作。累计和表消耗4 GB。)
为了证明上述函数至少能很好地工作,下面是一个有趣区域的图:
由于第一个数字有一些问题,上面代码给出的结果有点偏差。要获得正式的Liouville lambda求和,请使用
cumulative[n-1] + 2
。对于问题(906316571)中提到的数字,结果是cumulative[906316570] + 2
等于829,这是该区域中的最大值。在相关问题 更多 >
编程相关推荐