例如,N = 36应该给出F = 9和R = 4。请注意,R不一定是质数或质数幂。请注意,我没有将N分解。对F和R的唯一限制是它们是互质的。
这是我的快速和天真版本,它正在工作:
def factor_partial(N):
for R in xrange(int(math.sqrt(N)),1,-1):
if N%R == 0 and gcd(R,N/R) == 1:
return N/R, R
我想到的另一种方法是按照递增顺序找到除数,并在此过程中删除任何非除数的倍数。类似于:
def factor_partial(N):
i = range(2, int(sqrt(N)) + 1)
while i:
if N % i[0] != 0:
remove_multiples(i, i[0]) #without removing i[0]
else:
if gcd(i[0], N/i[0]) == 1:
R = i[0]
i.pop(0) #remove i[0]
return N/R, R
我认为这将会很慢且内存占用大,但如果
i
是一个生成器,那么它可能会更高效。我还没有多少使用生成器的经验。我能改进第一个版本吗?第二个版本可行吗(我该如何做)?是否有完全不同的方法更好?
寻找Python、C或伪代码的答案。
这是一个关于数论课程的项目。我正在实现一个基于Pocklington的素性测试。虽然我需要一个因数分解算法,但我们还没有学习过任何算法,我可能不会使用像二次筛法这样超出课程范围的算法。我正在寻求针对所提出问题的具体帮助。