【发布时间】:2010-03-15 07:43:45
【问题描述】:
我正在尝试实现 Fermat 的因式分解(计算机编程艺术第 2 卷中的算法 C)。不幸的是,在我的版本(ISBN 81-7758-335-2)中,这个算法打印不正确。下面的因子内循环的条件应该是什么?我正在运行循环,直到 y
(if (< limit y) 0 (factor-inner x (+ y 2) (- r y) limit))
有没有办法完全避免这种情况,因为它会使循环速度加倍?
(define (factor n)
(let ((square-root (inexact->exact (floor (sqrt n)))))
(factor-inner (+ (* 2 square-root) 1)
1
(- (* square-root square-root) n)
n)))
(define (factor-inner x y r limit)
(if (= r 0)
(/ (- x y) 2)
(begin
(display x) (display " ") (display y) (display " ") (display r) (newline)
;;(sleep-current-thread 1)
(if (< r 0)
(factor-inner (+ x 2) y (+ r x) limit)
(if (< limit y)
0
(factor-inner x (+ y 2) (- r y) limit))))))
【问题讨论】:
-
为什么你认为书中提出的算法是错误的?
-
如果您认为错误,请从 Knuth 下载勘误表并检查该页码。如果你在那里找不到,请告诉他。
-
@user49117:因为它是错误的。这是算法。如该版本的书所述。它甚至不会以给出的方式终止。 C1: set x = 2sqrt(N)+1, y=1, r= (sqrt(N))^2-N // sqrt(N) 舍入到下限 C2: 如果 r=0,完成。 C3:设置 r=r+x,x+=2 C4:设置 r=r-y,y+=2 C5:如果 r > 0,则返回 c3,否则转到 c2。 @伊恩:谢谢!会这样做。
-
在第三版中,C5 表示如果 r > 0 则返回 C4,而不是 C3。
-
@Jason:我的版本中没有[这是第三版,而是印度版]!