from functools import reducedef factors(n): return set(reduce(list.__add__, ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))
这将很快返回所有因素
n。
为什么以平方根为上限?
sqrt(x) * sqrt(x) =x。因此,如果两个因素相同,则它们都是平方根。如果使一个因子变大,则必须使另一个因子变小。这意味着这两个之一将始终小于或等于
sqrt(x),因此您只需要搜索到该点即可找到两个匹配因子之一。然后,您可以使用
x/ fac1获取
fac2。
该
reduce(list.__add__, ...)走的小名单
[fac1, fac2],并在一个长长的清单一起加入他们。
在
[i, n/i] for i in range(1, int(sqrt(n)) + 1) if n % i ==0返回两个因素,如果当你除以其余
n由较小的一个是零(它并不需要检查较大的一个过;它只是获取除以
n由较小的一个。)
该
set(...)在外面摆脱重复,这仅发生于完美的正方形。对于
n = 4,它将返回
2两次,因此
set摆脱其中之一。



