;; Pythagorean triples using combinations.
(use-modules (srfi srfi-1))
(define (combinations sequence k yield)
(let loop ((rest sequence) (n k) (out '()))
(if (zero? n)
(yield (reverse out))
(pair-for-each (lambda (p)
(loop (cdr p) (- n 1) (cons (car p) out)))
rest))))
(define (primitive-pythagorean-triple? x y z)
(and (< x y z)
(= (+ (* x x) (* y y)) (* z z))
(= (gcd x y z) 1)))
(define (pythagorean-triples n)
(let ((out '()))
(combinations (iota n 1) 3
(lambda (v)
(apply (lambda (x y z)
(when (primitive-pythagorean-triple? x y z)
(set! out (cons v out))))
v)))
(sort out (lambda (x y) (< (third x) (third y))))))
(for-each (lambda (x) (format #t "~A~%" x)) (pythagorean-triples 53))
OzsgUHl0aGFnb3JlYW4gdHJpcGxlcyB1c2luZyBjb21iaW5hdGlvbnMuCgoodXNlLW1vZHVsZXMgKHNyZmkgc3JmaS0xKSkKCihkZWZpbmUgKGNvbWJpbmF0aW9ucyBzZXF1ZW5jZSBrIHlpZWxkKQogIChsZXQgbG9vcCAoKHJlc3Qgc2VxdWVuY2UpIChuIGspIChvdXQgJygpKSkKICAgIChpZiAoemVybz8gbikKICAgICAgICAoeWllbGQgKHJldmVyc2Ugb3V0KSkKICAgICAgICAocGFpci1mb3ItZWFjaCAobGFtYmRhIChwKQogICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgKGNkciBwKSAoLSBuIDEpIChjb25zIChjYXIgcCkgb3V0KSkpCiAgICAgICAgICAgICAgICAgICAgICAgcmVzdCkpKSkKCihkZWZpbmUgKHByaW1pdGl2ZS1weXRoYWdvcmVhbi10cmlwbGU/IHggeSB6KQogIChhbmQgKDwgeCB5IHopCiAgICAgICAoPSAoKyAoKiB4IHgpICgqIHkgeSkpICgqIHogeikpCiAgICAgICAoPSAoZ2NkIHggeSB6KSAxKSkpCgooZGVmaW5lIChweXRoYWdvcmVhbi10cmlwbGVzIG4pCiAgKGxldCAoKG91dCAnKCkpKQogICAgKGNvbWJpbmF0aW9ucyAoaW90YSBuIDEpIDMKICAgICAgKGxhbWJkYSAodikKICAgICAgICAoYXBwbHkgKGxhbWJkYSAoeCB5IHopCiAgICAgICAgICAgICAgICAgKHdoZW4gKHByaW1pdGl2ZS1weXRoYWdvcmVhbi10cmlwbGU/IHggeSB6KQogICAgICAgICAgICAgICAgICAgICAgIChzZXQhIG91dCAoY29ucyB2IG91dCkpKSkKICAgICAgICAgICAgICAgdikpKQogICAgKHNvcnQgb3V0IChsYW1iZGEgKHggeSkgKDwgKHRoaXJkIHgpICh0aGlyZCB5KSkpKSkpCgooZm9yLWVhY2ggKGxhbWJkYSAoeCkgKGZvcm1hdCAjdCAifkF+JSIgeCkpIChweXRoYWdvcmVhbi10cmlwbGVzIDUzKSk=