Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #![allow(dead_code)]
  2.  
  3. fn find_longest_recurrence(n: u64) -> u64 {
  4. (1..n).map(length_of_recurrence).max().unwrap_or(0)
  5. }
  6.  
  7. fn length_of_recurrence(n: u64) -> u64 {
  8. for i in 1.. {
  9. let p = 10_u64.pow(i);
  10. let gcd = gcd(p - 1, n);
  11. if !has_infinite_recurrence(n/gcd) {
  12. return i as u64;
  13. };
  14. }
  15.  
  16. 0
  17. }
  18.  
  19. fn gcd(mut a: u64, mut b: u64) -> u64 {
  20. while b != 0 {
  21. let tmp = b;
  22. b = a % b;
  23. a = tmp;
  24. }
  25.  
  26. a
  27. }
  28.  
  29. fn has_infinite_recurrence(n: u64) -> bool {
  30. primes_to_limit(n)
  31. .iter()
  32. .filter(|p| **p != 1 && **p != 2 && **p != 5)
  33. .find(|p| n % **p == 0)
  34. .is_some()
  35. }
  36.  
  37. fn unit_fraction(n: u64) -> f64 {
  38. 1.0 / n as f64
  39. }
  40.  
  41. fn primes_to_limit(n: u64) -> Vec<u64> {
  42. let limit = (n as f32).sqrt() as usize;
  43. let mut primes = vec![true; n as usize - 1];
  44.  
  45. for i in 2..limit + 1 {
  46. if primes[i - 2] {
  47. for j in (i * 2..=n as usize).step_by(i) {
  48. primes[j - 2] = false;
  49. }
  50. }
  51. }
  52.  
  53. primes.iter().enumerate()
  54. .filter(|(_, &is_prime)| is_prime)
  55. .map(|(prime_index, _)| prime_index as u64 + 2)
  56. .collect()
  57. }
  58.  
  59. #[test]
  60. fn determines_longest_recurrence() {
  61. assert_eq!(find_longest_recurrence(1_00), 42);
  62. }
  63.  
  64. #[test]
  65. fn determines_lengths_of_recurrences() {
  66. assert_eq!(length_of_recurrence(3), 1);
  67. assert_eq!(length_of_recurrence(6), 1);
  68. assert_eq!(length_of_recurrence(7), 6);
  69. assert_eq!(length_of_recurrence(9), 1);
  70. }
  71.  
  72. #[test]
  73. fn determines_if_unit_fraction_has_infinite_recurrence() {
  74. assert!(!has_infinite_recurrence(2));
  75. assert!(has_infinite_recurrence(3));
  76. assert!(!has_infinite_recurrence(4));
  77. assert!(!has_infinite_recurrence(5));
  78. assert!(has_infinite_recurrence(6));
  79. assert!(has_infinite_recurrence(7));
  80. assert!(!has_infinite_recurrence(8));
  81. assert!(has_infinite_recurrence(9));
  82. assert!(!has_infinite_recurrence(10));
  83. }
  84.  
  85. #[test]
  86. fn unit_fractions_are_calculated() {
  87. assert_eq!(unit_fraction(2), 0.5);
  88. assert_eq!(unit_fraction(4), 0.25);
  89. assert_eq!(unit_fraction(5), 0.2);
  90. }
  91.  
  92. #[test]
  93. fn primes_are_generated() {
  94. assert_eq!(primes_to_limit(10), [2, 3, 5, 7])
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement