Code:```rust
fn prime_generator_2(n: usize) {
let mut primes: Vec<u32> = vec![2, 3];
let mut prime_candidate: u32 = 3;
let mut num_checks: u32 = 0;
'candidate_iterator: loop {
prime_candidate += 2;
let sqrt_prime_candidate = (prime_candidate as f32).sqrt() as u32;
for divider in &primes {
num_checks += 1; // not essential, just for benchmarks
if prime_candidate % divider == 0 { continue 'candidate_iterator; }
if divider > &sqrt_prime_candidate {
primes.push(prime_candidate);
break;
}
}
if primes.len() >= n { break; }
}
println!("Last prime: {}", primes[primes.len() - 1]);
println!("Primes generated: {}", primes.len());
println!("Number of checks (modulus operations): {}", num_checks);
}
fn prime_generator_4(n: usize) {
let mut primes: Vec<u32> = vec![2, 3];
let mut limiter: usize = 1;
let mut prev_threshold: u32 = 5;
let mut curr_threshold: u32 = 9;
let mut num_checks: u32 = 0;
'threshold_iter: loop {
'candidate_iter: for prime_candidate in (prev_threshold..curr_threshold).step_by(2) {
for i in 1..limiter {
num_checks += 1; // not essential, just for benchmarks
if (prime_candidate % primes[i]) == 0 { continue 'candidate_iter; }
}
primes.push(prime_candidate);
if primes.len() >= n { break 'threshold_iter; }
}
limiter += 1;
prev_threshold = curr_threshold + 2;
curr_threshold = primes[limiter].pow(2);
}
println!("Last prime: {}", primes[primes.len() - 1]);
println!("Primes generated: {}", primes.len());
println!("Number of checks (modulus operations): {}", num_checks);
}