2016-09-30 3 views
0

나는 0.5 초 만에 70000과 같은 큰 숫자의 계승을 계산할 수있는 초고속 코드를 찾으려고 노력했다. 내 코드는 10 초 만에 할 수 있었다. 어디서나 검색했는데, 모든 코드는 메모리 오류 문제가 있거나 원하는만큼 빠르지 않습니다. 아무도 이것으로 나를 도울 수 있습니까?파이썬으로 0.5 초에 많은 수의 계승 계산

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 
+1

70000! 절대적으로 거대합니다. 어떤 종류의 큰 번호 라이브러리를 사용하고 있습니까? – Bathsheba

+0

http://stackoverflow.com/questions/1751334/fast-algorithms-for-computing-the-factorial (파이썬 플래그가있는 것)의 가능한 복제본 – Mijago

+0

gmpy 라이브러리를 사용하여 70000을 계산할 수 있습니다! 이 오래된 2GHz 머신에서 약 0.5 초. –

답변

0

정수 곱셈의 commutativity 속성을 사용해보십시오.

곱셈 된 숫자가 길면 (단일 단어에 맞지 않는 경우) 연산을 수행하는 데 필요한 시간이 길이에 따라 초 선형 적으로 커집니다.

가장 작은 (메모리 표현의 측면에서 가장 짧은) 요소 (부분 곱)를 먼저 곱하면 많은 시간을 절약 할 수 있습니다.

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 
0

당신은 완벽한 정밀도를 원하지 않는 경우, 당신이 스털링의 근사 https://en.wikipedia.org/wiki/Stirling's_approximation

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

을 사용할 수 있습니다 큰 n 값. 이 계산은 말 그대로 순간적입니다.

0

math.factorial()을 사용할 수 있습니다. 예 : 7000 의 계승을 계산

20.5 밀리 의 실행 시간
from math import factorial 
factorial(7000) 

:

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