我正在尝试实现一个函数来计算拉格朗日的四方定理,其方程式为自然数n。
例如,a ^ 2 + b ^ 2 + c ^ 2 + d ^ 2 = n,其中n是函数的输入。 这是功能:
int foursquaresum(int n)
{
int a, b, c, d, na, nb, nc, nd;
int count = 0;
for (a = 0, na = n; a * a <= na; a++)
{
for (b = a, nb = na - a * a; b * b <= nb; b++)
{
for (c = b, nc = nb - b * b; c * c <= nc; c++)
{
nd = nc - c * c;
d = sqrt (nd);
if (d * d == nd)
{
printf ("%d %d %d %d\n", a, b, c, d);
count++;
}
}
}
}
cout<<"Found solutions :"<< count;
}
我只想要任何一个可能的解决方案。所以我在c==1
时打破了代码。但是这段代码具有非常大的时间复杂度O(n ^ 2)。在线性时间内没有任何办法吗?
如果存在这样的解决方案,有人可以提供代码吗?
编辑:我想在平方时输出相应的4个数字,并在模数P下求和,使相应的产品模数为P
例如 - 1 x 2 x 3 x 4 x 5 mod 100 = 120 mod 100 =(8 ^ 2 + 6 ^ 2 + 4 ^ 2 + 2 ^ 2)mod 100
我如何在modulo p下执行此操作?我在代码中使用模数?
更新:我将其缩减为三个循环,但效率仍然不高。