数学ガールは決して架空のものではない
今日の僕の話。
登場人物
- 俺
- 中3。数研部員。
- 趣味は数学とプログラミング。
- 数学好きだけど、厳密な証明とかは好きではなく、数式をいじって遊ぶのは好き。
- 数学のカリキュラムに乗っ取った勉強はしていないので、抜け落ちてる定理は多い。
- 友1
- 友2
- 先輩1
- Wikipedia
そのに、ネットにて
俺「あれ、このΓってガンマってよむんだっけか…」
Wikipediaでしらべる。
俺「なんだこのガンマ関数」
いつもの癖で、リンクをたどる。
Wikipedia「ガンマ関数っていうのは、階乗の複素数への拡張のことですよ、お兄さん。」
俺「へえー、の階乗に相当するのはなのかー」
そのさん、学校にて
俺「…というわけで、置換積分をつかうと4次元球の体積が求められるらしい」
友1「なるほど」
俺「先輩がいってたことをまとめると、の積分を一般化できれば、一般のn次元球の体積が数学的帰納法で求まることになるな」
俺「どうやればいいんだろう」
俺「をうまくの和に分解できればいいのかな」
実際に分解してみる
俺「うーむ。。。」
(しばし悩む)
俺「じゃん!」
俺「ってことは、この数式の係数はパスカルの三角形とみなせる!」
しばし考える。
俺「こうか」
俺「こうなるっぽい」
友1「それ確か積和公式かなんかだった」
俺「なに、そうだったのか」
そのよん、学校にて
俺「とりあえず、の和に分解できたから、それの積分を考えればいいのか」
俺「これは簡単そうだな。」
俺「あれ、でもm=0のときは例外か」
俺「」
俺「なるほど、だから偶数次のときだけπの次数が増加するのか(m=0が存在するのは偶数次のときだけ)」
俺「あれ、偶数次の場合、mが0以外の項の積分はぜんぶ0か」
俺「あと、奇数次の場合は、普通に積分したほうがはやそうだ」
とかいっていろいろ計算。
n次元球の体積で、にかかる係数の、(n-1)次元球の係数に対する倍率は
nが偶数のときは
nが奇数のときは
そのご、家にて
俺「あれ、なんか気がついたらHaskellと戯れてた…」
俺「あ、ついでだから多次元球の体積でも求めてみようかな」
とかやってコードをかく。
module Main where import Data.Bits import Ratio import Data.Ratio import Prelude {- (**) :: Rational -> Integer -> Rational (**) _ 0 = 1 (**) x n = 1 -} combination :: Integer -> Integer -> Integer combination n 0 = 1 combination n x = ( combination n ( x - 1 ) ) * ( n - x + 1 ) `div` x ns :: Integer -> ( Rational , Integer , Integer) ns 0 = ( 1 % 1 , 0 , 0 ) ns x = if ( mod x 2 ) == 0 then ( on0 / ( 2 ^ x ) * fromIntegral ( combination x halfx ), on1 + 1 , on2 + 1 ) else ( on0 * 2 * are , on1 , on2 + 1) where ( on0 , on1 , on2 ) = ns (x - 1) halfx :: Integer halfx = shift x (-1) are :: Rational are = ( sum ( map are2 [0..halfx] ) ) are2 :: Integer -> Rational are2 k = fromIntegral ( ( combination halfx k ) ) * ( (-1) ^ ( halfx - k ) ) / fromIntegral (x - 2 * k ) main = do putStrLn ( foldl (++) "" ( map a [0..10] ) ) where a :: Integer -> String a i = "The space of " ++ (show i) ++ " dimension sphere is " ++ (product_complete ( (fracstr ns0) ++ (powerstr "PI" ns1) ++ (powerstr "r" ns2) ) ) ++ "\n" where (ns0, ns1, ns2) = ns i fracstr :: Rational -> String fracstr 1 = "" fracstr x | (denominator x) == 1 = (show (numerator x)) | otherwise = (show (numerator x)) ++ "/" ++ (show (denominator x)) powerstr :: String -> Integer -> String powerstr _ 0 = "" powerstr s 1 = s powerstr s x = s ++ "^" ++ (show x) product_complete :: String -> String product_complete "" = "1" product_complete s = s
俺「うむ、よさそうだ、では出力。ポチっとな。」
The space of 0 dimension sphere is 1 The space of 1 dimension sphere is 2r The space of 2 dimension sphere is PIr^2 The space of 3 dimension sphere is 4/3PIr^3 The space of 4 dimension sphere is 1/2PI^2r^4 The space of 5 dimension sphere is 8/15PI^2r^5 The space of 6 dimension sphere is 1/6PI^3r^6 The space of 7 dimension sphere is 16/105PI^3r^7 The space of 8 dimension sphere is 1/24PI^4r^8 The space of 9 dimension sphere is 32/945PI^4r^9 The space of 10 dimension sphere is 1/120PI^5r^10
俺「ふむふむ………」
俺「………!?!?」
俺「なんか、偶数次のときの係数が階乗の逆数になってる!!!!!!!!!!」
俺「ん。。。階乗、、、ガンマ関数?」
俺「そういえば、ガンマ関数はが関係してたなー。。。ってまさか!」
俺「そうか、奇数次のときはの答えにが入るのか!逆に、奇数次のときのPIの係数にをたすと辻褄があう!つまり」
半径rのn次元球の体積は
その夜はねむれなかった。
結論
数学で遊ぶのってほんとおもしろい。
離散と連続がからみあったりするし。なんでガンマ関数が多次元球の体積になるのか。まだわからない。
おもしろすぎる。
数学ガールみたいに、複数人で物語がひろがったわけじゃないけど、僕はこうやって、ふたつの事実が繋がる瞬間にであって、すごく感動した。
あ、あと、ここから先が楽しみなのでネタバレしないでね。