On 10/15/2012 11:49 AM, Jens Axel Søgaard wrote:
2012/10/15 Stephen Bloch <[email protected]>:

But probably slower, at least for exact numbers.  If "expt" were implemented naively as "for i 
= 1 to num", the total number of multiplications would be quadratic in degree; if it were implemented by 
repeated squaring, the total number of multiplications would be O(n log(n)); with Horner's algorithm or your 
"values" approach, it's linear.

Horner's algorithm gives us

(lambda (poly x)
    (for/fold ([sum 0])
       ([c (polynomial-coeffs poly)])
       (+ c (* sum x))))

If I recall correctly, Horner's algorithm also gives more precise results,
when used with pseudo real numbers.

Especially true when coefficients alternate signs, producing massive cancellation. That's the main reason to use it, since floating-point exponentiation runs in constant time. (It's also a tad faster, requiring at least 1-2 fewer flops per coefficient... but probably many more, because hardware `pow' is usually broken for non-rational inputs and implementations have to work around that.)

What I'd really like, by the time the math library has polynomials, is a Horner-like algorithm for sparse polynomials of the form

    c0 + ... + cn * x^(i_n) * y^(j_n) + ...

The sequence of (i_n,j_n) can only be partially ordered, which makes it tricky.

Neil ⊥

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to