【发布时间】:2014-09-28 19:43:27
【问题描述】:
我正在尝试了解这种特殊的素数分解解决方案(取自http://rosettacode.org/wiki/Prime_decomposition#Python:_Using_floating_point),并且对step 的定义中位运算符的使用感到有些困惑
def fac(n):
step = lambda x: 1 + (x<<2) - ((x>>1)<<1)
maxq = long(floor(sqrt(n)))
d = 1
q = n % 2 == 0 and 2 or 3
while q <= maxq and n % q != 0:
q = step(d)
d += 1
return q <= maxq and [q] + fac(n//q) or [n]
我理解它的作用(乘以 x 3,然后如果 x 是偶数则加 1,如果 x 是奇数则加 2),但我不太明白为什么在这种情况下会诉诸按位运算。除了这个公式明显简洁之外,是否有理由使用按位运算符而不是更明确的解决方案:
mystep = lambda x: (3 * x) + 1 if (x % 2 == 0) else (3 * x) + 2
如果有充分的理由(例如,(x>>1)<<1 比模算术更有效,正如 here 所建议的那样),是否有从具有多个位运算符的表达式中提取底层逻辑的通用策略?
更新
按照答案中的建议,我用 step 和 my step 对版本进行了计时,差异是难以察觉的:
%timeit fac(600851475143)
1000 loops, best of 3: 306 µs per loop
%timeit fac2(600851475143)
1000 loops, best of 3: 307 µs per loop
【问题讨论】: