@@ -29,74 +29,29 @@ pub fn euler_totient(n: u64) -> u64 {
2929mod 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