From 95e176ea05e7b162b4ccf5f9ff7b3f4517d5cf39 Mon Sep 17 00:00:00 2001 From: Mystikfluu Date: Wed, 22 Feb 2023 01:32:41 +0100 Subject: [PATCH] #primesmatter ;) --- Cargo.toml | 9 ++++++++- src/main.rs | 49 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3571acf..18e347b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,11 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -num-bigint = "0.4.3" \ No newline at end of file +num-bigint = { default-features = false, version = "0.4.3" } + +[profile.release] +opt-level = 'z' # Optimize for size +lto = true # Enable link-time optimization +codegen-units = 1 # Reduce number of codegen units to increase optimizations +panic = 'abort' # Abort on panic +# strip = true # Strip symbols from binary; remove pdb \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6393079..4d04765 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,16 +6,44 @@ fn log_2(x: BigUint) -> u64 { } fn is_prime(number: BigUint) -> bool { - let a = log_2(number.clone()+1u8); - if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != number { - eprintln!("only supports numbers of type (2^x)-1"); - std::process::exit(1); + if BigUint::from(1u8) == number { + return false; + } + if BigUint::from(4u8) > number { + return true; } - let mut last = BigUint::from(4u8)%number.clone(); let two = BigUint::from(2u8); + + // number = 2^a - 1 + // a = log2(number + 1) + let a = log_2(number.clone()+1u8); + if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != number { + //eprintln!("only supports numbers of type (2^x)-1"); + let mut i = BigUint::from(0u8); + let one = BigUint::from(1u8); + let zero = BigUint::from(0u8); + + let sqrtnum = number.sqrt()+one.clone(); + let mut is_prime = true; + loop { + i = i + one.clone(); + if i == sqrtnum { + break; + } + if sqrtnum.clone()%i.clone() == zero { + is_prime = false; + break; + } + } + return is_prime; + } + + // 4 12 194 + let mut last = BigUint::from(4u8); + for _i in 2..a { - last = (last.clone()*last-two.clone())%number.clone(); + last = (last.pow(2)-two.clone())%number.clone(); } if last == BigUint::from(0u8) { true @@ -32,14 +60,11 @@ fn main() { stdin.read_line(&mut buffer).expect("could not read from stdin"); buffer = buffer.trim().to_owned(); - let number = BigUint::parse_bytes(&buffer.as_bytes(), 10).expect("expected number"); - - // number = 2^x - 1 - // x = log2(number + 1) + let number = BigUint::parse_bytes(&buffer.as_bytes(), 10).expect("expected positive number"); if is_prime(number.clone()) { - println!("{number} is a prime"); + println!("\n{number} is a prime"); } else { - println!("{number} is not a prime"); + println!("\n{number} is not a prime"); } }