2020年10月11日日曜日

連分数と近似分数

 昨年6月のブログで, eの近似分数 878/323の求め方を話題にした. 先月出版された「コンピュータの数学 第2版」を拾い読みしていたら, Stern Brocot木の関連でeの近似分数を求める話があった.

Stern Brocot木は, 互いに素なmとnの分数を大きさの順に並べたもので, 次のような形である. ある場所の値は, その左上の一番近い祖先m, nと右上の一番近い祖先m', n'から m+m'/n+n' で得られる.


最上部の1/1からLでは左下へ, Rで右下へ辿ると, 色々な分数が一意的に表せる. そしてeは

e=RL0RLR2LRL4RLR6L ...

つまりRL0R, LR2L, RL4R, LR6L, ...

であって, Eulerが24歳の時に発見したと書いてあった.

早速計算するプログラムをSchemeで書いた.

(l)は左下へ, (r)は右下へ進む関数. lmnは左祖先, rmnは右祖先, cmnは現在の分数, nmnは次の世代の分数である.

(define (show) (display cmn))
(define lmn '(0 1)) (define cmn '(1 1)) (define rmn '(1 0))
(define (reset!) (set! lmn '(0 1)) (set! cmn '(1 1))
  (set! rmn '(1 0)) (show))
(define (l) (let ((nmn (map + lmn cmn)))
 (set! rmn cmn) (set! cmn nmn) (show)))
(define (r) (let ((nmn (map + cmn rmn)))
 (set! lmn cmn) (set! cmn nmn) (show)))
(for-each (lambda (c)
 (cond ((eq? c 'l) (l))
       ((eq? c 'r) (r))
       (else (reset!))))
  '(c r r l r r l r l l l l r l r r r))

実行すると,

(1 1)(2 1)(3 1)(5 2)(8 3)(11 4)(19 7)(30 11)(49 18)(68 25)

(87 32)(106 39)(193 71)(299 110)(492 181)(685 252)

(878 323)


すげー.


0 件のコメント: