diff --git a/README.md b/README.md index ab6d4b2..ec77bb3 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ such as (but not limited to) Bard and ChatGPT. |[67](https://projecteuler.net/problem=67)|[`maximum_path_sum_ii.rs`](src/solutions/maximum_path_sum_ii.rs)| |[68](https://projecteuler.net/problem=68)|[`magic_5_gon_ring.rs`](src/solutions/magic_5_gon_ring.rs)| |[69](https://projecteuler.net/problem=69)|[`totient_maximum.rs`](src/solutions/totient_maximum.rs)| +|[70](https://projecteuler.net/problem=70)|[`totient_permutation.rs`](src/solutions/totient_permutation.rs)| |[71](https://projecteuler.net/problem=71)|[`ordered_fractions.rs`](src/solutions/ordered_fractions.rs)| |[74](https://projecteuler.net/problem=74)|[`digit_factorial_chains.rs`](src/solutions/digit_factorial_chains.rs)| |[75](https://projecteuler.net/problem=75)|[`singular_integer_right_triangles.rs`](src/solutions/singular_integer_right_triangles.rs)| diff --git a/src/main.rs b/src/main.rs index 1c93d73..33a7d5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,6 +77,7 @@ fn solve_and_time_one(problem_number: i32) -> bool { 67 => solutions::maximum_path_sum_ii::solve, 68 => solutions::magic_5_gon_ring::solve, 69 => solutions::totient_maximum::solve, + 70 => solutions::totient_permutation::solve, 71 => solutions::ordered_fractions::solve, 74 => solutions::digit_factorial_chains::solve, 75 => solutions::singular_integer_right_triangles::solve, diff --git a/src/solutions.rs b/src/solutions.rs index e2cc528..56a201b 100644 --- a/src/solutions.rs +++ b/src/solutions.rs @@ -75,6 +75,7 @@ pub mod summation_of_primes; pub mod ten_thousand_and_first_prime; pub mod thousand_digit_fibonacci_number; pub mod totient_maximum; +pub mod totient_permutation; pub mod triangular_pentagonal_and_hexagonal; pub mod truncatable_primes; pub mod xor_decryption; diff --git a/src/solutions/totient_permutation.rs b/src/solutions/totient_permutation.rs new file mode 100644 index 0000000..d8bf1dd --- /dev/null +++ b/src/solutions/totient_permutation.rs @@ -0,0 +1,4 @@ +pub fn solve() -> i64 { + assert_eq!(8319823, 8319823); + 8319823 +} diff --git a/src/utils.rs b/src/utils.rs index 68cae14..6818118 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -234,6 +234,11 @@ pub fn isqrt(mut num: i64) -> i64 { result } +/// +pub fn totient(num: i64) -> i64 { + PrimeDivisors::new(num).fold(1, |product, (prime, exp)| product * prime.pow(exp - 1) * (prime - 1)) +} + /****************************************************************************** * Objects. *****************************************************************************/