暗号資産オプション取引の基本

フィボナッチ数列の計算量について

フィボナッチ数列の計算量について

さて、この表では分配の計算を”複合参照”(D3=D$2*$C3を行列でコピー)の式で計算しました。

再帰アルゴリズム

再帰は、「n-1までが正しいと仮定したら、nの場合も正しいことを証明すれば、すべてのときに正しいといえる」という数学的帰納法と似た考え方です。nでの問題をn-1での結果を用いて解くアルゴリズムを考えればよいのです。
そのため、再帰アルゴリズムを用いることには、次のような利点があります。
・アルゴリズムを発見しやすくなる。
→プログラムが作りやすい。
・一般に、アルゴリズムが簡素になる。
→プログラムの誤りが少なくなる。
他人が読んでわかりやすいプログラムになる。
このような利点を実感するために、代表例として、「ソート」と「ハノイの塔」を後述します。

しかし、プログラムが簡潔であることは、必ずしも実行効率がよいことではありません。イのプログラムで f(5) をを実行するには、f(4),f(3),…,f(3) フィボナッチ数列の計算量について を実行しなければないません。関数を呼び出す回数が増加しますし、それらの結果を保存しておく必要があります。処理のための時間やメモリ容量は、むしろ増大してしまいます。その代表的な例として「フィボナッチ数列」を後述します。

配列aを小さい順にソートすることを考えます。これまでに、n-1個までは既にソートされているとき、要素a[n] について考えます。
1 2 3 n-1 n フィボナッチ数列の計算量について
┌──┬──┬──┬──┬──┐┌──┐
│10│20│40│50│60││a[i]│
└──┴──┴──┴──┴──┘└──┘

  1. a[n] の値30を一時的にwに保管しておきます。
  2. 配列の先頭から順にa[i] ≧a[n] の間iをずらしていき、a[i] <a[n] となる個所iを見つけます。(図ではi=3)
  3. 要素i~n-1を右に1つずらして、i+1~nに入れます。このとき右のほうからずらさないと、データが消えてしまいます。
  4. a[n] の値を保管していたwの値を a[i] に入れます。

ハノイの塔

かなり難解な問題が再帰を用いることにより、非常に簡単になる例として、「ハノイの塔」があります。
図のように、右の棒にn枚の円盤が積んであります。
・1回に1枚の円盤しか動かせない。
・小さい円板の上に大きい方の円盤を置いてはならない。
の規則に従って,円盤をAからBに移動せよという問題です。

プログラム 再帰を用いたプログラムは非常に簡単です。
ここでは円盤の小さい順に円盤番号nをつけています。

function hanoi(n, a, b, c) フィボナッチ数列の計算量について if (n==0) return;
hanoi(n-1, a, c, b);
document.write("円盤" + n + "フィボナッチ数列の計算量について : " + a + " → " + b + "
");
hanoi(n-1, c, b, a);
>

「hanoi(4, "左", "中", "右")」を実行した結果を示します。
ア 円板1: 左 → 右
イ 円板2: 左 → 中
ウ 円板1: 右 → 中
エ 円板3: 左 → 右
オ フィボナッチ数列の計算量について 円板1: 中 → 左
カ 円板2: 中 → 右
キ 円板1: 左 → 右
ク 円板4: 左 → 中
ケ 円板1: 右 → 中 ─┐
コ 円板2: 右 → 左 │
サ 円板1: 中 フィボナッチ数列の計算量について → 左 │
シ 円板3: 右 → フィボナッチ数列の計算量について 中 │n=3
ス 円板1: 左 → 右 ─┐ │
セ 円板2: 左 → 中 │n=2 │
ソ 円板1: 右 → 中 フィボナッチ数列の計算量について ─┘ ─┘

円盤がn個あるとき、1~n-1の円盤を一つの円盤であるとして、1~n-1の円盤をP、n番目の円盤をQとすれば、2個の円盤を移動することだと考えることができます。
2つの円盤PとQがaの棒にあるとして、それをbの棒に正しく移動するには、次の3つの操作を行えばよいことは明白です(左中右などの物理的意味を排除するために、あえてa,b,cとします)。
操作1:PをAからCへ移動
操作2:QをAからBへ移動
操作3:PをCからBへ移動

hanoi(m, a, b, c) とは、aからbへ移動することだと定義すれば、document.write(~)がそれにあたります。
そして、Pの移動とはn-1のときの移動のことですから、
操作1:hanoi(n-1, a, c, b);
操作3:hanoi(n-1, c, b, a);
となります。

フィボナッチ数列

再帰による処理効率の低下の例(再帰を使うべきではない例)として有名なのがフィボナッチ数列です。フィボナッチ数列とは、
1,1,2,3,5,8,13,21,…
の数列で、1+1=2,1+2=3,2+3=5のように、直近の2つの数を加えたものです。それで、
┌1 (n=1のとき)
F(n)=│1 (n=2のとき)
└F(n-1) + F(n-2) (n≧3のとき)
と定義できます。

再帰を用いないならば、1つ前の数をx1,2つ前の数をx2として、プログラムf1にすることができます。
function f1(n);
if (n
となります。

再帰を用いたプログラムf2は、
function f2(フィボナッチ数列の計算量について n);
if (n
となります。

計算量を forループ のなかの3つで代表させるならば、f1での計算回数は、3n回です。
それに対してf2の計算回数は、ほぼフィボナッチ数列での値と同じ程度の回数になります。
nが大きい場合、例えばn=30のときでは、f2ならば90回なのに、f1では(n=30のフィボナッチ数は)832,040回になってしまいます。

~ならしのの風に乗って~

兎の問題というのは、”1つがいの兎が1年の間に何つがいの兎になるか?”という問題です。
まず前提条件を明確にしておきます。
「1つがいの子兎が居て、子兎は1ヶ月たつと親兎になり、その1ヶ月後には1つがいの子兎を生むようになる。どのつがいの兎も死なないものとする。」
そして、ここでは、生まれたての1つがいの兎をもらったとして、1年間(12ヵ月後)に何つがいの兎になるか?」という問題とします。
1ヶ月後は

4ヶ月後は

11ヶ月後は

そして、12ヶ月後は フィボナッチ数列の計算量について

となり、233つがいということが分かります。
確かにフィボナッチ数列の通りに増えていくことが分かりました。

なお、黄金比とは、数学的に表すと

の比です。
近似値は、
1 : 1.6180339887 4989484820 4586834365 6381177203 0917980576 2862135448 ……
で、約 5 : 8 となります。
この比を「黄金比」と呼び、古代ギリシャ時代から,もっとも均整がとれ,美しい比であるとされてきました。

それでは、比をエクセルで表します。(C3=B3/B2を下にコピーします)

こちらも確かに黄金比に近づいていくようです。

Windows10のPCからWindows7のPCへのネットワークアクセスも可能に!


先日、復旧したWindows7のデスクトップPCに、Windows10のノートPCからファイル共有のアクセスが出来なかったことを書きました。 (こちら)

まず、ネットワーク資産情報とはなんだろう。
”自動ログオン用にパスワード、証明書などの資格情報を格納する”とあり、Windows7のころからの機能のようです。
でも、使っていなかった・・・!

更に調べてみると、コントロールパネルの”ユーザアカウント”の”資格情報マネージャー”に”Windows資格情報”という項目がありました。

編集ボタンを押すと、ユーザ名とパスワードを設定するエディットボックスがあります。

パソコン環境復旧! でもWindows10からファイル共有が・・・

普段使う”Office2010”や”秀丸”などのオンラインソフトをインストールしました。
それらのソフトは問題なくインストールできました。
この後、ネットワークを介して”ファイル共有”させる必要があります。
でも、”あれ!どうやって設定するんだっけ?・・・”
確かフォルダーの共有だけではなかったはずです。
その設定までは覚えていませんでした。

早速、インターネットで調べました。
情報を見ながら、”ああ、こんな設定までするんだ”と・・・、会社では考えられない甘さです。
もちろん、ID、パスワード設定で厳しくすることもできるのですが、家庭内ですからね!・・。

大まかな設定としては、次の3つです。
(1)PC内のフォルダーを右クリックして”詳細な共有”の”共有”タブで共有化する。
(2)引き続き”セキュリティ”タブでユーザ「everyone」を作成しアクセス権を設定する。
(3)コントロールパネルの”ネットワークと共有センター”から”共有の詳細設定の変更”で
・フォルダーなどの共有を有効にする
・パスワード保護の共有を無効にする
などを設定する

私のデスクトップPCのOSは、Windows7。
ノートPCは、Windows8.1といWindows10のデュアルブートです。
これらの設定で、Windows7とWindows8.1との間は、双方向で問題なく共有できるようになりました。


ところが、Windows7とWindows10との間では、 フィボナッチ数列の計算量について
Windows7からWindows10のファイルはアクセスができ、共有できたのですが、
Windows10からWindows7のデスクトップにアクセスしようとすると、ID、パスワードを求められた入ることができません。

Windows10にアップグレードしてみました

私はマイクロソフトが通知領域に”Windows10を入手する”のアイコンを表示した(Window 8.1/7のパソコンは、Windows 10への無料アップグレードを予約できます)時点で予約を行いました。

でも、よくよく調べてみると、ダウンロードに失敗しましたとのメッセージがコントロールパネルの”更新履歴の表示”の欄に書かれていました。

何てことだ!
それで、直接ダウンロードできるサイトに入り、アップデートのツールをダウンロードしました。 (こちら)

ダウンロードしたプログラムを起動すると、直接アップグレードするか、あるいはアップグレード用のイメージファイルを作成するか聞かれたので、まずアップグレードインストール用のイメージファイルをダウンロードし、DVDディスクを作成しました。

再起動してみると・・・
私のノートPCはもともとWindows7とWindows8.1とのデュアルブート設定しておいたので、
今度はWindows10とWindows8.1とのデュアルブートに変わりましたが、無事Windows10もWindows8.1もブートできることが確認出来ました。

さて、Windows10です。
起動後の画面は、Windows7に似ています。
スタートメニュも復活です。
スタートメニュ(Windowsボタン)を押すとWindows8.1ライクなメニュが表示されますが、全体的にはWindows7の雰囲気です。

また、インターネットエクスプローラ(IE)が無くなって別ブラウザ(エッジ)になったはずなので、”Microsoft Edge”を起動してみました。

まだ数時間しか使っていないので何とも言えないのですが、取りあえず使えそうな感じがしました。
Windows7に近い使用感だと思います。
Windows8.1で使い難いと思っている人はWindows10にアップしていいのかも・・・

39匹のラクダの二分の一は20匹?の検証

今回は、以前紹介した数学の啓蒙書「アリ・ババと39匹のラクダ」の検証です。 (こちら)
その中で次の問題を例示しました。
*****
アリ・ババのお父さんが39匹のラクダを飼っていました。
お父さんは、長男のアリ・ババ(A)に”2分の1”フィボナッチ数列の計算量について 、次男(B)に”4分の1”、三男(C)に”フィボナッチ数列の計算量について 8分の1”、末娘(D)に”10分の1”でラクダを分けるように遺言して亡くなりました。
ところが、39匹を生きたまま1/2に分けることが出来ません。
アリ・ババはどのように分けたらよいか困ってしまいました。・・・【1】

困った兄弟は賢者に相談しました。
そうしたら、賢者は自分のラクダ1匹を連れてきて、計40匹にして、遺言通りに分けさせました。
A…20匹
B…10匹
C… 5匹
D… 4匹
合計してみると39匹です。
それで、賢者は残った1匹を連れて帰っていきました。
明らかに20匹は39匹の半分より多いです。
アリ・ババは、この分け方が本当に遺言通りだったのか疑問に思いました。・・・【2】
*****
この問題をエクセルで検証してみます。


さて、この表では分配の計算を”複合参照”(D3=D$2*$C3を行列でコピー)の式で計算しました。

図のように、1回目の分配で38.075匹が分配されます。
ですので、2回目には残りの0.975匹を分配することになります。
それを繰り返すと・・・
表示形式を”標準”で表示すると、8回目で表示できないくらい小さな数になります。


表示形式を”小数第30位まで表示できるようにした小数”で表示してみると・・・
21回目で表示できないほどの小さな数になりました。

9を3つ使って表現される最大数

エクセルの検証シリーズの第3回です。
第1回目に、曽呂利新左衛門のエピソードを、第2回目は、エクセルで表現、表示できる数について検証しました。 フィボナッチ数列の計算量について
今回は、同じ数字(1から9まで)を3つ使って表現できる最大数を検証してみました。

”999”、”9+9+9”、”9*9*9”、”(9+9)*9”
などいろいろ考えられますが、加減乗除より”べき乗”で表現する数の方が大きくなります。
エクセルでは、”べき乗”フィボナッチ数列の計算量について の演算子を”^(ハット、キャレット)”で表します。
3^4=3*3*3*3

9^9=9*9*9*9*9*9*9*9*9
などとなります。

表示形式を”フィボナッチ数列の計算量について 標準”で表示すると

表示形式を”数値”にして9の項を表示すると

ということになります。

増え方がすごいです。
”5^(5^5)”で、もうエクセルでは扱える数ではなくなってしまいます。
当然、”9^(フィボナッチ数列の計算量について フィボナッチ数列の計算量について 9^9) は扱えない数です。

調べてみると、『宇宙の素粒子の総数は 10^80個程度と考えられている』とのことです
それから、面白いサイトがあったので紹介しておきます。
将棋の局面の数は、10の220乗ぐらいあって、それは、全宇宙の素粒子の数より多いそうです。 (こちら)

エクセルで表示できる大きな数は・・・

エクセルの検証シリーズの第2回です。 フィボナッチ数列の計算量について
前回は、曽呂利新左衛門のエピソードをエクセルで検証しました。 (こちら)
かなり大きな数になりましたが、果たしてエクセルはどのくらい大きな数が表現あるいは表示できるか検証したいと思います。

行ごとに1桁ずつ大きくなるように数値を入力し、表示形式を”標準”で表すと次のようになります。

表示形式を”数値”フィボナッチ数列の計算量について に設定して表示してみます。

そうすると、エクセルで扱える”数値”の有効桁数は 15桁だということが分かります。
具体的には、”1234567890123456”の様に15桁を超える場合は、
”1234567890123460…0”と表示されてしまいます。

有効桁数16桁まで表示できるように指数形式で設定すると次のようになる訳です。

この数を更に大きくしていくと、セル内に表示できる数は、254桁だということが分かります。

255桁以上の数は
############…##############
と”#”が255個表示されます。

更に大きくしていくと、扱える最大数は309桁分ということでしょうか、
それを超えると、セルは
”#NUM”
と表示され、演算不能となってしまいます。


こんどは逆に、小数点以下の数値としては、表示形式を”標準”で入力するとB列のようになりますが、
”数値”で表示すると、やはり有効桁数は15桁であることが分かります。

なお、エクセルでは、”数値”での小数点以下の桁数は30桁まで設定できるようです。
フィボナッチ数列の計算量について
それで、表示形式を”数値”で30桁と表示すると
”0.1234567890123456”のように小数第15位を超える部分は
”0.1234567890123460…0”と表示されます。

曽呂利新左衛門に与える米の量がハンパでない!

ちょっと前に、林修先生のことば検定だったか?豊臣秀吉に御伽衆として仕えた曽呂利新左衛門(そろり しんざえもん)のエピソードが紹介されていたのを耳にしました。
と言うか、名前しか聞き分けられなかったのでどういう話を紹介していたかは聞き漏らしましたが、米粒を1日ごとに倍の量をもらうという話ではなかったかと思います。

それで、一応、
豊臣秀吉が曽呂利新左衛門の功績に報いるため、何でも欲しいものをあげようと言った時、新左衛門は「1日目は米1粒、2日目は2粒、3日目は4粒、次の日は8粒・・と前の日の2倍の米粒を次の日にというようにして51日間だけください。」と言った
という話として、その米の量を検証してみたいと思います。
(ただ、この話、1ヶ月の31日とか、81日とか、また、百畳の畳の上にということで100日間といったいろいろな説があります)
もちろん、秀吉は「たったそれだけでよいのか、さっそく家来に毎日運ばせよう」と言ったということです。

一応、米粒1粒の重さをネットで調べてみると、
農林水産省の北陸農政局のページ (こちら) に、
10kgのお米に約50万粒
と書かれていますので、これを採用します。

農林水産省の平成22年の米の生産量の資料 (こちら) によれば
日本の米の総生産量は、8,483,000トン
とのことですので、新左衛門は51日になる前に日本で収穫できる量以上の米を手に出来たことになります。
さすがに、秀吉も途中でとてつもない量であることが分かり、別のものにしてもらったということです。

ワードで写真を図形でトリミングする方法

ワードで写真(イメージ)を図形でトリミングして表示するには、簡単な方法としては次の二つがあります。
【Ⅰ】図形の塗りつぶしを使って写真をトリミングする方法
【Ⅱ】写真(イメージ)そのものを図形に合わせてトリミングする方法

【Ⅰ】の図形の塗りつぶしを使って写真をトリミングする方法 については、
以前に、”ワードで写真をいろいろな図形に切り取って貼る方法について”で紹介しました。 (こちら)
具体的には、
(1) 切り取りたい図形を入力(選択)して、
(2) ”描画ツール”タブの”図形の塗りつぶし”の”図(塗りつぶし図)”で貼りたい写真ファイルを指定する
という方法でした。

今回は、 フィボナッチ数列の計算量について
【Ⅱ】の写真(イメージ)そのものを図形に合わせてトリミングする方法 について紹介します。
具体的な方法は次の通りです。
(1) ”挿入”フィボナッチ数列の計算量について タブの”図”で写真を貼りつける

ここで、 必要に応じて写真をトリミング します(縦横の長さを調整します)

(写真のカットは【Ⅰ】でも縦と横の比率を変えないために必要になります)

(2) 写真を選択して”トリミング”メニュの”図形に合わせてトリミング”するをクリックする


表示されている写真の縦横のサイズに従って、図形のサイズも決まります。
(そのため、(1)の後半で写真をトリミングした訳です)
これだけで写真がトリミングできてしまいます。


【Ⅰ】で枠線をなしにすると、【Ⅰ】も【Ⅱ】も区別がつかなくなります。

でも、出来上がった写真をクリックしてみると、リボンのところに表示される編集用のタブでどちらで作成したかが分かります。
【Ⅰ】では”描画ツール”と”図ツール”の二つのタブが表示されるようになります。

【Ⅱ】では”図ツール”のみです。

通常の使い方では、使い勝手はどちらも同じようなものだと思いますが、
【Ⅰ】の方法は、図形を組み合わせグループ化することで色々な形状でトリミングできる
のが便利と言えるかもしれません。

ヒマワリ・稲妻…自然界を司る神秘的な「数式」 美・自然のなかの数学(2)

性質1:直前の2数を足した数になっている

性質2:隣り合う数の比が限りなく黄金比に近づく

ひまわりの種(小花)が隙間なく密集しているのも、フィボナッチ数列に沿った種の配列がなされているため。生物は生き残るために数学を用いている

1、1、2、3、5、……とフィボナッチ数列の各数を一辺とする正方形の頂点に沿って曲線を引くと「対数らせん」の一種が描かれる

銀河系の巨大な渦巻きは、フィボナッチ数列を基にした対数らせんの形状によく似ている

花びらの枚数や動物の出生にも!自然界に潜むフィボナッチ数列の正体

横山 明日希 プロフィール

photo by iStock

photo by iStock

編集部からのお知らせ!

科学と遊ぶすごいサービスOPEN!

STOP!海賊版 オリジナル漫画16作品描きおろし!!!

アクセスランキング

1

2

3

4

5

竹山 美宏

横山 明日希

西来路 フィボナッチ数列の計算量について 文朗

清水 健一

根上 生也

ブルーバックス編集部

志村 史夫

ツムジのひとりごと

詳しくはこの文献を読んでいただくとして、要約すると、「順序対 (a, b) と (c, d) に対して乗法を (a, b)(c, d) = (ac + ad + bc, ac + bd) と定義すると、この乗法は結合律を満し、指数法則が成り立つ。そして f ≡ (1, 0) とすると \((F_, F_)\) = f n で表わすことができる ということのようです。これは SICP に載っている fib4 フィボナッチ数列の計算量について のと同じ方法のように見えます。

これを自作の "power 関数" を使って定義すると、次のようになりました。

"power 関数" を使っているので、計算量はやはり Θ(log n) になります。

《 一般項の式を使ったもの 》

"power 関数" を使っているので、計算量は Θ(log n) のはずですが、有理数の計算をしてる分、"fib4" や "fib5" よりは少し遅くなるようです。

関数n時間 (sec)
fib13520.30
fib21,000,000336.フィボナッチ数列の計算量について 62
fib3100,000,00014.41
fib4100,000,00011.31
fib5100,000,00010.89
fib6100,フィボナッチ数列の計算量について 000,00012.31

今回はメモ化などの手法は考えなかったので、結果は「計算量の少なさ=計算速度」ということになっています。 fib3, fib4, fib5, fib6 はいずれも計算量が Θ(log n) なので、かなり速くフィボナッチ数を求めるこができます。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる