用python计算0.5秒内的大数阶因子

时间:2016-09-30 11:14:16

标签: python factorial

我一直试图找到一个超快速代码,可以在0.5秒内计算70000这样一个大数字的阶乘,我自己的代码可以在10秒内完成。我已经到处搜索,我找到的每个代码都有内存错误问题或者没有我想要的那么快。任何人都可以帮我这个吗?

enter code here
import math
num =int(raw_input())
usefrm=0
if len(str(num)) > 2:
  if int(str(num)[-2]) % 2 == 0:
        usefrm = 'even'
  else:
        usefrm = 'odd'
else:
  if num % 2 == 0:
        usefrm = 'even1'
  else:
        usefrm = 'odd1'

def picknumber(num):
  s = str(math.factorial(num))
  l = []
  for n in s:
        if int(n) != 0:
              l.append(int(n))
  return l[-1]

  def picknumber1(num):
  s = str(num)
  l = []
  for n in s:
        if int(n) != 0:
              l.append(int(n))
  return l[-1]
  if usefrm == 'even':
     e=picknumber1(6*picknumber(int(num/5))*picknumber(int(str(num)[-1])))
  if usefrm == 'odd':
     e=picknumber1(4*picknumber(int(num/5))*picknumber(int(str(num)[-1]))) 
  else:
  e=picknumber1(math.factorial(num))
  print e

5 个答案:

答案 0 :(得分:0)

尝试使用整数乘法的交换属性。

当相乘的数字很长(它们不适合单个单词)时,执行操作所需的时间会随着它们的长度而超线性增长。

如果先将最小(内存表示最短)因子(和部分产品)相乘,可以节省大量时间。

答案 1 :(得分:0)

对于大多数实际使用,Stirling's approximation非常快且非常准确

import math
from decimal import Decimal

def fact(n):
    d = Decimal(n)
    return (Decimal(2 * math.pi) * d).sqrt() * (d / Decimal(math.e)) ** d

print(fact(70000))

1.176811014417743803074731978E+308759

答案 2 :(得分:0)

如果您不想要完美的精度,可以使用斯特林的近似值 https://en.wikipedia.org/wiki/Stirling's_approximation

import np
n! ~ np.sqrt(2*np.pi*n)*(n/np.e)**n

表示大n值。这个计算实际上是即时的。

答案 3 :(得分:0)

您可以使用math.factorial()。例如:

from math import factorial 
factorial(7000)

执行时间为20.5毫秒,用于计算 7000 的阶乘:

python -m timeit -c "from math import factorial; factorial(7000)"
10 loops, best of 3: 20.5 msec per loop

答案 4 :(得分:0)

也许您可以尝试利用线程。