use inquire::Text; use rug::{Complete, Integer}; use std::time::Instant; mod mpn; fn main() { let radix = match Text::new("Введите основание системы счисления:").prompt() { Ok(text) => text, Err(_) => return, }; let radix = match radix.parse::() { Ok(number) => { if number > 36 || number < 2 { println!( "Система счисления должна принадлежать отрезку [2,36]" ); return; } number } Err(_) => { println!("Основание должно быть десятичным числом"); return; } }; let a_text = match Text::new("Введите число:").prompt() { Ok(text) => text, Err(_) => return, }; let p_text = match Text::new("Введите степень:").prompt() { Ok(text) => text, Err(_) => return, }; let m_text = match Text::new("Введите модуль:").prompt() { Ok(text) => text, Err(_) => return, }; let a = match mpn::Number::parse(&a_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); return; } }; let p = match mpn::Number::parse(&p_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); return; } }; let m = match mpn::Number::parse(&m_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); return; } }; let a_rug = match Integer::parse_radix(a_text, radix) { Ok(parsed) => parsed.complete(), Err(_) => { println!("Не удалось считать число"); return; } }; let p_rug = match Integer::parse_radix(p_text, radix) { Ok(parsed) => parsed.complete(), Err(_) => { println!("Не удалось считать число"); return; } }; let m_rug = match Integer::parse_radix(m_text, radix) { Ok(parsed) => parsed.complete(), Err(_) => { println!("Не удалось считать число"); return; } }; let mpn_start = Instant::now(); let mpn_res = a.pow_mod(&p, &m); let mpn_elapsed = mpn_start.elapsed(); let rug_start = Instant::now(); if let Ok(_) = &mpn_res { let _rug_res = a_rug.pow_mod(&p_rug, &m_rug); println!("{_rug_res:?}"); } let rug_elapsed = rug_start.elapsed(); match mpn_res { Ok(res) => { println!("Результат: {res}"); } Err(msg) => { println!("{msg}"); return; } } println!( "Операция произведения выполнена в mpn за {} наносекунд", mpn_elapsed.as_nanos() ); println!( "Операция произведения выполнена в rug за {} наносекунд", rug_elapsed.as_nanos() ); }