第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)と同じで、パスカルの三角形に出現します。本では、この章以降、数学の深みへと導かれて行くことになります。
最後に、ウルフラム・アルファさんに聞いてみよう。

*1:Hans Magnus Enzensberger,1997,Der Zahlenteufel,エンツェンスベルガー 丘沢静也(訳),2000,数の悪魔,晶文社