实际上,给定 N a(可能非常大)偶数整数,我想找到 N = F * R 其中 gcd(F,R) = 1,F>R,并且 F 尽可能小(因为我将完全因子 F)。问题的核心是找到最大除数 R,其中 R < sqrt(N)。
例如,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的素数测试。虽然我需要一个分解算法,但我们还没有研究过任何算法,而且我可能不会使用诸如二次筛之类的算法,这超出了我的课程范围。我正在就所提出的问题寻求具体帮助。