Skip to content

Commit 51651bf

Browse files
triuyenvil02
andauthored
Update src/number_theory/euler_totient.rs
Co-authored-by: Piotr Idzik <[email protected]>
1 parent 5b4453e commit 51651bf

File tree

1 file changed

+22
-67
lines changed

1 file changed

+22
-67
lines changed

src/number_theory/euler_totient.rs

Lines changed: 22 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -29,74 +29,29 @@ pub fn euler_totient(n: u64) -> u64 {
2929
mod tests {
3030
use super::*;
3131

32-
#[test]
33-
fn test_euler_totient_comprehensive() {
34-
let test_cases = vec![
35-
// Edges cases
36-
(1, 1),
37-
// small numbers
38-
(2, 1),
39-
(3, 2),
40-
(4, 2),
41-
(5, 4),
42-
(6, 2),
43-
//Prime numbers (φ(p) = p - 1)
44-
(7, 6),
45-
(11, 10),
46-
(13, 12),
47-
(17, 16),
48-
(19, 18),
49-
// Prime powers (φ(p^k) = p^(k-1) * (p-1))
50-
(8, 4), // 2^3
51-
(9, 6), // 3^2
52-
(16, 8), // 2^4
53-
(25, 20), // 5^2
54-
(27, 18), // 3^3
55-
(32, 16), // 2^5
56-
// Composite numbers
57-
(10, 4), // 2 * 5
58-
(12, 4), // 2^2 * 3
59-
(15, 8), // 3 * 5
60-
(18, 6), // 2 * 3^2
61-
(20, 8), // 2^2 * 5
62-
(30, 8), // 2 * 3 * 5
63-
// Large numbers
64-
(50, 20), // 2 * 5^2
65-
(100, 40), // 2^2 * 5^2
66-
(1000, 400), // 2^3 * 5^3
67-
];
68-
69-
for (input, expected) in test_cases {
70-
assert_eq!(
71-
euler_totient(input),
72-
expected,
73-
"φ({input}) should be {expected}"
74-
);
75-
}
32+
macro_rules! test_euler_totient {
33+
($($name:ident: $test_case:expr,)*) => {
34+
$(
35+
#[test]
36+
fn $name() {
37+
let (input, expected) = $test_case;
38+
assert_eq!(euler_totient(input), expected)
39+
}
40+
)*
41+
};
7642
}
7743

78-
#[test]
79-
fn test_edge_cases() {
80-
let edge_cases = vec![
81-
(2, 1), // Smallest prime
82-
(4, 2), // Power of 2
83-
(6, 2), // 2 * 3 (two small primes)
84-
(35, 24), // 5 * 7 (two larger primes)
85-
(77, 60), // 7 * 11 (ensures the final `if num > 1` branch)
86-
(128, 64), // Large power of 2
87-
];
88-
89-
for (input, expected) in edge_cases {
90-
assert_eq!(euler_totient(input), expected);
91-
}
92-
}
93-
94-
#[test]
95-
fn test_prime_property() {
96-
// For any prime p, φ(p) = p - 1
97-
let primes = vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
98-
for p in primes {
99-
assert_eq!(euler_totient(p), p - 1, "φ({p}) should be {}", p - 1);
100-
}
44+
test_euler_totient! {
45+
prime_2: (2, 1),
46+
prime_3: (3, 2),
47+
prime_5: (5, 4),
48+
prime_7: (7, 6),
49+
// ...
50+
composite_10: (10, 4), // 2 * 5
51+
composite_15: (15, 8), // 3 * 5
52+
// ...
53+
prime_power_2_to_3: (8, 4),
54+
prime_power_3_to_2: (9, 6),
55+
// ...
10156
}
10257
}

0 commit comments

Comments
 (0)