;;; Common Lisp definition for reverse(n), which permutes the integers, but integer_length(reverse(n))=integer_length(n). (defun myreverse (n) ;;; This definition makes no pretense at efficiency. ;;; I just wanted to get the values correct. ;;; Compute a character string of bits; reverse that; & convert back to a number. (cond ((minusp n) (- (myreverse (- n)))) ((zerop n) 0) ((evenp n) (* 2 (myreverse (/ n 2)))) (t (values (read-from-string (concatenate 'string "#b" ; interpret number as binary (reverse (format nil "~b" n)))))))) (defun test-myreverse (n) (dotimes (i n) (let* ((ri (myreverse i))) (unless (= i ri) (print `(,i ,ri)))))) ;;; In the range 0-63, these are the entries that are _not_ fixed points for reverse(n): (11 13) (13 11) (19 25) (22 26) (23 29) (25 19) (26 22) (29 23) (35 49) (37 41) (38 50) (39 57) (41 37) (43 53) (44 52) (46 58) (47 61) (49 35) (50 38) (52 44) (53 43) (55 59) (57 39) (58 46) (59 55) (61 47)