« キバナコスモス | トップページ | チンアナゴの日 »

2014年11月12日 (水)

階乗の話

★πの話はもう終わりましたが。
プログラム中で「階乗」というのを使いました。
高校数学で順列とか組み合わせを学んだと思いますが、いかがでしょう?
おそらく、その時に階乗に出会ったのではないでしょうか。
自然数nの階乗を「n!」と表し
n!=n・(n-1)・(n-2)・・・3・2・1 ………①
です。
これが普通の定義。
階乗は英語でfactorialといいます。
1+2+・・・+n を1からnまでの「総和」というように
階乗は1*2*・・・*n ですから、1からnまでの「総乗」ともいいます。
和は「Σ(シグマ)」で書きますよね
Sigma
こういうの見たことありますよね。
summationの頭文字「s」に対応するギリシャ文字の大文字が「Σ」なんですね。
{ついでにいうと、積分記号「∫」も「s」で、sを縦に引き伸ばしたものだったはず。}
「総乗」はproductの頭文字「p」に対応するギリシャ文字の大文字「Π」を使って書き表すこともあります。
{円周率のπは小文字です。}
Pi
こんな具合です。

★階乗を具体的な数値で見てみますと
5!=5・4・3・2・1=120
こうなります。

気を付けなければならないのは、数学における論理的な整合性でして。
0!をどうしましょう?
n!=n*(n-1)!   ですから ……⓪
(n-1)!=(n!)/n となります。

ここでn=1を入れると
0!=1/1=1
ですね。ですから
0!=1
と約束します。{式の意味とかに過剰に拘泥しないでください。論理的な整合性を求めた結果です}

★階乗の定義として面白いものがあります。
上の⓪式を改めて②式として「観賞」してみましょう。

n!=n*(n-1)!………②
但し、0!=1

これだけで階乗の定義になるのです。
左辺に定義されるべき階乗があって、それを右辺で階乗を使って定義しています。
なんだか堂々巡りというか、同義反復みたいな気がしませんか?
でも大丈夫。具体的にn=5で見てみましょう。

5! = 5 * (5 - 1)! = 5 * 4!
4! = 4 * (4 - 1)! = 4 * 3!
3! = 3 * (3 - 1)! = 3 * 2!
2! = 2 * (2 - 1)! = 2 * 1!
1! = 1 * (1 - 1)! = 1 * 0!
0! = 1

5! = 5 * 4! =5 * 4 * 3! = 5 * 4 * 3 * 2!
   = 5 * 4 * 3 * 2 * 1! = 5 * 4 * 3 * 2 * 1 * 0!
   = 5 * 4 * 3 * 2 * 1! = 5 * 4 * 3 * 2 * 1 * 1
   = 120
メデタシめでたし。

あることを定義する時に、自分自身を使って定義する。
こういうやり方を「再帰的」な定義といいます。英語では「recursive」であるといいます。

プログラミングの世界では、よくこの再帰を使います。
再帰によって論理がすっきりして見通しがよくなることがあるのです。
ただ、実行面からいうと、必ずしも効率的とはいえない面も多いので、要注意ですが。
迷路を解くプログラムとか、8クイーンのようなパズルとか、いろんなフラクタルな図形を描くときとか・・・再帰は強力な考え方です。
{下で階乗の再帰的なプログラムをお目にかけますが、少なくとも階乗のプログラムに関する限り、書けるけどやらない、というプログラムです。プログラマーはこんなことしません。効率が悪くていけない。}

★さて、話を階乗に戻しまして。
階乗の定義が①と②と2つ出ましたので、これをプログラムにしてみましょう。

エクセルのVBAで書いてみました。
fact1が①の定義に、 fact2が②の定義にそれぞれ対応しています。
--------------------
Option Explicit

Sub main()
Dim i As Long

For i = 0 To 100
    Cells(i + 1, 1).Value = i
    Cells(i + 1, 2).Value = fact1(i)
    Cells(i + 1, 3).Value = fact2(i)
Next i

End Sub
--------------------
'ループ
Function fact1(n As Long) As Double
    Dim p As Double, i As Long

    p = 1
    For i = 1 To n
        p = i * p
    Next i
    fact1 = p
End Function
--------------------
'再帰呼び出し
Function fact2(n As Long) As Double
    If n = 0 Then
        fact2 = 1
    Else
        fact2 = n * fact2(n - 1)
    End If
End Function
--------------------
ちょっと長くなりますが、n=100までの結果を載せます。{当然どちらでも同じ結果になります。}

なんでこんな冗長なことをやったかと言いますと。
普通の関数電卓を使っておられる方は、100! を見たことがないのではないかと思いまして。
私が使っている関数電卓では69!=1.711224523×10^98 が限界でして、これに70をかけると「-E-」と表示されてオシマイ。
指数部を取っちゃって、1.711224523×70 = 119.7857166 ですので、指数が2アップして100乗になり、オーバーフロー(桁あふれ)なんですね。

珍しいものを見た、と感動してください。
感動を与えたい!などとと下らんことを考えたものですから。
{ついでに勇気を与えちゃったりして。階乗で勇気づけられる人はいないよなぁ。}

階乗の話題は実はまだ終わっておりませんので、また。
--------------------
0   1           1
1   1           1
2   2           2
3   6           6
4   24          24
5   120         120
6   720         720
7   5040        5040
8   40320       40320
9   362880      362880
10  3628800     3628800
11  39916800    39916800
12  479001600   479001600
13  6227020800  6227020800
14  87178291200 87178291200
15  1.30767E+12 1.30767E+12
16  2.09228E+13 2.09228E+13
17  3.55687E+14 3.55687E+14
18  6.40237E+15 6.40237E+15
19  1.21645E+17 1.21645E+17
20  2.4329E+18  2.4329E+18
21  5.10909E+19 5.10909E+19
22  1.124E+21   1.124E+21
23  2.5852E+22  2.5852E+22
24  6.20448E+23 6.20448E+23
25  1.55112E+25 1.55112E+25
26  4.03291E+26 4.03291E+26
27  1.08889E+28 1.08889E+28
28  3.04888E+29 3.04888E+29
29  8.84176E+30 8.84176E+30
30  2.65253E+32 2.65253E+32
31  8.22284E+33 8.22284E+33
32  2.63131E+35 2.63131E+35
33  8.68332E+36 8.68332E+36
34  2.95233E+38 2.95233E+38
35  1.03331E+40 1.03331E+40
36  3.71993E+41 3.71993E+41
37  1.37638E+43 1.37638E+43
38  5.23023E+44 5.23023E+44
39  2.03979E+46 2.03979E+46
40  8.15915E+47 8.15915E+47
41  3.34525E+49 3.34525E+49
42  1.40501E+51 1.40501E+51
43  6.04153E+52 6.04153E+52
44  2.65827E+54 2.65827E+54
45  1.19622E+56 1.19622E+56
46  5.50262E+57 5.50262E+57
47  2.58623E+59 2.58623E+59
48  1.24139E+61 1.24139E+61
49  6.08282E+62 6.08282E+62
50  3.04141E+64 3.04141E+64
51  1.55112E+66 1.55112E+66
52  8.06582E+67 8.06582E+67
53  4.27488E+69 4.27488E+69
54  2.30844E+71 2.30844E+71
55  1.26964E+73 1.26964E+73
56  7.10999E+74 7.10999E+74
57  4.05269E+76 4.05269E+76
58  2.35056E+78 2.35056E+78
59  1.38683E+80 1.38683E+80
60  8.32099E+81 8.32099E+81
61  5.0758E+83  5.0758E+83
62  3.147E+85   3.147E+85
63  1.98261E+87 1.98261E+87
64  1.26887E+89 1.26887E+89
65  8.24765E+90 8.24765E+90
66  5.44345E+92 5.44345E+92
67  3.64711E+94 3.64711E+94
68  2.48004E+96 2.48004E+96
69  1.71122E+98 1.71122E+98
70  1.1979E+100 1.1979E+100
71  8.5048E+101 8.5048E+101
72  6.1234E+103 6.1234E+103
73  4.4701E+105 4.4701E+105
74  3.3079E+107 3.3079E+107
75  2.4809E+109 2.4809E+109
76  1.8855E+111 1.8855E+111
77  1.4518E+113 1.4518E+113
78  1.1324E+115 1.1324E+115
79  8.9462E+116 8.9462E+116
80  7.1569E+118 7.1569E+118
81  5.7971E+120 5.7971E+120
82  4.7536E+122 4.7536E+122
83  3.9455E+124 3.9455E+124
84  3.3142E+126 3.3142E+126
85  2.8171E+128 2.8171E+128
86  2.4227E+130 2.4227E+130
87  2.1078E+132 2.1078E+132
88  1.8548E+134 1.8548E+134
89  1.6508E+136 1.6508E+136
90  1.4857E+138 1.4857E+138
91  1.352E+140  1.352E+140
92  1.2438E+142 1.2438E+142
93  1.1568E+144 1.1568E+144
94  1.0874E+146 1.0874E+146
95  1.033E+148  1.033E+148
96  9.9168E+149 9.9168E+149
97  9.6193E+151 9.6193E+151
98  9.4269E+153 9.4269E+153
99  9.3326E+155 9.3326E+155
100 9.3326E+157 9.3326E+157
--------------------

★πの話はこちら↓
http://yamada-kuebiko.cocolog-nifty.com/blog/2014/10/post-01b2.html
2014年10月28日 (火)「建部賢弘のπの計算公式」
http://yamada-kuebiko.cocolog-nifty.com/blog/2014/10/http.html
2014年10月29日 (水)「ラマヌジャンのπの式」
http://yamada-kuebiko.cocolog-nifty.com/blog/2014/10/post-20f8.html
2014年10月30日 (木)「VBAによる建部のπの式の計算」
http://yamada-kuebiko.cocolog-nifty.com/blog/2014/10/post-5d66.html
2014年10月31日 (金)「VBAによるラマヌジャンのπの式の計算」
http://yamada-kuebiko.cocolog-nifty.com/blog/2014/11/post-5ab3.html
2014年11月 4日 (火)「1000桁モードで」

« キバナコスモス | トップページ | チンアナゴの日 »

理科おじさん」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« キバナコスモス | トップページ | チンアナゴの日 »

2021年5月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
サイト内検索
ココログ最強検索 by 暴想
無料ブログはココログ