summaryrefslogtreecommitdiff
path: root/sem2/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sem2/src/main.rs')
-rw-r--r--sem2/src/main.rs111
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());
}