📜  计算将数字表示为完全平方和的方法(1)

📅  最后修改于: 2023-12-03 14:57:29.953000             🧑  作者: Mango

计算将数字表示为完全平方和的方法

在数论中,Morgenstern的四平方和定理指出,每个正整数均可表示为不超过4个正整数的平方和。本文介绍两种将数字表示为完全平方和的方法。

方法1

假设我们需要将一个数字n表示为完全平方和,则有以下公式:

n = a2 + b2 + c2 + d2

其中a、b、c、d都是整数,且a ≤ b ≤ c ≤ d。

我们可以使用双重循环来枚举a、b、c、d的取值,并通过判断n是否等于a2 + b2 + c2 + d2来判断是否找到了答案。

下面是Python实现代码:

def find_squares(n):
    for a in range(int(n**(1/2))+1):
        for b in range(a,int(n**(1/2))+1):
            for c in range(b,int(n**(1/2))+1):
                for d in range(c,int(n**(1/2))+1):
                    if n == a**2 + b**2 + c**2 + d**2:
                        return [a,b,c,d]
    return None
方法2

利用拉格朗日四平方和定理,每个正整数均可表示为不超过4个正整数的平方和。公式如下:

n = a02 + a12 + a22 + a32

其中a0、a1、a2、a3都是整数,且a0 ≤ a1 ≤ a2 ≤ a3

我们可以通过数学计算,得出每一个n的具体a0、a1、a2、a3的值,而无需使用双重循环枚举。

下面是Python实现代码:

def lagrange(n):
    if n < 0:
        return None
    if n == 0:
        return [0,0,0,0]
    a, b, c = 0, 0, 0
    while n % 4 == 0:
        n = n//4
        a += 1
    if n % 8 == 7:
        return None
    b_max = int(n**(1/2))
    for i in range(b_max+1):
        b = i
        c_max = int((n-b*b)**(1/2))
        for j in range(c_max+1):
            c = j
            d = int((n-b*b-c*c)**(1/2))
            if b*b+c*c+d*d == n:
                return [a,b,c,d] 
    return None

两种方法的时间复杂度都不是很高,都是O(n2)级别的。如果需要将多个数字表示为完全平方和,则使用方法2较为高效。

参考文献:

[1] https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem

[2] https://en.wikipedia.org/wiki/Legendre%27s_three-square_theorem

[3] https://oeis.org/A001481