Python - 在给定的大数范围内找到所有完美正方形的最快方法
Posted
技术标签:
【中文标题】Python - 在给定的大数范围内找到所有完美正方形的最快方法【英文标题】:Python - Fastest way to find all perfect squares in a given large number range 【发布时间】:2013-04-05 18:38:58 【问题描述】:我正在尝试编写一种方法来在 Python 中获取给定范围内的所有完美正方形。一个很大的范围,比如 2621163 和 520001400002 之间。现在显然遍历范围并检查一个数字是否像这样完美
def is_square(n):
return math.sqrt(n).is_integer()
然后打印它对于大范围来说是愚蠢的(对于小范围来说效果很好)并且需要永远。我想知道是否有任何 Python 魔法或数学魔法(比如修改后的丢番图方程)可以用于此目的。
编辑:我也在使用 Python 3.X,所以我可以使用大整数。
【问题讨论】:
【参考方案1】:你意识到如果你知道第一个和最后一个最接近的完美正方形,剩下的就是它们之间的范围。我会这样计算:
import math
def all_squares(a,b):#a is the starting point whereas b is the end of range
smallest = int(math.ceil(math.sqrt(a)))#perfect square closest to lower bound (rounded up)
largest = int(math.sqrt(b))#perfect square closest to upper bound (rounded down)
squares = []
for s in range(smallest, largest+1):
squares.append(s**2)
return squares
【讨论】:
【参考方案2】:没有使用函数的简单python代码
import math
num=500
for i in range(1,math.ceil(math.sqrt(num))):
print(i*i)
【讨论】:
【参考方案3】:使用 numpy 获得 1 到 100 位的完美平方
import numpy as np
a=int(np.sqrt(x)) for x in range(1,101)
b= np.power(list(a),2)
print(a)
print(b)
【讨论】:
【参考方案4】:您可以简单地找到在指定范围内具有正方形的最小和最大数字。然后您可以返回该范围内每个数字的平方。
import math
def perfect_squares(min, max):
lowest = int(math.ceil(math.sqrt(min)))
highest = int(math.sqrt(max))
return (n**2 for n in range(lowest, highest + 1))
【讨论】:
【参考方案5】:想象一下这个数字是 34929456,你可以知道它不是一个完美的正方形,因为它被拆分 3:4:9:2:9:4:5:6= 42. 42 不是一个正方形数字,所以这意味着 34929456 不是一个完美的正方形! (我没有使用计算器)现在我们知道它不是一个完美的正方形,你会把它向上/向下四舍五入...... 所以,你取最后 2 位数字,56!用个位数计算 56 是 7(Times)8=56! 34929456 是一个 8 位数字,因此意味着 8-7=1+4=5。所以这意味着答案在 5000 到 6000 之间。现在,你做一点猜测。让我们做 5500 平方 = 30250000。所以我们知道平方根有点大!现在让我们试试 5910。5910 的平方 = 34928100。所以知道我们知道答案在 5910 和 5911 之间!谢谢阅读! :P,希望对您有所帮助!
【讨论】:
完全平方 (PS) 数的位数之和不必是完全平方,例如64, 256.【参考方案6】:def perfect_squares(start, stop):
return (i*i for i in xrange(math.ceil(math.sqrt(start)), math.floor(math.sqrt(stop)) + 1))
【讨论】:
以上是关于Python - 在给定的大数范围内找到所有完美正方形的最快方法的主要内容,如果未能解决你的问题,请参考以下文章