「夫を成功」へ導く妻の秘訣 座談会

少数の階乗の計算方法を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

No.7です。


>HOGERA3 さんのご回答は階乗でなくてベキ乗についての話ですね.

おっしゃるとおりにございます。

間違ったことを載せてしまって申し訳ございません。
見なかったことにしてください。
    • good
    • 1

普通に考えるなら,catamaran さんと FM-8 さんのご指摘のようにガンマ関数でしょう.



任意の複素数 z に対して
(1)  Γ(z)=∫{0~∞} x^(z-1) e^(-x) dx   Re(z)>0
を解析接続して得られる関数がガンマ関数です.
FM-8 さんは積分範囲を -∞~∞ とされていますが,
上の 0~∞ が正しい範囲です.
上の積分は z の実数部 Re(z) が正の時しか収束しませんので,
そうでない z に対してはときは適当な手段で拡張する必要があり
それが解析接続です.

(2)  Γ(1) = 1
(3)  Γ(z+1) = zΓ(z)
を簡単に示すことができますので,自然数 n に対しては
(4)  Γ(n+1) = n!
ということになります.
階乗とは n が1つだけずれています(FM-8 さんの「モドキ」).
多少古いドイツ流の本では
(5)  Π(z) = Γ(z+1)
というパイ関数を見ることもあります.
これを使うなら
(6)  Π(n) = n!
ということになります.

z がゼロまたは負の整数のときにはΓ(z)は極になっています
(つまり,値は+∞あるいは-∞).

スターリングの公式
(7)  Γ(z) ~ √(2π) e^(-z) z^[z-(1/2)]
は |z| が大きいときの近似式(漸近式)です(z≠負の実数).

具体的に小数の階乗あるいはΓ関数を計算するなら
catamaran さん方式がよろしいでしょう.

HOGERA3 さんのご回答は階乗でなくてベキ乗についての話ですね.
    • good
    • 0

「少数の階乗」って「3の1.5乗」とかのことですか?


(「少数」じゃなくて「小数」?)

だとしたら、
3^1.5 = 3^(3/2) = (3の2乗根)の3乗
というように小数を分数に直して計算します。

a^(1/n) = aのn乗根

です。
    • good
    • 1

#5様ご指摘の通りです.



「階乗」自体は0以上の整数に対して定義されていて,
0!=1です.
小数に対しては,Γ関数ですかね.やはり.

階乗を実数に拡張したようなものが「ガンマ(Γ)関数です.」

Γ(λ)=∫(x^(λ-1)) * e^(-x)dx[-∞~∞]

なぜこれが「階乗」かというと,
n!=n*(n-1)!  ですよね?

Γ関数の場合,
定義より,
Γ(λ)=(λ-1)Γ(λ-1)
となるからです.(モドキです.)

スターリングの公式は,非常に大きな自然数の階乗を
求めるときの近似式です.
小数にも適用出来るんですかねぇ?使えるとしたら,「卓見」です.
もしも,もう少し,お時間いただければ,「スターリングの公式」の証明をアップ出来ますが.(面白かったんですよ.当時はこの証明が.統計力学の授業だったと思いますが.)


高校の数学思い出しました.
ご質問の背景教えてもらえませんか?
そっちの方が楽しそうなので.

参考URL:http://www12.plala.or.jp/ksp/formula/mathFormula …
    • good
    • 0

こんにちは.


階乗の一般化された形は,ガンマ関数です.
ガンマ関数では,階乗は正の実数(小数を含む)まで定義されるみたいです.
なお,ガンマ関数はExcelの関数機能にて計算することができるので,実用上必要ならばこちらを使われてはいかがでしょうか.
ガンマ関数については,以下を参照ください(英語ですが・・・).
http://mathworld.wolfram.com/GammaFunction.html

参考URL:http://aoki2.si.gunma-u.ac.jp/lecture/Bunpu/gamm …
    • good
    • 0

#1です。


スターリングの近似式は、0以上で大きな実数の階乗の近似計算には有効ですが、0以上の小さな実数の階乗計算には数学的な意味を持ちません。
    • good
    • 0

階乗の概念は自然数(例外として0もあり)にしか定義されていません。


小数や負の数は計算できないという事です。

どうしても計算しなくてはいけないのであれば、
スターリングの公式で近似値を求められるので、
n! ~ √(2nπ) × n^n × e^(-n)
に代入するという事で求められるかもしれません。
但し、近似値ですのであしからず。
    • good
    • 0

nの階乗の近似式を使ってはいかがでしょうか。


n! の桁数は スターリングの近似式
n! = nne-n (2nπ)1/2より、
n log10(n/e) + (log10(2nπ)/2+1
で求められます。

参考URL:http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/f …
    • good
    • 0

階乗とは、0以上の整数で定義されている筈です。

質問の意味は、小数点以下を含む0以上の実数の階乗との意味でしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETで階乗を求めるプログラムを作成する

再帰を使わず、For文による繰り返しにより、階乗を求めるプログラムを作成したいのです。

↓ここからどうすれば良いか、ご教授お願い致します。

Dim n , i As Integer
n = Textbox1.Text
For i = 1 To n
n = n * ( n - 1 )
Next
Textbox2.Text = n

Aベストアンサー

Dim n as integer, i As integer
Dim mul as long = 1
n = Textbox1.Text
For i = 1 To n
mul = mul * i
Next
Textbox2.Text = mul

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

Qe^-2xの積分

e^-2xの積分はどうしたらよいのでしょうか…。e^xやe^2xsinxなどはのってるのですがこれが見つかりません。お願いします。

Aベストアンサー

いささか、思い違いのようです。

e^-2x は、 t=-2x と置いて置換してもよいけれど、牛刀の感がします。

e^-2x を微分すると、(-2)*( e^-2x )となるので、

e^-2x の積分は、(-1/2)*( e^-2x )と判明します。

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Qjava 電卓のプログラム

或る程度まで進みましたが、
ソースコードが分からず困っています;;

こんな問題なのですが・・・

課題1
以下の要件を満たす電卓のプログラム
Calculatorクラスを作成し、ソースコードを
示せ。

1.最初に標準入力から文字を1文字入力し
計算の種類や動作を決定する。
必要な入力文字と動作の種類の対応を下記に示す。
入力文字  動作
  +    数値a,bを受け取りa+bの結果を表示する
  -    数値a,bを受け取りa-bの結果を表示する
  *    数値a,bを受け取りa*bの結果を表示する
  /   数値a,bを受け取りa/bの結果を表示する
      ただし、b=0の時は「Infinity」と表示する
  !    数値aを受け取りaの階乗を計算し表示する
  q   終了する
2. 計算の種類が決定した後、標準入力から計算に必要な数字を入力する
3.計算が終了した後、再度、標準入力からの動作の
種類を受け付ける。

こんな感じです。

で、一応ここまで進んでいます。
import java.io.*;
public class Calculator {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
int i = 0;
int answer = 1;
System.out.println("+、-、*、/、!、qから選んで入力してください");
String s = buf.readLine();
System.out.println("数字を二つ入力してください");
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine());
if (s.equals("+")) {
System.out.println(a + b);
}
if (s.equals("-")) {
System.out.println(a - b);
}
if (s.equals("*")) {
System.out.println(a * b);
}
if (s.equals("/")) {
System.out.println(a / b);
}
if (s.equals("!")) {
System.out.println("階乗の計算をします。数字を一つ入力してください");
while (i < a) {
i++;
answer = i * answer;
System.out.println("a!=" + answer);
}
}
if (s.equals("q")) {
//終了する処理
}
}
}

とりあえず、自分でなんとか・・・。
後、残ったのは割り算で
bに0が入力された時にInfinityと表示するのと、
階乗と終了する処理・・・・。
そして、終了の命令があるまで計算を続ける
ソースを書く・・・。

ここからどのようにすればいいのでしょうか・・・
教えてください。お願いします!

或る程度まで進みましたが、
ソースコードが分からず困っています;;

こんな問題なのですが・・・

課題1
以下の要件を満たす電卓のプログラム
Calculatorクラスを作成し、ソースコードを
示せ。

1.最初に標準入力から文字を1文字入力し
計算の種類や動作を決定する。
必要な入力文字と動作の種類の対応を下記に示す。
入力文字  動作
  +    数値a,bを受け取りa+bの結果を表示する
  -    数値a,bを受け取りa-bの結果を表示する
  *    数値a,bを受け取りa*bの結果を表示...続きを読む

Aベストアンサー

まず標準入力から1文字取得します。

System.out.println("+、-、*、/、!、qから選んで入力してください");
String s = buf.readLine();
String answer = "";

次に入力された種類によって必要な数だけ標準入力から数字を取得します。
if( s.equals("+") ) {
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine());
answer = Integer.toString(a + b);
}
if( s.equals("-") ) {
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine());
answer = Integer.toString(a - b);
}
// 省略
if( s.equals("/") ) {
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine());
if( b == 0 ) {
answer = "Infinity";
} else {
answer = Integer.toString(a / b);
}
}
if( s.equals("!") ) {
int a = Integer.parseInt(buf.readLine());
int value = 0;
for( int i = 0; i < a; i++ ) {
value *= (i + 1);
}
answer = Integer.toString(value)
}
System.out.println(answer);

answerをStringにすることで"Infinity"も出力することができます。
ただし全ての条件でInteger.toStringを行わないといけませんが。


qを入力されたときに終了する
例えば以下のメソッドでは return int; を必ず書きます。
public int sum(int a, int b) {
return a + b;
}
ここで戻り値がvoidのメソッドのときに途中で終了したい場合は
public void ave(int a, int b) throws Exception {
if( b == 0 ) {
return; //戻り値なし
}
System.out.println(a / b);
}

return;で処理を終了します。

つまり
if( s.equals("q") ) {
System.out.println("処理を終了します。");
return;
}
となります。

最後に終了の命令があるまで計算を続けるには"q"が入力されるまで無限ループさせればいいので
while( true ) {
System.out.println("+、-、*、/、!、qから選んで入力してください");
// 省略
System.out.println(answer);
}

まず標準入力から1文字取得します。

System.out.println("+、-、*、/、!、qから選んで入力してください");
String s = buf.readLine();
String answer = "";

次に入力された種類によって必要な数だけ標準入力から数字を取得します。
if( s.equals("+") ) {
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine());
answer = Integer.toString(a + b);
}
if( s.equals("-") ) {
int a = Integer.parseInt(buf.readLine());
int b = Integer.parseInt(buf.readLine(...続きを読む


人気Q&Aランキング