Skip to content

Commit 3e9f039

Browse files
committed
Format code and add Wikipedia URL for Lagrange's theorem
1 parent 5493aa5 commit 3e9f039

File tree

2 files changed

+50
-35
lines changed

2 files changed

+50
-35
lines changed

src/main/java/com/thealgorithms/maths/SumOfSquares.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,50 @@
33
/**
44
* Implementation of Lagrange's Four Square Theorem
55
* Find minimum number of perfect squares that sum to given number
6+
*
7+
* @see <a href="https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem">Lagrange's Four Square Theorem</a>
68
* @author BEASTSHRIRAM
79
*/
810
public final class SumOfSquares {
9-
11+
1012
private SumOfSquares() {
1113
// Utility class
1214
}
13-
15+
1416
/**
1517
* Find minimum number of perfect squares that sum to n
18+
*
1619
* @param n the target number
1720
* @return minimum number of squares needed
1821
*/
1922
public static int minSquares(int n) {
20-
if (isPerfectSquare(n)) return 1;
21-
23+
if (isPerfectSquare(n)) {
24+
return 1;
25+
}
26+
2227
for (int i = 1; i * i <= n; i++) {
2328
int remaining = n - i * i;
24-
if (isPerfectSquare(remaining)) return 2;
29+
if (isPerfectSquare(remaining)) {
30+
return 2;
31+
}
2532
}
26-
33+
2734
// Legendre's three-square theorem
2835
int temp = n;
29-
while (temp % 4 == 0) temp /= 4;
30-
if (temp % 8 == 7) return 4;
31-
36+
while (temp % 4 == 0) {
37+
temp /= 4;
38+
}
39+
if (temp % 8 == 7) {
40+
return 4;
41+
}
42+
3243
return 3;
3344
}
34-
45+
3546
private static boolean isPerfectSquare(int n) {
36-
if (n < 0) return false;
47+
if (n < 0) {
48+
return false;
49+
}
3750
int root = (int) Math.sqrt(n);
3851
return root * root == n;
3952
}
Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,68 @@
11
package com.thealgorithms.maths;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
45
import org.junit.jupiter.api.Test;
56

67
/**
78
* Test class for SumOfSquares
9+
*
810
* @author BEASTSHRIRAM
911
*/
1012
class SumOfSquaresTest {
1113

1214
@Test
1315
void testPerfectSquares() {
1416
// Perfect squares should return 1
15-
assertEquals(1, SumOfSquares.minSquares(1)); // 1^2
16-
assertEquals(1, SumOfSquares.minSquares(4)); // 2^2
17-
assertEquals(1, SumOfSquares.minSquares(9)); // 3^2
18-
assertEquals(1, SumOfSquares.minSquares(16)); // 4^2
19-
assertEquals(1, SumOfSquares.minSquares(25)); // 5^2
17+
assertEquals(1, SumOfSquares.minSquares(1)); // 1^2
18+
assertEquals(1, SumOfSquares.minSquares(4)); // 2^2
19+
assertEquals(1, SumOfSquares.minSquares(9)); // 3^2
20+
assertEquals(1, SumOfSquares.minSquares(16)); // 4^2
21+
assertEquals(1, SumOfSquares.minSquares(25)); // 5^2
2022
}
2123

2224
@Test
2325
void testTwoSquares() {
2426
// Numbers that can be expressed as sum of two squares
25-
assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2
26-
assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2
27-
assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2
28-
assertEquals(2, SumOfSquares.minSquares(10)); // 1^2 + 3^2
29-
assertEquals(2, SumOfSquares.minSquares(13)); // 2^2 + 3^2
27+
assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2
28+
assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2
29+
assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2
30+
assertEquals(2, SumOfSquares.minSquares(10)); // 1^2 + 3^2
31+
assertEquals(2, SumOfSquares.minSquares(13)); // 2^2 + 3^2
3032
}
3133

3234
@Test
3335
void testThreeSquares() {
3436
// Numbers that require exactly three squares
35-
assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2
36-
assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2
37-
assertEquals(3, SumOfSquares.minSquares(11)); // 1^2 + 1^2 + 3^2
38-
assertEquals(3, SumOfSquares.minSquares(12)); // 2^2 + 2^2 + 2^2
39-
assertEquals(3, SumOfSquares.minSquares(14)); // 1^2 + 2^2 + 3^2
37+
assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2
38+
assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2
39+
assertEquals(3, SumOfSquares.minSquares(11)); // 1^2 + 1^2 + 3^2
40+
assertEquals(3, SumOfSquares.minSquares(12)); // 2^2 + 2^2 + 2^2
41+
assertEquals(3, SumOfSquares.minSquares(14)); // 1^2 + 2^2 + 3^2
4042
}
4143

4244
@Test
4345
void testFourSquares() {
4446
// Numbers that require exactly four squares (form 4^a * (8b + 7))
45-
assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2
46-
assertEquals(4, SumOfSquares.minSquares(15)); // 1^2 + 1^2 + 2^2 + 3^2
47-
assertEquals(4, SumOfSquares.minSquares(23)); // 1^2 + 1^2 + 3^2 + 3^2
48-
assertEquals(4, SumOfSquares.minSquares(28)); // 4 * 7, so needs 4 squares
49-
assertEquals(4, SumOfSquares.minSquares(31)); // 1^2 + 2^2 + 3^2 + 3^2
47+
assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2
48+
assertEquals(4, SumOfSquares.minSquares(15)); // 1^2 + 1^2 + 2^2 + 3^2
49+
assertEquals(4, SumOfSquares.minSquares(23)); // 1^2 + 1^2 + 3^2 + 3^2
50+
assertEquals(4, SumOfSquares.minSquares(28)); // 4 * 7, so needs 4 squares
51+
assertEquals(4, SumOfSquares.minSquares(31)); // 1^2 + 2^2 + 3^2 + 3^2
5052
}
5153

5254
@Test
5355
void testLargerNumbers() {
5456
// Test some larger numbers
5557
assertEquals(1, SumOfSquares.minSquares(100)); // 10^2
56-
assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2
57-
assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2
58-
assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7
58+
assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2
59+
assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2
60+
assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7
5961
}
6062

6163
@Test
6264
void testEdgeCases() {
6365
// Test edge case
64-
assertEquals(1, SumOfSquares.minSquares(0)); // 0^2
66+
assertEquals(1, SumOfSquares.minSquares(0)); // 0^2
6567
}
6668
}

0 commit comments

Comments
 (0)