diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2022-10-24 11:11:02 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2022-10-24 11:11:02 +0400 |
| commit | 71d2e1180666f190f9a81fad99f3056d44ac6c55 (patch) | |
| tree | 5799b198c602c6b5ecdb50d1049d1dfca50064ab | |
| parent | 261408786d9579f3c3cea87b3dc54de4b4218ec9 (diff) | |
Исправления в шестой лабе
| -rw-r--r-- | src/lab6.rs | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/src/lab6.rs b/src/lab6.rs index cbdbe95..9061da7 100644 --- a/src/lab6.rs +++ b/src/lab6.rs @@ -1,10 +1,12 @@ use crate::lab_trait::Lab; use eframe::egui; use std::collections::HashSet; +use std::collections::HashMap; enum State<'a> { Clean, - Done, + Done1, + Done2, Error(&'a str), } @@ -12,6 +14,7 @@ pub struct Window<'a> { n: u32, q: u32, subgroup: Vec<u32>, + subgroups: HashMap<u32, Vec<u32>>, state: State<'a>, } @@ -21,6 +24,7 @@ impl<'a> Default for Window<'a> { n: 6, q: 3, subgroup: Vec::new(), + subgroups: HashMap::new(), state: State::Clean, } } @@ -31,33 +35,55 @@ impl<'a> Lab for Window<'a> { fn update(&mut self, ui: &mut egui::Ui) { ui.horizontal(|ui| { - ui.label("Число n: "); + ui.label("Порядок группы Z_n: "); if ui.add(egui::DragValue::new(&mut self.n).clamp_range(2..=u32::MAX)).changed() { self.state = State::Clean; self.subgroup.clear(); } }); ui.horizontal(|ui| { - ui.label("Число q: "); + ui.label("Порядок q подгруппы: "); if ui.add(egui::DragValue::new(&mut self.q).clamp_range(1..=self.n)).changed() { self.state = State::Clean; self.subgroup.clear(); } }); if ui.button("Вычислить подгруппу").clicked() { + self.subgroups.clear(); if self.n % self.q != 0 { self.state = State::Error("q не является делителем n"); } else { - self.subgroup = calculate_subgroup(self.n, self.q); - self.state = State::Done; + self.subgroups = calculate_subgroups(self.n); + for (_, sg) in &self.subgroups { + if sg.len() == self.q as usize { + self.subgroup = sg.clone(); + break; + } + } + self.state = State::Done1; + } + } + if ui.button("Вычислить все подгруппы").clicked() { + self.subgroups.clear(); + if self.n % self.q != 0 { + self.state = State::Error("q не является делителем n"); + } + else { + self.subgroups = calculate_subgroups(self.n); + self.state = State::Done2; } } match self.state { State::Clean => {}, - State::Done => { + State::Done1 => { ui.label(format!("Вычисленная подгруппа: {:?}", self.subgroup)); }, + State::Done2 => { + for (gen, set) in self.subgroups.iter() { + ui.label(format!("Подгруппа {:?} с генератором {}", set, gen)); + } + }, State::Error(msg) => { ui.label(msg); }, } } @@ -71,7 +97,8 @@ fn powmod(x: u32, n: u32, m: u32) -> u32 { return res; } -fn calculate_subgroup(n: u32, q: u32) -> Vec<u32> { +fn calculate_subgroups(n: u32) -> HashMap<u32, Vec<u32>> { + let mut subgroups = HashMap::new(); for i in 0..n { let mut group = HashSet::new(); group.insert(i); @@ -79,11 +106,9 @@ fn calculate_subgroup(n: u32, q: u32) -> Vec<u32> { let power = powmod(i, p, n); group.insert(power); } - if group.len() == q as usize { - let mut vec = group.drain().collect::<Vec<u32>>(); - vec.sort(); - return vec; - } + let mut vec = group.drain().collect::<Vec<u32>>(); + vec.sort(); + subgroups.insert(i as u32, vec); } - return Vec::new(); + return subgroups; } |