add isprime module
This commit is contained in:
parent
95e176ea05
commit
fccdaf82d5
55
src/is_prime.rs
Normal file
55
src/is_prime.rs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
90
src/main.rs
90
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 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() {
|
fn main() {
|
||||||
|
/*
|
||||||
let mut buffer = String::new();
|
let mut buffer = String::new();
|
||||||
let stdin = io::stdin();
|
let stdin = io::stdin();
|
||||||
print!("please enter the number to check: ");
|
print!("please enter the number to check: ");
|
||||||
@ -67,4 +21,38 @@ fn main() {
|
|||||||
} else {
|
} else {
|
||||||
println!("\n{number} is not a prime");
|
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:?}");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user