diff options
Diffstat (limited to 'sem2/src/main.rs')
| -rw-r--r-- | sem2/src/main.rs | 111 |
1 files changed, 26 insertions, 85 deletions
diff --git a/sem2/src/main.rs b/sem2/src/main.rs index 10e7871..adf47b8 100644 --- a/sem2/src/main.rs +++ b/sem2/src/main.rs @@ -1,58 +1,18 @@ +use fastrand; use inquire::Text; -use rug::{Complete, Integer}; use std::time::Instant; +mod algo; mod mpn; +mod program; fn main() { - let radix = match Text::new("Введите основание системы счисления:").prompt() - { - Ok(text) => text, - Err(_) => return, - }; - let radix = match radix.parse::<i32>() { - Ok(number) => { - if number > 36 || number < 2 { - println!( - "Система счисления должна принадлежать отрезку [2,36]" - ); - return; - } - number - } - Err(_) => { - println!("Основание должно быть десятичным числом"); - return; - } - }; + let radix = 10; - let a_text = match Text::new("Введите число:").prompt() { - Ok(text) => text, - Err(_) => return, - }; - let p_text = match Text::new("Введите степень:").prompt() { + let q_text = match Text::new("Введите число q:").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) { + let q = match mpn::Number::parse(&q_text, radix as u8) { Ok(number) => number, Err(what) => { println!("{what}"); @@ -60,41 +20,29 @@ fn main() { } }; - 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(); + if !algo::rabin_miller_test(&q, 10) { + println!("Число q должно быть простым"); + return; + } - let rug_start = Instant::now(); - if let Ok(_) = &mpn_res { - let _rug_res = a_rug.pow_mod(&p_rug, &m_rug); + let mut p; + loop { + let s = mpn::Number::random_num(fastrand::usize(1..=30), radix); + println!("s = {s}"); + p = q.clone() * s + 1.into(); + if algo::rabin_miller_test(&p, 10) { + break; + } } - let rug_elapsed = rug_start.elapsed(); + println!("Сгенерированное простое p: {p}"); + + let t_start = Instant::now(); + let g = program::find_of_order(&p, &q); + let t_elapsed = t_start.elapsed(); - match mpn_res { + match g { Ok(res) => { - println!("Результат: {res}"); + println!("Найденный элемент g: {res}"); } Err(msg) => { println!("{msg}"); @@ -102,12 +50,5 @@ fn main() { } } - println!( - "Операция произведения выполнена в mpn за {} наносекунд", - mpn_elapsed.as_nanos() - ); - println!( - "Операция произведения выполнена в rug за {} наносекунд", - rug_elapsed.as_nanos() - ); + println!("Операция выполнена за {} наносекунд", t_elapsed.as_nanos()); } |