第5夜:ヤシの実で三角形をつくる
数の悪魔*1の中から題材を取り、Schemeプログラミングしてます。その5回目。三角数です。
(define (triangler-number s) (define (decorate n m) (format #f "~3D = ~2D + ~3D : ~V,,,VA ~%" (+ n m) n m n #\o "")) (define (tri-iter n m l) (if (> n s) (reverse l) (tri-iter (+ n 1) (+ n m) (cons (decorate n m) l)))) (tri-iter 1 0 '()) ) (define (main args) (print (string-join (triangler-number 10) "")) 0)
Gaucheのformatを使って、やしの実を描くのをズルしてます。結果は以下のとおり。
1 = 1 + 0 : o 3 = 2 + 1 : oo 6 = 3 + 3 : ooo 10 = 4 + 6 : oooo 15 = 5 + 10 : ooooo 21 = 6 + 15 : oooooo 28 = 7 + 21 : ooooooo 36 = 8 + 28 : oooooooo 45 = 9 + 36 : ooooooooo 55 = 10 + 45 : oooooooooo
こんどは、すごいことを教えてやろう。となりあっている2つの<三角形の数>をたす。すると、びっくり仰天、すごいことがわかるぞ - 数の悪魔
(define (sum-triangler-number s) (define (decorate n m) (format #f "~2D + ~2D = ~2D = square ~2D ~%" n m (+ n m) (sqrt (+ n m)))) (define (sum-iter i n m l) (if (> i (+ s 1)) (reverse l) (sum-iter (+ i 1) (+ i n) n (cons (decorate n m) l)))) (sum-iter 3 3 1 '()) ) (define (main args) (print (string-join (sum-triangler-number 10) "")) 0)
結果は以下のとおり。ちょっとだけ計算機っぽい。
3 + 1 = 4 = square 2 6 + 3 = 9 = square 3 10 + 6 = 16 = square 4 15 + 10 = 25 = square 5 21 + 15 = 36 = square 6 28 + 21 = 49 = square 7 36 + 28 = 64 = square 8 45 + 36 = 81 = square 9 55 + 45 = 100 = square 10
三角数の求め方は、(n^2)/2+n/2=n*(n+1)/2で求まります。これは組み合わせのC(n+1,2)と同じで、パスカルの三角形に出現します。本では、この章以降、数学の深みへと導かれて行くことになります。
最後に、ウルフラム・アルファさんに聞いてみよう。