summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-10-24 11:11:02 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-10-24 11:11:02 +0400
commit71d2e1180666f190f9a81fad99f3056d44ac6c55 (patch)
tree5799b198c602c6b5ecdb50d1049d1dfca50064ab
parent261408786d9579f3c3cea87b3dc54de4b4218ec9 (diff)
Исправления в шестой лабе
-rw-r--r--src/lab6.rs51
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;
}