@@ -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