双子座線型群

Искусственный язык / Программирование / Шахматы / Математика

数学

JavaScriptでガンマ関数

2015-11-01 by 古城みの コメントする

ここの下の方にあるランチョス近似のコード(Python)を JavaScript にしてみた。

/*
 * Γ(x) = (x - 1)! = Gamma(x)
 */
var Gamma = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g = 7;

    function Gamma( z )
    {
        if( z < 0.5 ){
            return Math.PI/( Math.sin(Math.PI*z)*Gamma(1-z) );
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        var G = Math.sqrt(Math.PI*2) *Math.exp( (z+0.5)*Math.log(t)-t ) *x;

        if( Math.floor(z) === z ){
            return Math.round( G );
        } else {
            return G;
        }
    }

    return Gamma;
})();

少し書き換えて対数ガンマ関数を計算できるようにしたものも置いておきます。

/*
 * ln Γ(x) = GammaLN(x)
 */
var GammaLN = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g     = 7;
    var LN_PI = Math.log( Math.PI );

    function GammaLN( z )
    {
        if( z < 0.5 ){
            return LN_PI -Math.log(Math.sin( Math.PI*z )) -GammaLN(1-z);
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        return ( LN_PI+Math.LN2 )/2 +Math.log(x) +(z+0.5)*Math.log(t) -t;
    }

    return GammaLN;
})();

ついでに逆数を計算できるようにしたものも。

/*
 * 1/Γ(x) = GammaInv(x)
 */
var GammaInv = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g = 7;

    function GammaInv( z )
    {
        if( z < 0.5 ){
            return Math.sin(Math.PI*z) /( Math.PI*GammaInv(1-z) );
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        return Math.exp( t-(z+0.5)*Math.log(t) ) /Math.sqrt(Math.PI*2) /x;
    }

    return GammaInv;
})();
カテゴリー: プログラミング, モジュール タグ: JavaScript, 数値計算, 数学

計算機

2014-09-06 by 古城みの コメントする

サイトのドメイン名がmatrix exponential(行列指数関数)なのでそれに因んだものを作りたい。 [Read more…]

カテゴリー: 制作 タグ: プログラミング, 数学

プロフィール

古城みの

リンク

  • 線型結界(サイト)
  • Twitter
  • Pixiv
  • SoundCloud

最近の投稿

  • 詰めシェルトの解答
  • tiv 1
  • シェルトの指し手表記
  • シェルトの対局記録
  • 高さ実数のテトレーション

最近のコメント

  • シェルトの対局記録 に シェルトの指し手表記 – 双子座線型群 より
  • JavaScriptでparse_str(クエリ文字列のパース) に JavaScriptでhttp_build_query より

アーカイブ

  • 2018年2月
  • 2018年1月
  • 2017年2月
  • 2016年10月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年9月
  • 2015年8月
  • 2014年9月

カテゴリー

  • プログラミング
  • ボードゲーム
  • モジュール
  • 制作
  • 告知
  • 数学
  • 棋譜

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Copyright © 2022 双子座線型群.

Omega WordPress Theme by ThemeHall