【发布时间】:2012-01-06 13:23:43
【问题描述】:
实际上,给定 N a(可能非常大)偶数,我想找到 N = F * R 其中 gcd(F,R) = 1,F>R,并且 F 尽可能小(因为 I'将完全考虑 F)。问题的核心是找到最大除数 R,其中 R
例如,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 的素数测试。虽然我需要一个分解算法,但我们还没有研究过任何算法,而且我可能不会使用诸如二次筛之类的算法,这超出了我的课程范围。我正在就所提出的问题寻求具体帮助。
【问题讨论】:
-
F * R == N吗?我不确定所有这些变量的含义 -
@Blender 是的,谢谢,已更新。
-
您的第二种方法是Sieve of Eratosthenes。我建议你也看看this question。
-
@Blender 是的,在某种程度上。我为经典筛子编写了代码来生成素数,但它也不使用生成器并且内存不足。也许是时候升级那个了。
-
筛子不适用于大量数字,因为您必须在内存中的某个时间点存储每个前面的数字,这会以非常快的速度消耗 RAM。这只是运行筛子所需存储的数字数量(
n是数字数量):n(n+1)/2。
标签: python c math generator factorization