我有以下代码:
def isPP(n):
pos = [int(i) for i in range(n+1)]
pos = pos[2:] ##to ignore the trivial n** 1 == n case
y = []
for i in pos:
for it in pos:
if i** it == n:
y.append((i,it))
#return list((i,it))
#break
if len(y) <1:
return None
else:
return list(y[0])
这在2000年之前是完美的,因为我在内存中存储了太多。我该怎么做才能让它对大量的人(比如5万或10万人)有效地工作呢。我试图在找到一个案例后结束它,但是如果数量很大,我的算法仍然效率太低。在
有什么提示吗?在
迭代检查“它有平方根吗?”?它有立方根吗?它有第四个根吗?…”你将很快到达假设根必须在}之间的点,此时你可以停止。在
1
和{如果存在Ab和e,则一个数n是一个理想幂。例如216=6^3=2^3*3^3是一个完美的幂,但72=2^3*3^2不是。在
如果小于em>的幂是小于em>的,那么要知道这个数是的。此外,只需要测试素数的素数,因为如果一个数是复合指数的完美幂,那么它也将是复合分量素因子的完美幂;例如,2^15=32768=32^3=8^5是完美的立方根,也是完美的第五根。在
下面所示的函数
isPerfectPower
首先用牛顿方法计算整数根,然后对结果进行验证,以检查它是否等于n,从而测试每个小于log2n的素数。辅助函数primes
用埃拉托斯thenes的筛子计算一个素数列表,iroot
用牛顿法计算整数k次根,ilog
通过二元搜索计算出以b为底的整数对数。在关于my blog的完全幂谓词还有进一步的讨论。在
相关的改进将是:
相关问题 更多 >
编程相关推荐