Fisherの直接確率を求める際,階乗の計算が必要になる.しかし,引数が最大でも170までと使い勝手が良くない.これはプログラム言語の種類にかかわらず,データ長の制約が原因である.今回は対数を用いて階乗計算の引数の限界を超えるアイデアを共有したい.
対数の指数は元の値
N を任意の自然数とするとき,Exp(LN(N!)) = N! は自明である.今回はこの指数関数の引数である LN(N!) を求めたい.Exp() は自然対数を底とする指数関数,LN() は自然対数を底とする対数関数であるとする.
N! = N * (N – 1) * … * 1 であるから,LN(N!) = LN(N) + LN(N – 1) + … + LN(1) となる.これをコードに実装する.
ユーザー定義のスカラー値関数
SQL Server のクエリウィンドウで下記コードを実行する.得られた結果はスカラー値であるため,下図のように「プログラミング」から「関数」を右クリックして「新規作成」「スカラー値関数…」と進む.
実際のコードは下記のとおりである.
- 1行目 CREATE FUNCTION で関数名を定義する
- 3行目,関数名の次の ( ) 内で引数とそのデータ型を定義する
- 5行目 RETURNS で戻り値のデータ型を定義する
- 7行目以降 BEGIN から END までで関数の内容を定義する
- 15行目 RETURN で関数に戻り値を代入する
CREATE FUNCTION LOG_FACT ( @SrcNumber INT ) RETURNS FLOAT AS BEGIN DECLARE @DesNumber FLOAT SET @DesNumber = LOG(1) WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber + LOG(@SrcNumber) SET @SrcNumber = @SrcNumber - 1 END RETURN @DesNumber END GO
“階乗の自然対数を求めるユーザー定義のスカラー値関数をSQL Serverで定義する” への2件の返信