最近,我正在参加工作面试,其中包括编程任务。作业之一是:
白色一个函数,它将找到所有整数值对x
,y
,这些整数值对针对给定整数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)
,但我不知道如何使用该提示来解决该问题。
只是出于好奇(现在任务已结束),有什么想法如何以最佳方式解决此问题?
答案 0 :(得分:7)
提示x^2 - 4y^2 = (x - 2y)(x + 2y)
表示n
必须被(x - 2y)
和(x + 2y)
整除。因此,例如n
的整数分解产生了相对较小的整数集,可以搜索它们是否可以生成(x - 2y)
和(x + 2y)
形式的数字。
考虑正整数x
和y
就足够了,因为由于方程中的平方,对于每个x
,-x
也是一个解,对于{ {1}}。因此,您发现的每一对数字实际上都会为您提供四种不同的解决方案。
您可能还想查看Diophantine equations的理论,这是此类问题背后的通用数学理论。您的特殊情况位于MathWorld article中。
答案 1 :(得分:1)
在您的方法中,您最终完成了从sqrt(n)
到n
的循环。这意味着您的解决方案的时间复杂度为O(n)
。
如果我们对否定解感兴趣,我们可以给定一个非负对(x, y)
来创建(-x, y)
,(x, -y)
和(-x, -y)
这三个解(这些解是x
或y
可以为0
,因此不必区分。因此,我们可以将自己限制为非负x
和y
。我还假设n > 0
。
现在假设a = x - 2y
和b = x + 2y
。使用a <= b
是因为y >= 0
。
然后a * b = n
和b = n / a
。
我们现在可以用a
遍历1 <= a <= sqrt(n)
的所有值,并检查b = n / a
是否为整数。 (如果a
大于sqrt(n)
,则b = n / a
会小于a
。)
对于a
的所有值,其中b
是整数,我们计算x = (a + b) / 2
和y = (b - a) / 4
。如果x
和y
是整数,我们有一个解决方案。
此算法的时间复杂度为O(sqrt(n))
。