How to enumerate x^2 + y^2 = z^2 - 1 (with additional constraints)

前端 未结 6 2081
野性不改
野性不改 2021-02-04 09:33

Lets N be a number (10<=N<=10^5).

I have to break it into 3 numbers (x,y,z) such that it validates the following conditions.

6条回答
  •  南方客
    南方客 (楼主)
    2021-02-04 10:25

    I want to get it done in C# and it should be covering all the test cases based on condition provided in the question.

    The basic code, converted to long to process the N <= 100000 upper limit, with every optimizaion thrown in I could. I used alternate forms from @Mat's (+1) Wolfram Alpha query to precompute as much as possible. I also did a minimal perfect square test to avoid millions of sqrt() calls at the upper limit:

    public static void Main()
    {
        int c = 0;
    
        long N = long.Parse(Console.ReadLine());
        long N_squared = N * N;
    
        double half_N_squared = N_squared / 2.0 - 0.5;
        double x_limit = N - Math.Sqrt(2) / 2.0 * Math.Sqrt(N_squared + 1);
    
        for (long x = 2; x < x_limit; x += 2)
        {
            long x_squared = x * x + 1;
    
            double y_limit = (half_N_squared - N * x) / (N - x);
    
            for (long y = x; y < y_limit; y += 2)
            {
                long z_squared = x_squared + y * y;
                int digit = (int) z_squared % 10;
    
                if (digit == 3 || digit == 7)
                {
                    continue;  // minimalist non-perfect square elimination
                }
    
                long z = (long) Math.Sqrt(z_squared);
    
                if (z * z == z_squared)
                {
                    c++;
                }
            }
        }
    
        Console.WriteLine(c);
    }
    

    I followed the trend and left out "the degenerate solution" as implied by the OP's code but not explicitly stated.

提交回复
热议问题