add isprime module

This commit is contained in:
Mystikfluu 2023-02-23 22:48:10 +01:00
parent 95e176ea05
commit fccdaf82d5
2 changed files with 94 additions and 51 deletions

55
src/is_prime.rs Normal file
View File

@ -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
}
}
}

View File

@ -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<BigUint> = 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:?}");
}