求解方程的算法:x ^ 2-4-4y ^ 2 = n

时间:2018-11-26 11:35:56

标签: algorithm

最近,我正在参加工作面试,其中包括编程任务。作业之一是:
白色一个函数,它将找到所有整数值对xy,这些整数值对针对给定整数n求解方程: x^2 - 4y^2 = n

我的方法是: 我重写了y的等式:y = sqrt(x^2 - n) / 2
x=sqrt(n)x=n的for循环
对于x是整数,我为每个y计算了y的值并进行了检查。

此解决方案给出了正确的答案,但是,对于大n,该算法不符合性能标准。
在作业中还给出了提示,x^2 - 4y^2 = (x - 2y)(x + 2y),但我不知道如何使用该提示来解决该问题。

只是出于好奇(现在任务已结束),有什么想法如何以最佳方式解决此问题?

2 个答案:

答案 0 :(得分:7)

提示x^2 - 4y^2 = (x - 2y)(x + 2y)表示n必须被(x - 2y)(x + 2y)整除。因此,例如n的整数分解产生了相对较小的整数集,可以搜索它们是否可以生成(x - 2y)(x + 2y)形式的数字。

考虑正整数xy就足够了,因为由于方程中的平方,对于每个x-x也是一个解,对于{ {1}}。因此,您发现的每一对数字实际上都会为您提供四种不同的解决方案。


您可能还想查看Diophantine equations的理论,这是此类问题背后的通用数学理论。您的特殊情况位于MathWorld article中。

答案 1 :(得分:1)

在您的方法中,您最终完成了从sqrt(n)n的循环。这意味着您的解决方案的时间复杂度为O(n)

如果我们对否定解感兴趣,我们可以给定一个非负对(x, y)来创建(-x, y)(x, -y)(-x, -y)这三个解(这些解是xy可以为0,因此不必区分。因此,我们可以将自己限制为非负xy。我还假设n > 0

现在假设a = x - 2yb = x + 2y。使用a <= b是因为y >= 0

然后a * b = nb = n / a

我们现在可以用a遍历1 <= a <= sqrt(n)的所有值,并检查b = n / a是否为整数。 (如果a大于sqrt(n),则b = n / a会小于a。)

对于a的所有值,其中b是整数,我们计算x = (a + b) / 2y = (b - a) / 4。如果xy是整数,我们有一个解决方案。

此算法的时间复杂度为O(sqrt(n))