2014-09-20 22 views
-1

我的目標是特別大的數值,其因子可以找到例如12345678 !.即使在python中使用math.factorial(12345678)也需要很多時間來計算這樣一個數的階乘。在python中找到大數的階乘的確切值的最快方法是什麼?

我試過斯特林的Appoximation計算相同,但它沒有給出確切的值。有沒有其他方法來計算相同的?

EDIT 1:這是代碼的我試圖計算在數量

import math 

def main(): 
    total_cases = int(eval(raw_input())) 

    for case in xrange(total_cases): 
     number = int(eval(raw_input())) 

     if number >= 1e9: 
      break 

     factorial_n = math.factorial(number) 

     count = 0 

     for i in xrange(1, number): 
      temp = 10**i 

      if factorial_n % temp == 0 : 
       count += 1 
      else: 
       print count 
       break 

main() 

編輯2的階乘尾隨零預覽:我剛發現瓶頸是分割工序。

+0

在我的(不是特別快)機器上計算'math.factorial(12345)'需要大約6毫秒。 「很多時間」是什麼意思? – 2014-09-20 09:24:20

+0

我應該注意到Python 3(至少Python 3.2及更高版本)使用比Python 2.x更好的算法。但是我仍然在Python 2上得到不到0.1秒的時間。你使用的是什麼Python版本? – 2014-09-20 09:30:53

+0

你的算法很差。這不是'factorial'的問題。 – simonzack 2014-09-20 09:46:16

回答

1

scipy對於近似值和精確值都具有快速的C實現。

scipy.misc.factorial(12345, exact=True) 

自己試了一下,不到一秒鐘。

但嘗試math.factorial(12345)它也需要一秒鐘。你自己試過這個嗎?

+1

有趣的是,在我的機器上(在Python 3.4下),SciPy的版本大約比數學模塊版本慢7倍。 – 2014-09-20 09:33:54

+0

我不使用SciPy(AFAIK :)),但[mpmath](https://mpmath.googlecode.com/svn/trunk/doc/build/functions/gamma.html)可以完成_ginormous_階乘因子,近似。 – 2014-09-20 12:27:51

相關問題