裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

階乗とベンフォードの法則

2014年11月28日 | ブログラミング

8 バイト実数では,普通に階乗を計算しようとすると 171! は計算できない。

> prod(1:170)
[1] 7.257415615308e+306
> prod(1:171)
[1] Inf
> factorial(171)
[1] Inf
 警告メッセージ:
In factorial(171) :  'gammafn' 中の値が範囲を超えています

フィボナッチ数列のときと同じく,階乗の先頭一桁の分布がベンフォードの法則に従うかどうかを見たいとき,170 個の数字の分布では説得力がない。

そこで,
問題: 特別なライブラリや関数などを使わずに,10000000! の先頭の数字を求めよ。

プログラム例は,この記事の「コメント」として投稿しておく。

さて,そのようなプログラムを若干修正して 1! ~ 10000000! の先頭の数字 1e7 個の分布を調べる。

度数     3011187  1761416  1249153   969498   789733   669636   578730   512327   458320
パーセント 0.301119 0.176142 0.124915 0.096950 0.078973 0.066964 0.057873 0.051233 0.045832
理論値   0.301030 0.176091 0.124939 0.096910 0.079181 0.066947 0.057992 0.051153 0.045757

フィボナッチ数列の場合は理論値にごくごく近かったが,階乗の場合は少しズレがある。なぜかな?

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

問題:大きな数の先頭と末尾

2014年11月28日 | ブログラミング

特別なライブラリや関数を用いずに,810000000 乗(8 ^ 1e7)の先頭 4 桁と末尾 4 桁を求めよ。

解答例はコメントを参照

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

フィボナッチ数列とベンフォードの法則

2014年11月28日 | ブログラミング

フィボナッチ数列は急速に大きくなり,普通に計算するとオーバーフローしてしまう。

8 バイト実数での有効数字 16 桁なので,79 項目は 14472334024676220 と正確に表示できるが,それ以降は上位桁しかわからない。1476 項目は 1.306989e+308 となるが,1477 項目は計算されない(Inf になる)。

ベンフォードの法則を実例で示すために,フィボナッチ数列の各項の先頭の数字を求めて度数分布を求めるとき,1476 項までの結果では面白くない(その先どうなるか分からないじゃないかという意見もあるかも知れないし)。

多倍長演算によれば計算はできる。R だと,gmp ライブラリには fibnum 関数がある。しかし,それを使わなくても,目的は達成できる。

問題: 特別なライブラリや関数を使わずに,フィボナッチ数列の 1e7 項目の先頭の数字を求めよ。もちろん,計算時間は長くても数分以内とする。なお,答えは 1 である。

プログラム例は,この記事の「コメント」として投稿しておく。

さて,そのようなプログラムを使って,「フィボナッチ数列の 1e7 項までの先頭の数字の度数分布を調べる」と以下のようになる。

度数     3010300  1760918  1249382   969101   791817   669467   579913   511531   457571
パーセント 0.301030 0.176092 0.124938 0.096910 0.079182 0.066947 0.057991 0.051153 0.045757
理論値   0.301030 0.176091 0.124939 0.096910 0.079181 0.066947 0.057992 0.051153 0.045757

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村