我在reddit上看到一个post关于Euler猜想的反例。我决定自己试试蛮力计算法。你知道吗
我的密码是
import numpy as np
fifths1 = np.arange(1,151)
fifths = fifths1**5
for x in fifths1:
for y in fifths1:
for z in fifths1:
for w in fifths1:
lambdas=[x,y,z,w]
if sum(np.array(lambdas)**5) in fifths:
print((x,y,z,w))
但是,代码需要很长时间,因为它会对案例进行三重检查。你知道吗
从我链接的论文来看,反例是
27^5 + 84^5 + 110^5 + 113^5 = 144^5
我的代码返回
(27, 84, 110, 133)
(27, 84, 133, 110)
(27, 110, 84, 133)
(27, 110, 133, 84)
(27, 133, 84, 110)
(27, 133, 110, 84)
如何优化暴力搜索,使其不会多次检查同一案例。你知道吗
我认为NumPy是错误的图书馆在这里使用。你知道吗
这不是一个可以很容易地以当前形式矢量化的问题(使用该库的最大原因),而且,在NumPy数组上循环比在Python列表上循环要慢得多。你知道吗
每次在内部循环中构造一个新的NumPy数组并使用
in
检查和(复杂性为O(n)
),也会导致性能下降。你知道吗正如其他人所指出的,
itertools
允许您测试四个五次方的每一个组合一次。使用集合成员身份(O(1)
复杂性)检查这些幂的和是否也是第五个幂也将提高性能:很快就会回来:
然后你可以从那里恢复第五根。你知道吗
通过计算每个循环中的当前位置,并在以后的循环中仅从该位置开始,可以避免多次执行该操作:
通过使用预先计算的
**5
值,可以进一步加快速度:只需使用
itertools.combinations
而不是手动循环:相关问题 更多 >
编程相关推荐