# ポッホハンマー記号 Pochhammer Symbol # 引数 値 ($N, $X) # 戻り値 ポッホハンマー記号 ($PochhammerSymbol) sub POCHHAMMERSYMBOL{ my ($N, $X) = @_; my $PochhammerSymbol = 0; my $StirlingNumber = 0; my $Sign = 0; my $Sum = 0; my $PowerX_ = 0; my $X_ = 0; # 値の確認 if(($N != 0) && (($N < 0) || ($X == 0) || (($X < 0) && ((abs($X) - $N + 1) <= 0)))){ return 0; } if($N == 0){ # ポッホハンマー記号 Pochhammer Symbol $PochhammerSymbol = 1; return $PochhammerSymbol; }elsif($N == 1){ # ポッホハンマー記号 Pochhammer Symbol $PochhammerSymbol = $X; return $PochhammerSymbol; } if($X > 0){ $X_ = $X; }else { $X_ = abs($X) - $N + 1; } for(my $i = 0; $i <= $N; $i++){ # 符号 $Sign = ((($N - $i) % 2) == 0 ? 1: -1); # 第一種スターリング数 Stirling Number Of The First Kind $StirlingNumber = &STIRLINGNUMBERFIRST($N, $i); # 累乗 $PowerX_ = $X_ ** $i; $Sum += ($Sign * $StirlingNumber * $PowerX_); } # $Xが負 $Sum = ((-1) ** $N) * $Sum if($X < 0); # ポッホハンマー記号 Pochhammer Symbol $PochhammerSymbol = $Sum; return $PochhammerSymbol; } # 第一種スターリング数 Stirling Number Of The First Kind # 引数 n個 k個 ($n, $k) # 戻り値 第一種スターリング数 ($StirlingNumber) sub STIRLINGNUMBERFIRST{ my ($n, $k) = @_; my $StirlingNumber = 0; my $PrevStirlingNumber = 0; my @Stirling = (1, 0); my $N = int($n); my $K = int($k); my $Diff = $N - $K + 2; my $Start = 1; my $End = $K; my $Temp = 0; # 個数の確認 if(($N < 0) || ($K < 0) || ($N < $K)){ return 0; } if($N == $K){ return 1; }elsif(($N == 0) || ($K == 0)){ return 0; } # 計算 for(my $i = 1; $i <= $N; $i++){ # 開始位置 $Start = ($i < $Diff ? 1 : ($Start + 1)); # 終了位置 $End = ($i <= $K ? $i : $K); # 一つ前 2度値を使用するので $PrevStirlingNumber = 0; for(my $j = $Start; $j <= $End; $j++){ $Temp = $Stirling[$j - 1] - (($i - 1) * $Stirling[$j]); # 次回使用する値 $Stirling[$j - 1] = $PrevStirlingNumber; $PrevStirlingNumber = $Temp; } # 次回使用する値 $Stirling[$End] = $Temp; # $End超 は 0 $Stirling[$End + 1] = 0; } # 第一種スターリング数 Stirling Number Of The First Kind $StirlingNumber = $Stirling[$K]; return $StirlingNumber; }