怎样才能做更少的计算?大数字效率非常低

时间:2010-11-11 00:58:04

标签: python

num = input ()
fact = 0
while fact != num:
     fact = fact + 1
     rem = num % fact
     if rem == 0:
          print fact

7 个答案:

答案 0 :(得分:3)

您只需要转到输入数字的平方根来获取所有因子(不是其他地方建议的数字的一半)。例如,24具有因子1,2,3,4,6,8,12,24。sqrt(24)约为4.9。检查1并且也得到24,检查2并且也得到12,检查3并且也得到8,检查4并且也得到6.因为5> 4.9,无需检查。 (是的,我知道24不是最好的例子,因为小于sqrt(24)的所有整数都是24的因子。)

factors = set()
for i in xrange(math.floor(math.sqrt(x))+1):
    if x % i == 0:
        factors.add(i)
        factors.add(x/i)
print factors

对于大数字,有一些非常复杂的方法可以做得更好,但这应该可以让你获得不错的运行时改进。根据您的应用程序,缓存还可以为您节省大量时间。

答案 1 :(得分:2)

对于初学者使用for循环。然后,让Python为你增量,并摆脱不必要的rem变量。除了以“Pythonic”方式之外,此代码与您的代码完全相同。

num = input()
for x in xrange(1, num):
    if (num % x) == 0:
        print fact

xrange(x, y)返回x的所有整数的生成器,但不包括y。

答案 2 :(得分:2)

那么打印出一个数字的所有因素?第一个明显的优化是当事实* 2大于num时你可以退出。任何大于num的一半都不是一个因素。这是一半的工作立即被抛弃。

第二个是你更好地寻找素因子化并从中得出所有可能的因素。对于那种事情,有一堆really smart algorithms

答案 3 :(得分:2)

一旦你到达那里(一旦事实> num / 2),你就不会发现任何新的数字,因为通过计算每个数字的num / fact可以发现数字/数字以上(这也可以用于轻松打印每对数字。)

以下代码应该在每次计算时将时间缩短几秒钟,并将num切成两半,其中num为奇数。希望你能跟着它,如果没有,请问。 如果我以后想到的话,我会添加更多。

def even(num):
    '''Even numbers can be divided by odd numbers, so test them all'''
    fact=0
    while fact<num/2:
         fact+=1
         rem=num % fact
         if rem == 0:
              print '%s and %s'%(fact,num/fact)
def odd(num):
    '''Odd numbers can't be divided by even numbers, so why try?'''
    fact=-1
    while fact<num/2:
         fact+=2
         rem=num % fact
         if rem == 0:
              print '%s and %s'%(fact,num/fact)
while True:
    num=input(':')
    if  str(num)[-1] in '13579':
        odd(num)
    else:
        even(num)

答案 4 :(得分:1)

答案 5 :(得分:1)

是。使用quantum computer

  

Shor的算法,以数学家Peter Shor命名,是一个量子   用于整数的算法(在量子计算机上运行的算法)   因子化于1994年制定。非正式地解决了以下问题   问题:给定整数N,找到其主要因子。

     

在量子计算机上,要求整数N,Shor的算法运行   在多项式时间内(所用的时间是log N中的多项式,即   输入的大小)。具体来说,需要时间O((log N)3),   证明整数分解问题可以   在量子计算机上有效地解决,因此具有复杂性   BQP班。这比已知的最有效指数快得多   经典因子算法,一般数字域筛,其中   在亚指数时间内工作 - 约为O(e1.9(log N)1/3(log log   N)2/3)。 Shor算法的效率是由效率决定的   量子傅里叶变换和模幂运算   squarings。

答案 6 :(得分:1)

不幸的是,在Python中,divmod操作是作为内置函数实现的。尽管硬件整数除法经常同时产生商和余数,但我所知道的非汇编语言没有实现/%//%基本运算符。

所以:如果计算机器操作,以下是一个更好的强力算法。它得到O(sqrt(N))时间内的所有因子,而不必计算sqrt(N) - 看,妈妈,没有浮点!

# even number

fact = 0
while 1:
    fact += 1
    fact2, rem = divmod(num, fact)
    if not rem:
        yield fact
        yield fact2
    if fact >= fact2 - 1:
        # fact >= math.sqrt(num)
        break