Lagrange’s four-square theorem, also known as Bachet’s conjecture, states that
every natural number can be represented as the sum of four integer squares. That is, the squares form an additive basis of order four.
Swift Check The least number of Perfect square numbers which sum to n
The idea is:
- there are only 4 possible results: 1 2 3 4
- return 1 when n isSquare
- return 4: n is 4^k*(8*m+7)
1. check n % 4 == 0
2. check n % 8 == 7 return 4
- return 2: n = i*i + j*j
isSquare(n-i*i) --- return true, is 2
for reduce checking, keep n-i*i >0
for(int i = 0; i <= (int)(sqrt(n)); ++i)
eg: 50, did not need to check until 50, only need to check until 7( sqrt(50) )
- else return 3
Implementation:
func numSquares(_ n: Int) -> Int {
if n <= 0 { return 0 }
var n = n
// check if num is square nnum
let isSquare: (Int) -> Bool = { num in
let sqrtRoot = Int(Double(num).squareRoot())
return sqrtRoot*sqrtRoot == num
}
if isSquare(n) { return 1 }
while n % 4 == 0 {
n >>= 2
}
if n % 8 == 7 {
return 4
}
let sqrtRoot = Int(Double(n).squareRoot())
for i in 1...sqrtRoot {
if isSquare(n-i*i) {
return 2
}
}
return 3
}

Comments
Join the discussion for this article at here . Our comments is using Github Issues. All of posted comments will display at this page instantly.