在下面的问题中,我试图编写一个python脚本,对四个五次方进行暴力搜索,四个五次方的总和等于五次方。因此,我试图找到数字a1,a2,a3,a4,a5,这样a1^5+a2^5+a3^5+a4^5=a5^5
此搜索的范围是Nmin=20和Nmax=200。另外,Nmin<;=a1<;a2<;a3<;a4<;a5<;=Nmax。所以每个数都必须小于之前的数,并且必须在20到200之间。你知道吗
import numpy as np
b = np.arange(20,201)
a = b**5
for x in b:
for y in b:
for z in b:
for w in b:
lambdas=[x,y,z,w]
if sum(np.array(lambdas)**5) in a:
print((x,y,z,w))
其输出如下:
(20, 64, 128, 192)
(20, 64, 192, 128)
(20, 128, 64, 192)
(20, 128, 128, 128)
(20, 128, 192, 64)
(20, 192, 64, 128)
(20, 192, 128, 64)
所以这是错误的输出,我应该得到以下结果:
(27, 84, 110, 133)
似乎没有考虑a1<;a2<;a3<;a4<;a5。我正在寻找一些帮助修复此代码!不是为了提高效率,跑得更快,只是为了得到正确的答案
你看过
a
吗?可能你看到的是这样的情况:这里可以看到负数,这是因为
int32
的类型不够大,无法处理所有数字的五次方:但是
这就足够了。你知道吗
所以,如果我换成
以及
然后我得到
一如预期。你知道吗
(优化点#1:如果使用
itertools.combinations
,不仅不必嵌套循环,而且速度会快得多,因为不会查找数字的每个排列。你知道吗当
a
是数组时,优化点#2:in a
可能非常慢,因为它必须扫描整个列表。如果您将a
设为一个集合,那么成员资格测试几乎是即时的。)最重要的是,如果您想拥有这个限制,您需要将它编码到您的循环范围中。只需使用前一个循环的变量作为起始值,就可以得到所需的限制。你知道吗
输出:
我不知道你是怎么运行上一个循环来得到你发布的答案的。你知道吗
你为什么要用
numpy
作为你的控件?这似乎增加了一层只会减慢处理速度的软件。相反,只需将其编码为“普通”Python数学。另外,使用set
检查总和,而不是列表。对集合进行散列也会加快您多次执行的一次检查。你知道吗这得到了正确的答案,并在20秒内完成;您的原始版本(一旦我更正了缩进)花了3分钟。你知道吗
相关问题 更多 >
编程相关推荐