#primesmatter ;)
This commit is contained in:
parent
4d3d09ba97
commit
95e176ea05
@ -6,4 +6,11 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
num-bigint = "0.4.3"
|
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
|
49
src/main.rs
49
src/main.rs
@ -6,16 +6,44 @@ fn log_2(x: BigUint) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn is_prime(number: BigUint) -> bool {
|
fn is_prime(number: BigUint) -> bool {
|
||||||
let a = log_2(number.clone()+1u8);
|
if BigUint::from(1u8) == number {
|
||||||
if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != number {
|
return false;
|
||||||
eprintln!("only supports numbers of type (2^x)-1");
|
}
|
||||||
std::process::exit(1);
|
if BigUint::from(4u8) > number {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut last = BigUint::from(4u8)%number.clone();
|
|
||||||
let two = BigUint::from(2u8);
|
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 {
|
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) {
|
if last == BigUint::from(0u8) {
|
||||||
true
|
true
|
||||||
@ -32,14 +60,11 @@ fn main() {
|
|||||||
stdin.read_line(&mut buffer).expect("could not read from stdin");
|
stdin.read_line(&mut buffer).expect("could not read from stdin");
|
||||||
buffer = buffer.trim().to_owned();
|
buffer = buffer.trim().to_owned();
|
||||||
|
|
||||||
let number = BigUint::parse_bytes(&buffer.as_bytes(), 10).expect("expected number");
|
let number = BigUint::parse_bytes(&buffer.as_bytes(), 10).expect("expected positive number");
|
||||||
|
|
||||||
// number = 2^x - 1
|
|
||||||
// x = log2(number + 1)
|
|
||||||
|
|
||||||
if is_prime(number.clone()) {
|
if is_prime(number.clone()) {
|
||||||
println!("{number} is a prime");
|
println!("\n{number} is a prime");
|
||||||
} else {
|
} else {
|
||||||
println!("{number} is not a prime");
|
println!("\n{number} is not a prime");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user