给定一个数N,如何找到最大的P*Q < N,使得P和Q是质数?
我的(暴力)尝试:
1. 对于所有小于√N的质数P,找到列表{P,N/P}。 2. 找到一个质数Q的列表,使得Q在上面的列表中刚好小于N/P 。 3. 确定上述结果的最大乘积P*Q。
虽然这种暴力方法可以解决问题,但是否有更合理的正式解决方案呢?
例如:N=27
因此,暴力解决方案可行。
进一步地,我们发现 Q_max <= N/2,并且如果我们同意 P < Q,则有 Q >= √N。
我们可以将我们的解集细化为仅包含 {P, N\2} 这些值,其中 N\2 >= √N。
我选择使用整数除法 "\", 因为我们只关心整数值,整数除法比普通除法 "/" 更快。
问题简化为:
例子:N=27
我的(暴力)尝试:
1. 对于所有小于√N的质数P,找到列表{P,N/P}。 2. 找到一个质数Q的列表,使得Q在上面的列表中刚好小于N/P 。 3. 确定上述结果的最大乘积P*Q。
虽然这种暴力方法可以解决问题,但是否有更合理的正式解决方案呢?
例如:N=27
√N = 5.196
Candidate primes: 2,3,5 --> [{2,13.5},{3,9},{5,5.4}] ->[{2,13},{3,7},{5,5}]
Solution: Max([2*13, 3*7, 5*5]) = 2*13 = 26
因此,暴力解决方案可行。
进一步地,我们发现 Q_max <= N/2,并且如果我们同意 P < Q,则有 Q >= √N。
我们可以将我们的解集细化为仅包含 {P, N\2} 这些值,其中 N\2 >= √N。
我选择使用整数除法 "\", 因为我们只关心整数值,整数除法比普通除法 "/" 更快。
问题简化为:
例子:N=27
√N = 5.196
Candidate P: 2,3 --> [{2,13},{3,9}] -->[{2,13},{3,7}]
(we drop {5,5} since N\P < √N i.e. 5 < 5.196)
Solution set: max([2*13, 3*7]) = 2*13 = 26
这看起来可能很琐碎,但它刚好消除了1/3的可能解集。
还有其他聪明的程序可以添加以进一步缩小解集吗?