Skip to content

Commit ee2b107

Browse files
committed
Add parameterized tests for Euler totient with 100% coverage
1 parent dcef568 commit ee2b107

File tree

1 file changed

+61
-25
lines changed

1 file changed

+61
-25
lines changed

src/number_theory/euler_totient.rs

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,37 +34,73 @@ mod tests {
3434
use super::*;
3535

3636
#[test]
37-
fn test_small_numbers() {
38-
assert_eq!(euler_totient(1), 1);
39-
assert_eq!(euler_totient(2), 1);
40-
assert_eq!(euler_totient(3), 2);
41-
assert_eq!(euler_totient(4), 2);
42-
assert_eq!(euler_totient(5), 4);
43-
assert_eq!(euler_totient(6), 2);
44-
}
37+
fn test_euler_totient_comprehensive() {
38+
let test_cases = vec![
39+
// Edges cases
40+
(1, 1),
4541

46-
#[test]
47-
fn test_prime_numbers() {
48-
// For prime p, φ(p) = p - 1
49-
assert_eq!(euler_totient(7), 6);
50-
assert_eq!(euler_totient(11), 10);
51-
assert_eq!(euler_totient(13), 12);
52-
assert_eq!(euler_totient(17), 16);
42+
// small numbers
43+
(2, 1),(3, 2),(4, 2),
44+
(5, 4),(6, 2),
45+
46+
//Prime numbers (φ(p) = p - 1)
47+
(7, 6),(11, 10),(13, 12),
48+
(17, 16),(19,18),
49+
50+
// Prime powers (φ(p^k) = p^(k-1) * (p-1))
51+
(8, 4), // 2^3
52+
(9, 6), // 3^2
53+
(16, 8), // 2^4
54+
(25, 20), // 5^2
55+
(27, 18), // 3^3
56+
(32, 16), // 2^5
57+
58+
// Composite numbers
59+
(10, 4), // 2 * 5
60+
(12, 4), // 2^2 * 3
61+
(15, 8), // 3 * 5
62+
(18, 6), // 2 * 3^2
63+
(20, 8), // 2^2 * 5
64+
(30, 8), // 2 * 3 * 5
65+
// Large numbers
66+
(50, 20), // 2 * 5^2
67+
(100, 40),// 2^2 * 5^2
68+
(1000, 400) // 2^3 * 5^3
69+
];
70+
71+
for (input, expected) in test_cases {
72+
assert_eq!(
73+
euler_totient(input),
74+
expected,
75+
"φ({}) should be {}",
76+
input,
77+
expected
78+
);
79+
}
5380
}
5481

5582
#[test]
56-
fn test_prime_powers() {
57-
// For prime power p^k, φ(p^k) = p^(k-1) * (p-1)
58-
assert_eq!(euler_totient(9), 6); // 3^2, φ(9) = 3^1 * 2 = 6
59-
assert_eq!(euler_totient(25), 20); // 5^2, φ(25) = 5^1 * 4 = 20
60-
assert_eq!(euler_totient(8), 4); // 2^3, φ(8) = 2^2 * 1 = 4
83+
fn test_edge_cases() {
84+
let edge_cases = vec![
85+
(2, 1), // Smallest prime
86+
(4, 2), // Power of 2
87+
(6, 2), // 2 * 3 (two small primes)
88+
(35, 24), // 5 * 7 (two larger primes)
89+
(77, 60), // 7 * 11 (ensures the final `if num > 1` branch)
90+
(128, 64), // Large power of 2
91+
];
92+
93+
for (input, expected) in edge_cases {
94+
assert_eq!(euler_totient(input), expected);
95+
}
6196
}
6297

6398
#[test]
64-
fn test_larger_numbers() {
65-
assert_eq!(euler_totient(10), 4);
66-
assert_eq!(euler_totient(12), 4);
67-
assert_eq!(euler_totient(100), 40);
68-
assert_eq!(euler_totient(1000), 400);
99+
fn test_prime_property() {
100+
// For any prime p, φ(p) = p - 1
101+
let primes = vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
102+
for p in primes {
103+
assert_eq!(euler_totient(p), p - 1, "φ({}) should be {}", p, p - 1);
104+
}
69105
}
70106
}

0 commit comments

Comments
 (0)