単純連分数
http://www.sampou.org/cgi-bin/haskell.cgi?Everyday%3a2004-12-19&l=jpより。
TODO
- 実数ωとはなんだろう?
追記(2004-12-20)
このエントリを書いた後にhttp://www.sampou.org/cgi-bin/haskell.cgi?Everyday%3a2004-12-19&l=jpが更新された。特別な数ではなくてただ任意の実数に名前をつけただけだった。
- [1,1..]のときが一番誤差が入りやすいと思って、toRational (SCF [1,1..]) :: Doubleの値が変化しなくなった50桁に制限したのは正しいか?
56桁の理由*1
単純連分数に対しにより[0,1]区間上の関数を定める。を桁までで切ったものはである。以後は1以上の整数をあらわす。
よりである。
したがって、となるようなをとれば、仮数53bitの浮動小数で表現するには十分である。
(でおさえる)。より。。ついでにの単純連分数について
[n,n...]と同じ数字だけの単純連分数を考えてみる。
と書ける。二次方程式だから解けて。
[m,n,n...]という連分数を考える。。ここでと置くと、。
だから、の連分数は[1,2,2,2,..]()とわかる。
Code
module CFrac where newtype SCFrac = SCF [Int] deriving (Show, Eq) instance Ord SCFrac where instance Num SCFrac where instance Fractional SCFrac where fromRational a = SCF cs where as = a:map (1 /) (takeWhile (/= 0) $ zipWith (-) as $ map fromIntegral cs) cs = map floor as instance Real SCFrac where toRational (SCF xs) = foldr1 (\x y -> x + 1 / y) $ map fromIntegral $ take 56 xs
Example
CFrac> realToFrac (SCF (1:repeat 2)) 1.4142135623731 CFrac> realToFrac (sqrt 2) :: SCFrac SCF [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,7,1,2,33,2,7,5,2,1,1,16,2]
*1:何回も書き直した。この程度のものでもいきなりタイプというのはよくないのか