Langrange Four Square定理的最快方法

时间:2017-01-17 16:24:06

标签: c++ time-complexity number-theory

我正在尝试实现一个函数来计算拉格朗日的四方定理,其方程式为自然数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下执行此操作?我在代码中使用模数?

更新:我将其缩减为三个循环,但效率仍然不高。

0 个答案:

没有答案