■ドミノ・タイリング(その38)
【2】畳の敷き方数の数値計算誤差
m,nが大きくなるとプログラムの数値計算誤差が顕著になってくる.たとえば単精度で計算した場合,29682.5のような値が出てくるが,これでは29682なのか29683なのか,あるいはもっと違った値になるのか判断できないことになる.
そこで,K(n×2m)にフィボナッチ数列
Fn=aFn-1+bFn-2 (2項漸化式)
やトリボナッチ数列
Tn=aTn-1+bTn-2+cTn-3 (3項漸化式)
のような加法的関係,たとえば,
K(n×2m)=aK((n−1)×2m)+bK(n×2(m−1))+cK((n−1)×2(m−1))
が成り立てば,K(n×2m)の値を誤差なく求めることができることになる.
n=1の場合,畳の敷き方はただ1通りであるから,
K(1×2m)=1
n=2の場合,
K(2×2m)=Π(k=1~m){1+4cos^2(kπ/(2m+1))}
であるから,これはF2m(フィボナッチ数列の第2m項)になっていることがわかる.
F2m=F2m-1+F2m-2
と順次計算することによって
m/n 1 2
6 1 233
7 1 610
8 1 1597
9 1 4181
10 1 10946
が得られる.
一般に,nが偶数のときには
K(n×2m)=K(2m×2(n/2))
という関係が成り立つが,これで得られるK(n×2m)はほとんどない.
n=3,4,・・・の場合はどうだろうか.
K(3×2m)=Π(k=1~m)Π(l=1~2){4cos^2(lπ/4)+4cos^2(kπ/(2m+1))}
K(4×2m)=Π(k=1~m)Π(l=1~2){4cos^2(lπ/5)+4cos^2(kπ/(2m+1))}
K(4×2m)−K(3×2m)=16^mΠ(k=1~m){(cos^2(π/5)cos^2(2π/5)−cos^2(π/4)cos^2(2π/4)−(cos^2(π/5)+cos^2(2π/5)−cos^2(π/4)+cos^2(2π/4)cos^2(kπ/(2m+1))}
となって,期待しているような簡単な加法的関係にはなりそうにない.
K(5×2m)=Π(k=1~m)Π(l=1~3){4cos^2(lπ/6)+4cos^2(kπ/(2m+1))}
K(6×2m)=Π(k=1~m)Π(l=1~3){4cos^2(lπ/7)+4cos^2(kπ/(2m+1))}
K(6×2m)−K(5×2m)ではなおさらである.m=2,3,4,・・・としても同様であるから,この数列は加法的ではなく,本質的に乗積的関係にあるのであろう.
===================================