Various prime number implementations, including a buggy one
| // https://www.reddit.com/r/rust/comments/a0g730/new_to_rust_discouraged_by_slowrunning_code/ | |
| fn nth_prime_bad(initial: u64) -> u64 { | |
| let mut prime_count = 0; | |
| let mut curr = 2; | |
| let mut prime = None; | |
| while prime_count < initial { | |
| let mut denom = 2; | |
| while denom < curr { | |
| if curr % denom == 0 { | |
| curr = curr + 1; | |
| continue; | |
| } | |
| denom += 1; | |
| } | |
| prime = Some(curr); | |
| curr = curr + 1; | |
| prime_count = prime_count + 1; | |
| } | |
| return prime.unwrap(); | |
| } | |
| fn nth_prime(initial: u64) -> u64 { | |
| let mut prime_count = 0; | |
| let mut curr = 2; | |
| let mut prime = None; | |
| 'next_candidate: while prime_count < initial { | |
| let mut denom = 2; | |
| while denom < curr { | |
| if curr % denom == 0 { | |
| curr = curr + 1; | |
| continue 'next_candidate; | |
| } | |
| denom += 1; | |
| } | |
| prime = Some(curr); | |
| curr = curr + 1; | |
| prime_count = prime_count + 1; | |
| } | |
| return prime.unwrap(); | |
| } | |
| fn nth_prime_clean(n: u64) -> u64 { | |
| fn is_prime(p: u64) -> bool { | |
| for d in 2..p { | |
| if p % d == 0 { | |
| return false; | |
| } | |
| } | |
| true | |
| } | |
| let mut count = 0; | |
| for candidate in 2.. { | |
| if is_prime(candidate) { | |
| count += 1; | |
| if count == n { | |
| return candidate; | |
| } | |
| } | |
| } | |
| panic!("ran out of candidates"); | |
| } | |
| fn nth_prime_functional(n: u64) -> u64 { | |
| let is_prime = |&c: &u64| (2..c).all(|d| c % d != 0); | |
| (2..).filter(is_prime).nth((n - 1) as usize) | |
| .expect("ran out of candidates") | |
| } | |
| const N: u64 = 100; | |
| fn main() { | |
| println!("{}", nth_prime_bad(N)); | |
| println!("{}", nth_prime(N)); | |
| println!("{}", nth_prime_clean(N)); | |
| println!("{}", nth_prime_functional(N)); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment