haipart bug



>>>>> "Andreas" == Andreas Eder <Andreas.Eder@t-online.de> writes:

    Andreas> I think the function haipart in clmacs.lisp is buggy.
    Andreas> Actually there are two definitions in there: the one that is active is
    Andreas> buggy, and the one that works is commented out because it is
    Andreas> supposedly slower. But that one is the right one. The currently active
    Andreas> one gives wrong values for negative count arguments e.g. 
    Andreas> (haipart 10 -2) gives 0 though it should be 2.

    Andreas> I enabled the correct one (commented out the bad one) and everything
    Andreas> seems to be fine. Especially the jacobi symbol in numth.lisp is now
    Andreas> working correctly.

    Andreas> This should be corrected in the CVS.

    Andreas> Just for the record, the correct definition is:

    Andreas> (defun haipart (integer count)
    Andreas>   (let ((x (abs integer)))
    Andreas>     (if (minusp count)
    Andreas>       (ldb (byte (- count) 0) x)
    Andreas>       (ldb (byte count (max 0 (- (integer-length x) count))) x))))


There appears to be a typo in the current haipart.  Would the following
work better:

(defun haipart (x n)
  (let ((x (abs x)))
    (cond ((< n 0)
	   (logand x (1- (ash 1 (- n)))))
	  (t
	   (ash x (min (- n (integer-length x))
		       0))))))

The bug is (< n 0).  It was (< x 0).

What does haipart mean anyway?  What is it really supposed to do?

    Andreas> PS: I think I will go over all the numbertheoretic functions and
    Andreas> correct them, because most are not working properly (see the comment
    Andreas> on primep in the mailing list).

That would be excellent.

    Andreas> But don't hold yout breath :-)

It's free software.  Nobody should be holding their breath. :-)

Ray