# ルジャンドル陪多項式 Associated Legendre Polynomial # 引数 次数 位数 値 ($N, $M, $X) # 戻り値 ルジャンドル陪多項式 ($AssociatedLegendrePolynomial) sub ASSOCIATEDLEGENDREPOLYNOMIAL{ my ($N, $M, $X) = @_; my $AssociatedLegendrePolynomial = 0; my $Sum = 0; my $Sign = 0; my $Factorial = 1; my $Factorial2N = 1; my $FactorialNM = 1; my $FloorNM2 = &FLOORFUNCTON(($N - $M) / 2); # 次数,位数,値の確認 if(($N < 0) || ($N < $M) || (($M != 0) && (($X < -1) || (1 < $X)))){ return 0; } for(my $i = 0; $i <= $FloorNM2; $i++){ # 分子 符号 $Sign = (($i % 2) == 0 ? 1: -1); # 分子 階乗 $Factorial2N = 1; for(my $j = 2 * ($N - $i); $j > ($N - $i); $j--){ $Factorial2N = $Factorial2N * $j; } # 分母 階乗 $Factorial = ($i == 0 ? 1 : $Factorial * $i); # 分母 階乗 $FactorialNM = 1; for(my $j = ($N - (2 * $i) - $M); $j >= 2; $j--){ $FactorialNM = $FactorialNM * $j; } $Sum += (($Sign * $Factorial2N) / ($Factorial * $FactorialNM)) * ($X ** ($N - (2 * $i) - $M)); } # ルジャンドル陪多項式 Associated Legendre Polynomial $AssociatedLegendrePolynomial = ((-1) ** ($M)) * (((1 - ($X * $X)) ** ($M / 2)) / (2 ** $N)) * $Sum; return $AssociatedLegendrePolynomial; } # 床関数 Floor Function # 引数 値 ($X) # 戻り値 床関数 ($FloorFunction) sub FLOORFUNCTON{ my ($X) = @_; my $FloorFunction = 0; my $Temp = 0; if($X == int($X)){ $Temp = $X; }else { if($X > 0){ $Temp = int($X); }else { $Temp = int($X) - 1; } } # 床関数 Floor Function $FloorFunction = $Temp; return $FloorFunction; }