📅  最后修改于: 2023-12-03 14:57:29.953000             🧑  作者: Mango
在数论中,Morgenstern的四平方和定理指出,每个正整数均可表示为不超过4个正整数的平方和。本文介绍两种将数字表示为完全平方和的方法。
假设我们需要将一个数字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
利用拉格朗日四平方和定理,每个正整数均可表示为不超过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