; an integer formula for fibonacci numbers
(define (range . args)
(case (length args)
((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
((3) (let ((le? (if (negative? (caddr args)) >= <=)))
(let loop ((x(car args)) (xs '()))
(if (le? (cadr args) x)
(reverse xs)
(loop (+ x (caddr args)) (cons x xs))))))
(else (error 'range "unrecognized arguments"))))
(define (bitwise-and a b)
(if (or (zero? a) (zero? b)) 0
(+ (* (bitwise-and (floor (/ a 2)) (floor (/ b 2))) 2)
(if (or (even? a) (even? b)) 0 1))))
(define (ash int cnt)
(if (negative? cnt)
(let ((n (expt 2 (- cnt))))
(if (negative? int)
(+ -1 (quotient (+ 1 int) n))
(quotient int n)))
(* (expt 2 cnt) int)))
(define (fib n)
(bitwise-and
(quotient
(ash 4 (* n (+ 3 n)))
(- (ash 4 (* 2 n)) (ash 2 n) 1))
(- (ash 2 n) 1)))
(display (map fib (range 25)))
OyBhbiBpbnRlZ2VyIGZvcm11bGEgZm9yIGZpYm9uYWNjaSBudW1iZXJzCgooZGVmaW5lIChyYW5nZSAuIGFyZ3MpCiAgKGNhc2UgKGxlbmd0aCBhcmdzKQogICAgKCgxKSAocmFuZ2UgMCAoY2FyIGFyZ3MpIChpZiAobmVnYXRpdmU/IChjYXIgYXJncykpIC0xIDEpKSkKICAgICgoMikgKHJhbmdlIChjYXIgYXJncykgKGNhZHIgYXJncykgKGlmICg8IChjYXIgYXJncykgKGNhZHIgYXJncykpIDEgLTEpKSkKICAgICgoMykgKGxldCAoKGxlPyAoaWYgKG5lZ2F0aXZlPyAoY2FkZHIgYXJncykpID49IDw9KSkpCiAgICAgICAgICAgKGxldCBsb29wICgoeChjYXIgYXJncykpICh4cyAnKCkpKQogICAgICAgICAgICAgKGlmIChsZT8gKGNhZHIgYXJncykgeCkKICAgICAgICAgICAgICAgICAocmV2ZXJzZSB4cykKICAgICAgICAgICAgICAgICAobG9vcCAoKyB4IChjYWRkciBhcmdzKSkgKGNvbnMgeCB4cykpKSkpKQogICAgKGVsc2UgKGVycm9yICdyYW5nZSAidW5yZWNvZ25pemVkIGFyZ3VtZW50cyIpKSkpCgooZGVmaW5lIChiaXR3aXNlLWFuZCBhIGIpCiAgKGlmIChvciAoemVybz8gYSkgKHplcm8/IGIpKSAwCiAgICAoKyAoKiAoYml0d2lzZS1hbmQgKGZsb29yICgvIGEgMikpIChmbG9vciAoLyBiIDIpKSkgMikKICAgICAgIChpZiAob3IgKGV2ZW4/IGEpIChldmVuPyBiKSkgMCAxKSkpKQoKKGRlZmluZSAoYXNoIGludCBjbnQpCiAgKGlmIChuZWdhdGl2ZT8gY250KQogICAgICAobGV0ICgobiAoZXhwdCAyICgtIGNudCkpKSkKICAgICAgICAoaWYgKG5lZ2F0aXZlPyBpbnQpCiAgICAgICAgICAgICgrIC0xIChxdW90aWVudCAoKyAxIGludCkgbikpCiAgICAgICAgICAgIChxdW90aWVudCBpbnQgbikpKQogICAgICAoKiAoZXhwdCAyIGNudCkgaW50KSkpCgooZGVmaW5lIChmaWIgbikKICAoYml0d2lzZS1hbmQKICAgIChxdW90aWVudAogICAgICAgKGFzaCA0ICgqIG4gKCsgMyBuKSkpCiAgICAgICAoLSAoYXNoIDQgKCogMiBuKSkgKGFzaCAyIG4pIDEpKQogICAgKC0gKGFzaCAyIG4pIDEpKSkKCihkaXNwbGF5IChtYXAgZmliIChyYW5nZSAyNSkpKQ==