情報学部 菅沼ホーム 目次 索引

ガンマ関数

    1. A. C++
    2. B. Java
    3. C. JavaScript
    4. D. PHP
    5. E. Ruby
    6. F. Python
    7. G. C#
    8. H. VB

  プログラムは,ガンマ関数の値を計算するためのものです.

  1. C++

      C++11 においては,C++ 標準ライブラリ内の tgamma を使用することができます.
    /****************************/
    /* ガンマ関数の計算         */
    /*      coded by Y.Suganuma */
    /****************************/
    #include <stdio.h>
    #include <math.h>
    
    double gamma(double, int *);
    
    int main()
    {
    	double x, y;
    	int ind;
    
    	printf("data? ");
    	scanf("%lf", &x);
    
    	y = gamma(x, &ind);
    
    	printf("   x %f gamma(x) %f ind %d\n", x, y, ind);
    
    	return 0;
    }
    
    /****************************************/
    /* Γ(x)の計算(ガンマ関数,近似式) */
    /*      ier : =0 : normal               */
    /*            =-1 : x=-n (n=0,1,2,・・・)  */
    /*      return : 結果                   */
    /****************************************/
    #include <math.h>
    
    double gamma(double x, int *ier)
    {
    	double err, g, s, t, v, w, y;
    	long k;
    
    	*ier = 0;
    
    	if (x > 5.0) {
    		v = 1.0 / x;
    		s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v +
                0.00078403922172) * v - 0.000229472093621) * v -
                0.00268132716049) * v + 0.00347222222222) * v +
                0.0833333333333) * v + 1.0;
    		g = 2.506628274631001 * exp(-x) * pow(x,x-0.5) * s;
    	}
    
    	else {
    
    		err = 1.0e-20;
    		w   = x;
    		t   = 1.0;
    
    		if (x < 1.5) {
    
    			if (x < err) {
    				k = (long)x;
    				y = (double)k - x;
    				if (fabs(y) < err || fabs(1.0-y) < err)
    					*ier = -1;
    			}
    
    			if (*ier == 0) {
    				while (w < 1.5) {
    					t /= w;
    					w += 1.0;
    				}
    			}
    		}
    
    		else {
    			if (w > 2.5) {
    				while (w > 2.5) {
    					w -= 1.0;
    					t *= w;
    				}
    			}
    		}
    
    		w -= 2.0;
    		g  = (((((((0.0021385778 * w - 0.0034961289) * w + 
                 0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w +
                 0.0815652323) * w + 0.411849671) * w + 0.422784604) * w +
                 0.999999926;
    		g *= t;
    	}
    
    	return g;
    }
    			

  2. Java

    /****************************/
    /* ガンマ関数の計算         */
    /*      coded by Y.Suganuma */
    /****************************/
    import java.io.*;
    
    public class Test {
    	public static void main(String args[]) throws IOException
    	{
    		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    		double x, y;
    		int ind[] = new int [1];
    
    		System.out.print("data? ");
    		x = Double.parseDouble(in.readLine());
    
    		y = gamma(x, ind);
    
    		System.out.println("   x " + x + " gamma(x) " + y + " ind " + ind[0]);
    	}
    
    	/****************************************/
    	/* Γ(x)の計算(ガンマ関数,近似式) */
    	/*      ier : =0 : normal               */
    	/*            =-1 : x=-n (n=0,1,2,・・・)  */
    	/*      return : 結果                   */
    	/****************************************/
    	static double gamma(double x, int ier[])
    	{
    		double err, g, s, t, v, w, y;
    		int k;
    
    		ier[0] = 0;
    
    		if (x > 5.0) {
    			v = 1.0 / x;
    			s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v +
                    0.00078403922172) * v - 0.000229472093621) * v -
                    0.00268132716049) * v + 0.00347222222222) * v +
                    0.0833333333333) * v + 1.0;
    			g = 2.506628274631001 * Math.exp(-x) * Math.pow(x,x-0.5) * s;
    		}
    
    		else {
    
    			err = 1.0e-20;
    			w   = x;
    			t   = 1.0;
    
    			if (x < 1.5) {
    
    				if (x < err) {
    					k = (int)x;
    					y = (double)k - x;
    					if (Math.abs(y) < err || Math.abs(1.0-y) < err)
    						ier[0] = -1;
    				}
    
    				if (ier[0] == 0) {
    					while (w < 1.5) {
    						t /= w;
    						w += 1.0;
    					}
    				}
    			}
    
    			else {
    				if (w > 2.5) {
    					while (w > 2.5) {
    						w -= 1.0;
    						t *= w;
    					}
    				}
    			}
    
    			w -= 2.0;
    			g  = (((((((0.0021385778 * w - 0.0034961289) * w + 
                     0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w +
                     0.0815652323) * w + 0.411849671) * w + 0.422784604) * w +
                     0.999999926;
    			g *= t;
    		}
    
    		return g;
    	}
    }
    			

  3. JavaScript

      ここをクリックすると,任意のデータに対するガンマ関数の値を画面上で求めることができます
    <!DOCTYPE HTML>
    
    <HTML>
    
    <HEAD>
    
    	<TITLE>ガンマ関数</TITLE>
    	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    	<SCRIPT TYPE="text/javascript">
    		function main()
    		{
    					// データの設定と出力
    			let x = parseFloat(document.getElementById("data").value);
    			let ind  = new Array();
    			let y = gamma(x, ind);
    			if (ind[0] < 0)
    				document.getElementById("ans").value = "値を求めることができません!";
    			else {
    				let str = "gamma(" + x + ") = " + y;
    				document.getElementById("ans").value = str;
    			}
    		}
    
    		/****************************************/
    		/* Γ(x)の計算(ガンマ関数,近似式) */
    		/*      ier : =0 : normal               */
    		/*            =-1 : x=-n (n=0,1,2,・・・)  */
    		/*      return : 結果                   */
    		/****************************************/
    		function gamma(x, ier)
    		{
    			let err;
    			let g;
    			let s;
    			let t;
    			let v;
    			let w;
    			let y;
    			let k;
    
    			ier[0] = 0;
    
    			if (x > 5.0) {
    				v = 1.0 / x;
    				s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v +
                	    0.00078403922172) * v - 0.000229472093621) * v -
                    	0.00268132716049) * v + 0.00347222222222) * v +
                    	0.0833333333333) * v + 1.0;
    				g = 2.506628274631001 * Math.exp(-x) * Math.pow(x,x-0.5) * s;
    			}
    
    			else {
    
    				err = 1.0e-20;
    				w   = x;
    				t   = 1.0;
    
    				if (x < 1.5) {
    
    					if (x < err) {
    						k = Math.floor(x);
    						y = k - x;
    						if (Math.abs(y) < err || Math.abs(1.0-y) < err)
    							ier[0] = -1;
    					}
    
    					if (ier[0] == 0) {
    						while (w < 1.5) {
    							t /= w;
    							w += 1.0;
    						}
    					}
    				}
    
    				else {
    					if (w > 2.5) {
    						while (w > 2.5) {
    							w -= 1.0;
    							t *= w;
    						}
    					}
    				}
    
    				w -= 2.0;
    				g  = (((((((0.0021385778 * w - 0.0034961289) * w + 
            	         0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w +
                	     0.0815652323) * w + 0.411849671) * w + 0.422784604) * w +
                    	 0.999999926;
    				g *= t;
    			}
    
    			return g;
    		}
    	</SCRIPT>
    
    </HEAD>
    
    <BODY STYLE="font-size: 130%; text-align:center; background-color: #eeffee;">
    
    	<H2 STYLE="text-align:center"><B>ガンマ関数</B></H2>
    
    	データ:<INPUT ID="data" STYLE="font-size: 100%" TYPE="text" SIZE="5" VALUE=""> 
    	<BUTTON STYLE="font-size: 100%; background-color: pink" onClick="main()">OK</BUTTON><BR><BR>
    	 結果:<INPUT ID="ans" STYLE="font-size: 100%;" TYPE="text" SIZE="30" VALUE=""> 
    </BODY>
    
    </HTML>
    			

  4. PHP

    <?php
    
    /****************************/
    /* ガンマ関数の計算         */
    /*      coded by Y.Suganuma */
    /****************************/
    
    	printf("data? ");
    	fscanf(STDIN, "%lf", $x);
    
    	$y = gamma($x, $ind);
    
    	printf("   x %f gamma(x) %f ind %d\n", $x, $y, $ind);
    
    /****************************************/
    /* Γ(x)の計算(ガンマ関数,近似式) */
    /*      ier : =0 : normal               */
    /*            =-1 : x=-n (n=0,1,2,・・・)  */
    /*      return : 結果                   */
    /****************************************/
    function gamma($x, &$ier)
    {
    	$ier = 0;
    
    	if ($x > 5.0) {
    		$v = 1.0 / $x;
    		$s = ((((((-0.000592166437354 * $v + 0.0000697281375837) * $v +
                0.00078403922172) * $v - 0.000229472093621) * $v -
                0.00268132716049) * $v + 0.00347222222222) * $v +
                0.0833333333333) * $v + 1.0;
    		$g = 2.506628274631001 * exp(-$x) * pow($x,$x-0.5) * $s;
    	}
    
    	else {
    
    		$err = 1.0e-20;
    		$w   = $x;
    		$t   = 1.0;
    
    		if ($x < 1.5) {
    
    			if ($x < $err) {
    				$k = intval($x);
    				$y = floatval($k) - $x;
    				if (abs($y) < $err || abs(1.0-$y) < $err)
    					$ier = -1;
    			}
    
    			if ($ier == 0) {
    				while ($w < 1.5) {
    					$t /= $w;
    					$w += 1.0;
    				}
    			}
    		}
    
    		else {
    			if ($w > 2.5) {
    				while ($w > 2.5) {
    					$w -= 1.0;
    					$t *= $w;
    				}
    			}
    		}
    
    		$w -= 2.0;
    		$g  = (((((((0.0021385778 * $w - 0.0034961289) * $w + 
                 0.0122995771) * $w - 0.00012513767) * $w + 0.0740648982) * $w +
                 0.0815652323) * $w + 0.411849671) * $w + 0.422784604) * $w +
                 0.999999926;
    		$g *= $t;
    	}
    
    	return $g;
    }
    
    ?>
    			

  5. Ruby

    ############################################
    # ガンマ関数の計算
    #      coded by Y.Suganuma
    ############################################
    
    ############################################
    # Γ(x)の計算(ガンマ関数,近似式)
    #      ier : =0 : normal
    #            =-1 : x=-n (n=0,1,2,・・・)
    #      return : 結果
    #      coded by Y.Suganuma
    ############################################
    
    def gamma(x, ier)
    
    	ier[0] = 0
    
    	if x > 5.0
    		v = 1.0 / x
    		s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v + 0.00078403922172) * v - 0.000229472093621) * v - 0.00268132716049) * v + 0.00347222222222) * v + 0.0833333333333) * v + 1.0
    		g = 2.506628274631001 * Math.exp(-x) * (x ** (x-0.5)) * s
    
    	else
    
    		err = 1.0e-20
    		w   = x
    		t   = 1.0
    
    		if x < 1.5
    
    			if x < err
    				k = Integer(x)
    				y = Float(k) - x
    				if y.abs() < err or (1.0-y).abs() < err
    					ier[0] = -1
    				end
    			end
    
    			if ier[0] == 0
    				while w < 1.5
    					t /= w
    					w += 1.0
    				end
    			end
    
    		else
    			if w > 2.5
    				while w > 2.5
    					w -= 1.0
    					t *= w
    				end
    			end
    		end
    
    		w -= 2.0
    		g  = (((((((0.0021385778 * w - 0.0034961289) * w + 0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w + 0.0815652323) * w + 0.411849671) * w + 0.422784604) * w + 0.999999926
    		g *= t
    	end
    
    	return g
    end
    
    ind = Array.new(1)
    print("data? ")
    s = gets()
    x = Float(s)
    
    y = gamma(x, ind)
    
    print("   x " + String(x) + " gamma(x) " + String(y) + " ind " + String(ind[0]) + "\n")
    			

  6. Python

    # -*- coding: UTF-8 -*-
    import numpy as np
    import sys
    from math import *
    
    ############################################
    # Γ(x)の計算(ガンマ関数,近似式)
    #      ier : =0 : normal
    #            =-1 : x=-n (n=0,1,2,・・・)
    #      return : 結果
    #      coded by Y.Suganuma
    ############################################
    
    def gamma(x, ier) :
    
    	ier[0] = 0
    
    	if x > 5.0 :
    		v = 1.0 / x
    		s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v + 0.00078403922172) * v - 0.000229472093621) * v - 0.00268132716049) * v + 0.00347222222222) * v + 0.0833333333333) * v + 1.0
    		g = 2.506628274631001 * exp(-x) * pow(x,x-0.5) * s
    
    	else :
    
    		err = 1.0e-20
    		w   = x
    		t   = 1.0
    
    		if x < 1.5 :
    
    			if x < err :
    				k = int(x)
    				y = float(k) - x
    				if abs(y) < err or abs(1.0-y) < err :
    					ier[0] = -1
    
    			if ier[0] == 0 :
    				while w < 1.5 :
    					t /= w
    					w += 1.0
    
    		else :
    			if w > 2.5 :
    				while w > 2.5 :
    					w -= 1.0
    					t *= w
    
    		w -= 2.0
    		g  = (((((((0.0021385778 * w - 0.0034961289) * w + 0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w + 0.0815652323) * w + 0.411849671) * w + 0.422784604) * w + 0.999999926
    		g *= t
    
    	return g
    
    ############################################
    # ガンマ関数の計算
    #      coded by Y.Suganuma
    ############################################
    
    ind = np.empty(1, np.int)
    s   = input("data? ")
    x   = float(s)
    
    y   = gamma(x, ind)
    
    print("   x " + str(x) + " gamma(x) " + str(y) + " ind " + str(ind[0]))
    			

  7. C#

    /****************************/
    /* ガンマ関数の計算         */
    /*      coded by Y.Suganuma */
    /****************************/
    using System;
    
    class Program
    {
    	static void Main()
    	{
    		Test1 ts = new Test1();
    	}
    }
    
    class Test1
    {
    	public Test1()
    	{
    		Console.Write("data? ");
    		double x = double.Parse(Console.ReadLine());
    
    		int ind = 0;
    		double y = gamma(x, ref ind);
    
    		Console.WriteLine("   x " + x + " gamma(x) " + y + " ind " + ind);
    	}
    
    	/****************************************/
    	/* Γ(x)の計算(ガンマ関数,近似式) */
    	/*      ier : =0 : normal               */
    	/*            =-1 : x=-n (n=0,1,2,・・・)  */
    	/*      return : 結果                   */
    	/****************************************/
    	static double gamma(double x, ref int ier)
    	{
    		double g;
    		ier = 0;
    
    		if (x > 5.0) {
    			double v = 1.0 / x;
    			double s = ((((((-0.000592166437354 * v + 0.0000697281375837) * v +
                            0.00078403922172) * v - 0.000229472093621) * v -
                            0.00268132716049) * v + 0.00347222222222) * v +
                            0.0833333333333) * v + 1.0;
    			g        = 2.506628274631001 * Math.Exp(-x) * Math.Pow(x,x-0.5) * s;
    		}
    
    		else {
    
    			double err = 1.0e-20;
    			double w   = x;
    			double t   = 1.0;
    
    			if (x < 1.5) {
    
    				if (x < err) {
    					int k    = (int)x;
    					double y = (double)k - x;
    					if (Math.Abs(y) < err || Math.Abs(1.0-y) < err)
    						ier = -1;
    				}
    
    				if (ier == 0) {
    					while (w < 1.5) {
    						t /= w;
    						w += 1.0;
    					}
    				}
    			}
    
    			else {
    				if (w > 2.5) {
    					while (w > 2.5) {
    						w -= 1.0;
    						t *= w;
    					}
    				}
    			}
    
    			w -= 2.0;
    			g  = (((((((0.0021385778 * w - 0.0034961289) * w + 
                     0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w +
                     0.0815652323) * w + 0.411849671) * w + 0.422784604) * w +
                     0.999999926;
    			g *= t;
    		}
    
    		return g;
    	}
    }
    			

  8. VB

    '**************************'
    ' ガンマ関数の計算         '
    '      coded by Y.Suganuma '
    '**************************'
    Module Test
    
    	Sub Main()
    
    		Console.Write("data? ")
    		Dim x As Double = Double.Parse(Console.ReadLine())
    
    		Dim ind As Integer = 0
    		Dim y As Double    = gamma(x, ind)
    
    		Console.WriteLine("   x " & x & " gamma(x) " & y & " ind " & ind)
    
    	End Sub
    
    	'**************************************'
    	' Γ(x)の計算(ガンマ関数,近似式) '
    	'      ier : =0 : normal               '
    	'            =-1 : x=-n (n=0,1,2,・・・)  '
    	'      return : 結果                   '
    	'**************************************'
    	Function gamma(x As Double, ByRef ier As Integer)
    
    		Dim g As Double
    		ier = 0
    
    		If x > 5.0
    			Dim v As Double = 1.0 / x
    			Dim s As Double = ((((((-0.000592166437354 * v + 0.0000697281375837) * v +
    			                  0.00078403922172) * v - 0.000229472093621) * v -
    			                  0.00268132716049) * v + 0.00347222222222) * v +
    			                  0.0833333333333) * v + 1.0
    			g = 2.506628274631001 * Math.Exp(-x) * Math.Pow(x,x-0.5) * s
    
    		Else
    			Dim err As Double = 1.0e-20
    			Dim w As Double   = x
    			Dim t As Double   = 1.0
    
    			If x < 1.5
    
    				If x < err
    					Dim k As Integer = Math.Floor(x)
    					Dim y As Double  = k - x
    					If Math.Abs(y) < err or Math.Abs(1.0-y) < err
    						ier = -1
    					End If
    				End If
    
    				If ier = 0
    					Do While w < 1.5
    						t /= w
    						w += 1.0
    					Loop
    				End If
    
    			Else
    				If w > 2.5
    					Do While w > 2.5
    						w -= 1.0
    						t *= w
    					Loop
    				End If
    			End If
    
    			w -= 2.0
    			g  = (((((((0.0021385778 * w - 0.0034961289) * w + 
    			     0.0122995771) * w - 0.00012513767) * w + 0.0740648982) * w +
    			     0.0815652323) * w + 0.411849671) * w + 0.422784604) * w +
    			     0.999999926
    			g *= t
    		End If
    
    		Return g
    
    	End Function
    
    End Module
    			

情報学部 菅沼ホーム 目次 索引