use std::env;
use std::fs::File;
use std::io::Write;
use std::path::Path;
fn is_prime(n: u32) -> bool {
if n < 2 {
return false;
}
if n == 2 {
return true;
}
if n % 2 == 0 {
return false;
}
let sqrt_n = f64::from(n).sqrt() as u32;
for i in (3..=sqrt_n).step_by(2) {
if n % i == 0 {
return false;
}
}
true
}
fn generate_primes(count: usize) -> Vec<u32> {
let mut primes = Vec::with_capacity(count);
let mut candidate = 2u32;
while primes.len() < count {
if is_prime(candidate) {
primes.push(candidate);
}
candidate += if candidate == 2 { 1 } else { 2 };
}
primes
}
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("primes_data.rs");
let primes_1k = generate_primes(1_000);
let primes_10k = generate_primes(10_000);
let primes_100k = generate_primes(100_000);
let mut f = File::create(&dest_path).unwrap();
writeln!(f, "// Auto-generated prime number tables").unwrap();
writeln!(f, "// Generated by build.rs at compile time").unwrap();
writeln!(f).unwrap();
writeln!(f, "/// First 1,000 prime numbers (up to 7,919)").unwrap();
writeln!(f, "pub const PRIMES_1K: &[u32; {}] = &[", primes_1k.len()).unwrap();
for (i, &p) in primes_1k.iter().enumerate() {
if i % 10 == 0 {
write!(f, "\n ").unwrap();
}
write!(f, "{p:6}, ").unwrap();
}
writeln!(f, "\n];").unwrap();
writeln!(f).unwrap();
writeln!(f, "/// First 10,000 prime numbers (up to 104,729)").unwrap();
writeln!(f, "pub const PRIMES_10K: &[u32; {}] = &[", primes_10k.len()).unwrap();
for (i, &p) in primes_10k.iter().enumerate() {
if i % 10 == 0 {
write!(f, "\n ").unwrap();
}
write!(f, "{p:6}, ").unwrap();
}
writeln!(f, "\n];").unwrap();
writeln!(f).unwrap();
writeln!(f, "/// First 100,000 prime numbers (up to 1,299,709)").unwrap();
writeln!(
f,
"pub const PRIMES_100K: &[u32; {}] = &[",
primes_100k.len()
)
.unwrap();
for (i, &p) in primes_100k.iter().enumerate() {
if i % 10 == 0 {
write!(f, "\n ").unwrap();
}
write!(f, "{p}, ").unwrap();
}
writeln!(f, "\n];").unwrap();
println!(
"Generated {} primes (largest: {})",
primes_100k.len(),
primes_100k.last().unwrap()
);
println!(" 1K primes: up to {}", primes_1k.last().unwrap());
println!(" 10K primes: up to {}", primes_10k.last().unwrap());
println!("100K primes: up to {}", primes_100k.last().unwrap());
}