Advertisement
Guest User

Untitled

a guest
Oct 24th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. use bit_vec::BitVec;
  2. use std::time::Instant; // 0.5.1
  3.  
  4. fn main() {
  5. const MAXNUM: usize = 2_000_000;
  6.  
  7. let now = Instant::now();
  8. let mut candidates = BitVec::from_elem(MAXNUM / 2, true);
  9. let mut curr_prime: usize = 3;
  10. let mut sum_primes: usize = 2;
  11.  
  12. candidates.set(0, false);
  13.  
  14. while (curr_prime as f64) < (MAXNUM as f64).sqrt() {
  15. sum_primes += curr_prime;
  16. ((curr_prime * curr_prime - 1) / 2..candidates.len())
  17. .step_by(curr_prime)
  18. .for_each(|x| candidates.set(x, false));
  19.  
  20. curr_prime += candidates
  21. .iter()
  22. .skip((curr_prime + 1) / 2)
  23. .position(|x| x)
  24. .unwrap()
  25. * 2
  26. + 2;
  27. //print!{"{} ", curr_prime};
  28. }
  29.  
  30. sum_primes += (curr_prime..)
  31. .step_by(2)
  32. .zip(candidates.iter().skip((curr_prime + 1) / 2 - 1))
  33. .filter_map(|(i, b)| if b { Some(i) } else { None })
  34. .sum::<usize>();
  35.  
  36. println!("{}", sum_primes);
  37. println!("{} ms", now.elapsed().as_millis());
  38.  
  39. let iter_now = Instant::now();
  40. let prime_iter = create_prime_iter(MAXNUM);
  41. let sum = prime_iter.sum::<usize>() + 2 + 3;
  42.  
  43. sum_primes = 2;
  44. sum_primes += (sum..)
  45. .step_by(2)
  46. .zip(candidates.iter().skip((curr_prime + 1) / 2 - 1))
  47. .filter_map(|(i, b)| if b { Some(i) } else { None })
  48. .sum::<usize>();
  49.  
  50. println!("{}", sum_primes);
  51. println!("{} ms", iter_now.elapsed().as_millis());
  52. }
  53.  
  54.  
  55. pub struct PrimeIter {
  56. curr_prime: usize,
  57. candidates: BitVec,
  58. maxnum : usize,
  59. }
  60.  
  61. impl Iterator for PrimeIter {
  62. type Item = usize;
  63.  
  64. fn next(&mut self) -> Option<usize> {
  65.  
  66. if (self.curr_prime as f64) > (self.maxnum as f64).sqrt() {
  67. return None;
  68. }
  69.  
  70. if (self.curr_prime as f64) < (self.maxnum as f64).sqrt() {
  71. ((self.curr_prime * self.curr_prime - 1) / 2..self.candidates.len())
  72. .step_by(self.curr_prime)
  73. .for_each(|x| self.candidates.set(x, false));
  74.  
  75. }
  76.  
  77. self.curr_prime += self.candidates
  78. .iter()
  79. .skip((self.curr_prime + 1) / 2)
  80. .position(|x| x)
  81. .unwrap()
  82. * 2
  83. + 2;
  84. Some(self.curr_prime)
  85. }
  86. }
  87.  
  88. pub fn create_prime_iter(maxnum: usize) -> PrimeIter {
  89. let mut newiter = PrimeIter {
  90. curr_prime: 3,
  91. candidates: BitVec::from_elem(maxnum / 2, true),
  92. maxnum: maxnum,
  93. };
  94.  
  95. newiter.candidates.set(0, false);
  96. newiter
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement