Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. use std::cmp::min;
  2.  
  3. fn basicSieve(bound: usize) -> Vec<usize> {
  4. let mut isPrime = vec![true; bound];
  5. let top = ((bound as f64).sqrt().ceil() as usize) + 1;
  6. assert!(top < isPrime.len());
  7. for i in 2..top {
  8. if isPrime[i] {
  9. let mut j = i*i;
  10. while j < bound {
  11. isPrime[j] = false;
  12. j += i;
  13. }
  14. }
  15. }
  16. let mut result = Vec::with_capacity(bound);
  17. for i in 2..bound {
  18. if isPrime[i] {
  19. result.push(i);
  20. }
  21. }
  22. debug_assert!(result.len() < bound);
  23. result.shrink_to_fit();
  24. result
  25. }
  26.  
  27. fn segmentedSieve(bound: usize) -> Vec<usize> {
  28. let fbound = bound as f64;
  29. // Approximitely x/(log x - 1) primes below x
  30. let estimatedPrimes = (fbound/(fbound.log10() - 1.0)) as usize;
  31. let mut result = Vec::with_capacity(estimatedPrimes);
  32. let segmentSize = fbound.sqrt().ceil() as usize;
  33. let mut isPrime = vec![true; segmentSize];
  34. // Seed the initial primes
  35. let primes = basicSieve(segmentSize);
  36. result.extend_from_slice(&primes);
  37. let mut start = segmentSize;
  38. while start < bound {
  39. for i in 0..segmentSize {
  40. isPrime[i] = true;
  41. }
  42. let end = min(bound + 1, start + segmentSize);
  43. let size = end - start;
  44. assert!(size <= segmentSize);
  45. for prime in &primes {
  46. let lastPrime = (((start as f64) / (*prime as f64)).ceil() as usize) * prime;
  47. debug_assert!(lastPrime >= start);
  48. let mut i = lastPrime - start;
  49. while i < size {
  50. isPrime[i] = false;
  51. i += *prime;
  52. }
  53. }
  54. for i in 0..size {
  55. if isPrime[i] {
  56. result.push(start + i);
  57. }
  58. }
  59. start += segmentSize;
  60. }
  61. result
  62. }
  63.  
  64. fn main() {
  65. println!("basicSieve(20): {:?}", basicSieve(20));
  66. println!("segmentedSieve(500): {:?}", segmentedSieve(500));
  67. assert_eq!(basicSieve(500), segmentedSieve(500));
  68. println!("Huzzah, len(segmentedSieve(500)): {}", segmentedSieve(500).len());
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement