Fix ubig_pow calculation

master
trivernis 5 years ago
parent 215c33ffaf
commit b213c54b0a

@ -26,7 +26,7 @@ fn main() {
let mut iterations = 0; let mut iterations = 0;
loop { loop {
rec_timing.recv().unwrap(); rec_timing.recv().unwrap();
iterations += 10; iterations += 1000;
if last_sent.elapsed().as_secs() > 10 { if last_sent.elapsed().as_secs() > 10 {
println!("{:.2} iter/s", iterations as f64/last_sent.elapsed().as_secs() as f64); println!("{:.2} iter/s", iterations as f64/last_sent.elapsed().as_secs() as f64);
last_sent = Instant::now(); last_sent = Instant::now();
@ -45,6 +45,7 @@ fn main() {
/// the speed of the iterations /// the speed of the iterations
fn get_rotatable(tx: Sender<BigUint>, sen_time: Sender<bool>, start: u64, end: BigUint, step: u64) { fn get_rotatable(tx: Sender<BigUint>, sen_time: Sender<bool>, start: u64, end: BigUint, step: u64) {
let mut num: BigUint = start.to_biguint().unwrap(); let mut num: BigUint = start.to_biguint().unwrap();
let mut count = 0;
while num < end { while num < end {
if num.is_odd() || !(&num % 10 as u64).is_zero() { if num.is_odd() || !(&num % 10 as u64).is_zero() {
let mut digits = ubig_digits(num.clone()); let mut digits = ubig_digits(num.clone());
@ -53,12 +54,16 @@ fn get_rotatable(tx: Sender<BigUint>, sen_time: Sender<bool>, start: u64, end: B
&& (&num % *digits.first().unwrap() as u64).is_zero() { && (&num % *digits.first().unwrap() as u64).is_zero() {
digits.rotate_left(1); digits.rotate_left(1);
let num_rotated = ubig_from_digits(digits); let num_rotated = ubig_from_digits(digits);
if (num_rotated % &num).is_zero() { if (&num_rotated % &num).is_zero() {
let _ = tx.send(num.clone()); let _ = tx.send(num.clone());
} }
} }
} else { } else {
count += 1;
if count > 100 {
let _ = sen_time.send(true); let _ = sen_time.send(true);
count = 0;
}
} }
num += step; num += step;
} }
@ -90,8 +95,18 @@ fn ubig_from_digits(digits: Vec<u8>) -> BigUint {
/// returns ubig^exp /// returns ubig^exp
fn ubig_pow(base: u128, exp: usize) -> BigUint { fn ubig_pow(base: u128, exp: usize) -> BigUint {
let mut num = base.to_biguint().unwrap(); let mut num = base.to_biguint().unwrap();
for _ in 0..exp { if exp > 1 {
for _ in 1..exp {
num *= base; num *= base;
} }
} else if exp == 0 {
num = 1.to_biguint().unwrap();
}
num num
} }
fn print_vector(vec: &[u8]) {
for i in vec.iter() {
print!("{}", i)
}
}
Loading…
Cancel
Save