在课堂上,我们遇到了这个编程问题,目前还不知道如何解决。
给定一个正整数
n
。已知n = p * q
,其中p
和q
是质数,p<=q
并且对于某个给定的正整数k
,|q-k*p|<10^5
。你需要找到p
和q
。
输入:
35 1
121 1
1000730021 9
输出:
5 * 7
11 * 11
10007 * 100003
这不是作业,我们只是想解决一些有趣的问题。如果你有一些想法,请在此处发布,以便我们尝试一些东西,谢谢。
在课堂上,我们遇到了这个编程问题,目前还不知道如何解决。
给定一个正整数
n
。已知n = p * q
,其中p
和q
是质数,p<=q
并且对于某个给定的正整数k
,|q-k*p|<10^5
。你需要找到p
和q
。
输入:
35 1
121 1
1000730021 9
输出:
5 * 7
11 * 11
10007 * 100003
这不是作业,我们只是想解决一些有趣的问题。如果你有一些想法,请在此处发布,以便我们尝试一些东西,谢谢。
n = p * q
|q-k*p|<10^5
给定输入的n
和k
。因此
q-k*p=a
与
-10^5<=a<=10^5
将 q-k*p=a
乘以 q
并用 p*q=n
替换,得到
q^2-a*q-k*n=0
对于每个 a
,解决这个二次方程:
-10^5<=a<=10^5`
检查 q
是否被 n
整除。
解决二次方程可以在多项式时间内完成,这对于求解 2*10^5+1
方程是正确的。当然,对于小值的n
和k
以及大值的n
和k
,还有更好的算法。
正如 ypercube 所提到的,我们只需要检查方程式即可。
a^2+4*k*n
是一个正方形。
Δ = a^2+4*k*n
是否为完全平方数将使其更快。 - ypercubeᵀᴹ给定输入的n和k,其中n = p * q且|q-k*p|<10^5。因此,q-k*p=a,其中-10^5<=a<=10^5。将q-k*p=a乘以q并用p*q替换得到n,则有q^2-a*q-k*n=0。对于每个-10^5<=a<=10^5,解决这个二次方程并检查q是否能够整除n。解决二次方程可以在多项式时间内完成,对于解决2*10^5+1个方程也是如此。对于小的n和k值,有更好的算法。
p在区间内
[(sqrt(k*n+2500000000)-50000)/k,(sqrt(k*n+2500000000)+50000)/k]
[sqrt(k*n+2500000000)-50000,sqrt(k*n+2500000000)+50000]
其中始终包含约10^5个整数
您可以使用基于GUI的YAFU版本从http://qurancode.com尝试更大的示例。 YAFU的主要优点是其自适应性,它在分解时会自动切换算法。对于Windows 7/8/10来说,使用GUI版本真的是最好和最容易的选择。
只需点击被红心包围的黄色 PI 符号即可 :)