階乗と二重階乗と

参考: 二重階乗 - 高精度計算サイト

Nspired Pythonmathモジュールにはmath.factorial()がない。
f:id:ti-nspire:20200927084841p:plain

階乗、二重階乗を計算するための函数を作ってみる。math.gamma()を使って負数およびfloatまで拡張した。

import math

def factorial(n):
  try:
    if n%1==0 and n>=0:
      n = int(n) # 0.0, 1.0, 2.0, ... はintとして計算する。
      sute = 1
      for i in range(1, n+1):
        sute *= i
      return sute
    else:
      return math.gamma(n + 1)
  except:
    return 9999999999999E999999999999
  
def factorial2(n):
  try:
    if n%1==0 and n>=0:
      n = int(n) # 0.0, 1.0, 2.0, ... はintとして計算する。
      if n%2:
        k = (n + 1) // 2
        return factorial(2 * k) // ((2**k) * factorial(k))
      else:
        k = n // 2 
        return (2**k) * factorial(k)
    else:
      return (2 / math.pi)**((1 - math.cos(math.pi * n)) / 4) * ((2**(n / 2)) * math.gamma(n / 2 + 1))
  except:
    return 9999999999999E999999999999

########
# test #
########
n = [-3, -2.5, -2, -1.5, -1, -0.5, 0, 1, 2, 3, 4, 5, 10, 10.0, 10.1, 10.2, 10.3]
print(list(map(factorial, n)))
print(list(map(factorial2, n)))

実行結果:
f:id:ti-nspire:20200927100340p:plain

Wolframによる検算:
f:id:ti-nspire:20200927100638p:plain