; square pyramidal 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 (list)))
(if (le? (cadr args) x) (reverse xs)
(loop (+ x (caddr args)) (cons x xs))))))
(else (error 'range "unrecognized arguments"))))
(define (sum xs) (apply + xs))
(define (square x) (* x x))
(define (sq-pyr n) (sum (map square (range 1 (+ n 1)))))
(display (sq-pyr 15)) (newline)
(define (sq-pyr n) (/ (+ (* 2 n n n) (* 3 n n) n) 6))
(display (sq-pyr 15)) (newline)
(display (sq-pyr 1000000)) (newline)
OyBzcXVhcmUgcHlyYW1pZGFsIG51bWJlcnMKCihkZWZpbmUgKHJhbmdlIC4gYXJncykKICAoY2FzZSAobGVuZ3RoIGFyZ3MpCiAgICAoKDEpIChyYW5nZSAwIChjYXIgYXJncykgKGlmIChuZWdhdGl2ZT8gKGNhciBhcmdzKSkgLTEgMSkpKQogICAgKCgyKSAocmFuZ2UgKGNhciBhcmdzKSAoY2FkciBhcmdzKSAoaWYgKDwgKGNhciBhcmdzKSAoY2FkciBhcmdzKSkgMSAtMSkpKQogICAgKCgzKSAobGV0ICgobGU/IChpZiAobmVnYXRpdmU/IChjYWRkciBhcmdzKSkgPj0gPD0pKSkKICAgICAgICAgICAgKGxldCBsb29wICgoeCAoY2FyIGFyZ3MpKSAoeHMgKGxpc3QpKSkKICAgICAgICAgICAgICAoaWYgKGxlPyAoY2FkciBhcmdzKSB4KSAocmV2ZXJzZSB4cykKICAgICAgICAgICAgICAgIChsb29wICgrIHggKGNhZGRyIGFyZ3MpKSAoY29ucyB4IHhzKSkpKSkpCiAgICAoZWxzZSAoZXJyb3IgJ3JhbmdlICJ1bnJlY29nbml6ZWQgYXJndW1lbnRzIikpKSkKCihkZWZpbmUgKHN1bSB4cykgKGFwcGx5ICsgeHMpKQoKKGRlZmluZSAoc3F1YXJlIHgpICgqIHggeCkpCgooZGVmaW5lIChzcS1weXIgbikgKHN1bSAobWFwIHNxdWFyZSAocmFuZ2UgMSAoKyBuIDEpKSkpKQoKKGRpc3BsYXkgKHNxLXB5ciAxNSkpIChuZXdsaW5lKQoKKGRlZmluZSAoc3EtcHlyIG4pICgvICgrICgqIDIgbiBuIG4pICgqIDMgbiBuKSBuKSA2KSkKCihkaXNwbGF5IChzcS1weXIgMTUpKSAobmV3bGluZSkKCihkaXNwbGF5IChzcS1weXIgMTAwMDAwMCkpIChuZXdsaW5lKQ==