diff --git a/src/is_prime.rs b/src/is_prime.rs new file mode 100644 index 0000000..a55a099 --- /dev/null +++ b/src/is_prime.rs @@ -0,0 +1,55 @@ +pub mod is_prime { + use num_bigint::BigUint; + fn log_2(x: BigUint) -> u64 { + x.bits() - 1 + } + + pub fn is_prime(number: BigUint) -> bool { + if BigUint::from(1u8) == number { + return false; + } + if BigUint::from(4u8) > number { + return true; + } + + 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(1u8); + 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 number.clone()%i.clone() == zero { + // println!("{number} {i}"); + is_prime = false; + break; + } + if i == sqrtnum { + break; + } + } + return is_prime; + } + + // 4 12 194 + let mut last = BigUint::from(4u8); + + for _i in 2..a { + last = (last.pow(2)-two.clone())%number.clone(); + } + if last == BigUint::from(0u8) { + true + } else { + false + } + } +} + diff --git a/src/main.rs b/src/main.rs index 4d04765..0e84896 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,58 +1,12 @@ -use std::io::{self, Write}; +pub mod is_prime; + +use std::{time::SystemTime,sync::mpsc,thread}; use num_bigint::BigUint; +use crate::is_prime::is_prime::is_prime; -fn log_2(x: BigUint) -> u64 { - x.bits() - 1 -} - -fn is_prime(number: BigUint) -> bool { - if BigUint::from(1u8) == number { - return false; - } - if BigUint::from(4u8) > number { - return true; - } - - 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.pow(2)-two.clone())%number.clone(); - } - if last == BigUint::from(0u8) { - true - } else { - false - } -} fn main() { + /* let mut buffer = String::new(); let stdin = io::stdin(); print!("please enter the number to check: "); @@ -67,4 +21,38 @@ fn main() { } else { println!("\n{number} is not a prime"); } + */ + + let sys_time = SystemTime::now(); + + // let (tx, rx) = mpsc::channel(); + + // thread::spawn(move || { + // let val = String::from("hi"); + // tx.send(val).unwrap(); + // }); + // TODO: multithreading + + let mut number = BigUint::from(0u8); + let inc = BigUint::from(1u8); + let mut primes: Vec = vec![]; + loop { + number = number + inc.clone(); + if is_prime(number.clone()) { + primes.push(number.clone()); + if primes.len() >= 1_000_000 { + break; + } + } + } + + let new_sys_time = SystemTime::now(); + let difference = new_sys_time.duration_since(sys_time) + .expect("Clock may have gone backwards"); + + println!("{:?}", primes); + + println!("And that's time: {difference:?}"); + + }