プロが教えるわが家の防犯対策術!

n!の値を普通に求めて、それをスターリングの公式で求めたn!と比較するプログラミングを作る宿題がでたのですが、
n^n√2πn/e^n(1+1/12n+1/288n^2)
の公式を与えられました。
n^nやe^nをそのまま使うと数が大きくなりすぎるので、より正確な数字を求めるためにいったん自然対数におきかえるように指示されています。数学がまったくできないので、ある人に自然対数を使って書き換えるてもらったら、
logΓ(x)=(x-1/2)logx-x+(1/2)log2π+Σ[n=1,∞](-1)^nB_2n/2n(2n-1)x^(2n-1)
という式をもらったのですが、Σや∞の使い方もわからないし、Bっていうのがなになのかすらわかりません。
C++も初心者なうえ数学もまったくだめでとてもこまっています。
いったんlogに置き換えるというのはこういう意味ではないのでしょうか、
n^n√2πn/e^n(1+1/12n+1/288n^2) を途中でわけてそれをlogにおきかえ
(n^n√2πn/e^nのlogと1+1/12n+1/288n^2)のlogを別々に求め*というふうに)
最終的にまた戻すというふうに理解した方がいいのでしょうか。
それと
n^n√2πn/e^n(1+1/12n+1/288n^2)
=pow(n,n)*sqrt(2*PI*n))/exp(n)*(1+1/12*n+1/288*n*n)
この書き方であってますか。
わかりにくい点があれば補足しますので、お願いします。

A 回答 (1件)

厳しいことを言いますが、まず、式の書き方からしてなっていないですね。


>n^n√2πn/e^n(1+1/12n+1/288n^2)
これではどんな式なのかわかりませんよ。ルートはどこまでかかっているのですか?
e^の次はどこまでがeの肩にのっているのですか?
プログラムではきちんとそこをふまえて式を書かないといけないはずですよね。
スターリングの公式は近似の公式なので、どこまで近似の項を使うかによって出てくる誤差も変わってきます。
そこて、先生はこの式を使いなさいと示したわけです。多分先生の出した式は、

n! = (n)^(n)×sqrt(2πn)/[e^{n×(1+n/12+(n)^(2)/288)}]

ですね?
友人が答えてくれた式は、大本の式なので上記の自然対数をとった式ではありません。なので、その式を使うと誤差の値は課題の求める答えと異なります。
また、式は始めに自然対数をとってから計算しないとnが大きいときにはうまく行きません。
つまり、
ln(n!) = ~
の形になおします。普通はこの公式はこちらの表記が一般的です。(特にnが大きいときにこの公式を使うことが多いため)
ln(A) は e を底辺とする log を特別に log ではなくて ln と表記します。
変換にするのは難しい作業ではありません。
1) ln(A^B) = B×ln(A)
2) ln(A×B) = ln(A) + ln(B)
3) ln(A/B) = ln(A) - ln(B)
4) ln(e^A) = A×ln(e) = A
使う変換式は上の4つです。

まず式全体をln{ }の中にいれてから、2), 3), 4) でかけ算、わり算を全部足し算、引き算に展開します。
あとは1を使ってべき乗(x^yの形)をかけ算にします。ルートは x^(1/2) になります。

宿題というのは勉強してもらうために先生が出すモノですから、あえて答えは書きません。
自分の頭で考えて、計算して初めに身に付きます。
勉強するために宿題をもらっているのですから、あとはがんばって下さい。
    • good
    • 0
この回答へのお礼

わかりやすい説明ありがとうございます。
とても参考になりました。
しっかりと理解するには時間がかかりそうですが、
後は自分でできそうです。
がんばります!!

お礼日時:2001/10/25 17:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!