我需要对相当大的数字进行阶乘,这需要一些时间。如何确定该函数的阶乘算法有多远?
答案 0 :(得分:1)
(这个答案是评论中关于模块化因子的讨论的副产品。)
通过在每一步采用模数计算模块化因子肯定是要走的路,并且可以与威尔逊定理结合使用,以提供一种(不切实际的)方法来测试质数:
def modFact(k,n):
#computes k! mod n
p = 1
for i in range(1,k+1):
p = (p*i) % n
return p
def isPrime(n):
return n == 1+ modFact(n-1,n)
典型输出:
>>> for i in range(2,20): print(i,isPrime(i))
2 True
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
11 True
12 False
13 True
14 False
15 False
16 False
17 True
18 False
19 True
>>> isPrime(531455)
False
>>> isPrime(531457)
True
答案 1 :(得分:0)
使用ipython实用程序timeit
:
In [2]: timeit math.factorial(10)
1000000 loops, best of 3: 238 ns per loop
In [3]: timeit math.factorial(100)
100000 loops, best of 3: 2.43 µs per loop
In [4]: timeit math.factorial(1000)
10000 loops, best of 3: 114 µs per loop
In [5]: timeit math.factorial(10000)
100 loops, best of 3: 9.02 ms per loop
In [6]: timeit math.factorial(100000)
1 loops, best of 3: 517 ms per loop
....你能记住吗?一点都没有?
答案 2 :(得分:0)
你可以这样做:
def factorial(n, displayProgress = False):
p = 1
for i in range(1,n+1):
p *= i
if displayProgress and i % 1000 == 0:
print(round(100*i/n,1),'%', sep = '')
return p
典型输出:
>>> print(len(str(factorial(10000,True))))
10.0%
20.0%
30.0%
40.0%
50.0%
60.0%
70.0%
80.0%
90.0%
100.0%
35660