我想要遍历每个小于N的数字,并知道每个数字的质因数分解。我的问题是如何以最佳方式完成这个任务?
我知道可以使用试除法来找到给定数字的质因数分解,并将其重复用于小于N的每个数字,但这很低效且比从已知质因数生成每个小于N的数字更耗时。我已经编写了一个以下面的方式来生成所有小于N的数字,该数字由小于N的所有质因数生成。有没有更快的方法来做到这一点?我正在尝试利用这个事实,即我正在为所有小于N的数字执行此操作以节省计算时间,而不是进行试除法。
我要完成的目标: 我有一个算法,我想在小于N的每个数字上运行它。对于这个算法,我需要每个数字的质因数分解。我正在尝试在最短时间内获得每个数字的质因数分解。我实际上不需要存储质因数分解,我只需要在算法中使用它们。 (代码中的solve(curNum, curFactors)函数是我的算法)
我编写了一个python3程序,使用递归方式生成每个数字并知道它的质因数,但速度非常慢。(当N = 10 ^ 7时,处理时间约为58秒。函数solve在此基准测试中未执行任何操作。)
curFactors是一个列表,其中每个偶数元素是因式分解中质数的索引,每个奇数元素是该质数的指数。我将其从列表的列表展平以节省计算时间。prime start index用于确保我不重复计算数字。目前,solve没有做任何事情,这样我就可以对此功能进行基准测试。
def iterateThroughNumbersKnowingFactors(curNumber, curFactors, primeStartIndex):
#Generate next set of numbers
#Handle multiplying by a prime already in the factorization seperately.
for i in range(primeStartIndex+1,lenPrimes):
newNum = curNumber * primelist[i]
if(newNum > upperbound):
break
newFactors = curFactors[:]
newFactors.append(i)
newFactors.append(1)
#Do something with this number and its factors
solve(newNum, newFactors)
#Go get more numbers
iterateThroughNumbersKnowingFactors(newNum,newFactors,i)
if(primeStartIndex > -1):
newNum = curNumber * primelist[primeStartIndex]
if(newNum > upperbound):
return
currentNumPrimes = len(curFactors)
curFactors[currentNumPrimes-1] += 1
#Do something with this number and its factors
solve(newNum, curFactors)
#Go get more numbers
iterateThroughNumbersKnowingFactors(newNum,curFactors,primeStartIndex)
upperbound = 10**7
#https://dev59.com/snI95IYBdhLWcg3w-DH0
primelist = primesfrom2to(upperbound+1)
lenPrimes = len(primelist)
t0 = time.clock()
iterateThroughNumbersKnowingFactors(1,[],-1)
print(str(time.clock() - t0) +" seconds process time")
有没有人知道更好的方法来做这件事?