以下代码生成从1到n的质数:
(defun prime-list(n)
(let ((a)(b)(x (floor (sqrt n))))
(loop for i from (floor n 6) downto 1 do
(push (1+ (* 6 i)) a)
(push (1- (* 6 i)) a))
(loop while (<= (car a) x) do
(push (car a) b)
(setf a (remove-if #'(lambda(m)(or (= 0 (mod m (car a))) (> m n))) a)))
(append '(2 3) (reverse b) a)))
It seems to me the part
(setf a (remove-if #'XXX a))
可以被替换为
(delete-if #'XXX a)
我希望这样做能够加快速度。然而,当我进行了更改后,该函数进入了无限循环,永远不会返回。为什么会这样呢?
while (<= (car a) x)
。 错误2: 由于任何质数都可以表示为6i+-1
的形式,因此任何质数的平方模6余1。如果对于某个质数p
,有n == p^2-1
,则有n == 6i
对于某个i
成立。Q 中的代码将6i+1 == p^2
加入到列表中;但是会通过x = sqrt(n) < p
进行测试,因此会将p^2
包含在输出中。因此,当使用n=p^2-1
调用时,上述代码将产生p^2
作为其输出中的最后一个元素。(我没有编辑这个原因是 Q 不涉及代码的有效性)。 - Will Ness