diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2022-10-10 00:39:06 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2022-10-10 00:39:06 +0400 |
| commit | 261408786d9579f3c3cea87b3dc54de4b4218ec9 (patch) | |
| tree | 17dbc07cc7d727acdc81ce69bd859c3906cb9b3b | |
| parent | b689ab47f2260345a03130a2a2e8d9dda0ca25ef (diff) | |
Добавлена шестая лаба
| -rw-r--r-- | src/lab6.rs | 89 | ||||
| -rw-r--r-- | src/main.rs | 2 |
2 files changed, 91 insertions, 0 deletions
diff --git a/src/lab6.rs b/src/lab6.rs new file mode 100644 index 0000000..cbdbe95 --- /dev/null +++ b/src/lab6.rs @@ -0,0 +1,89 @@ +use crate::lab_trait::Lab; +use eframe::egui; +use std::collections::HashSet; + +enum State<'a> { + Clean, + Done, + Error(&'a str), +} + +pub struct Window<'a> { + n: u32, + q: u32, + subgroup: Vec<u32>, + state: State<'a>, +} + +impl<'a> Default for Window<'a> { + fn default() -> Self { + Self { + n: 6, + q: 3, + subgroup: Vec::new(), + state: State::Clean, + } + } +} + +impl<'a> Lab for Window<'a> { + fn get_name(&self) -> &str { "Задача №6" } + + fn update(&mut self, ui: &mut egui::Ui) { + ui.horizontal(|ui| { + ui.label("Число 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: "); + 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() { + 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; + } + } + match self.state { + State::Clean => {}, + State::Done => { + ui.label(format!("Вычисленная подгруппа: {:?}", self.subgroup)); + }, + State::Error(msg) => { ui.label(msg); }, + } + } +} + +fn powmod(x: u32, n: u32, m: u32) -> u32 { + let mut res = 0; + for _ in 0..n { + res = (res + x) % m; + } + return res; +} + +fn calculate_subgroup(n: u32, q: u32) -> Vec<u32> { + for i in 0..n { + let mut group = HashSet::new(); + group.insert(i); + for p in 2..=n { + 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; + } + } + return Vec::new(); +} diff --git a/src/main.rs b/src/main.rs index 832805f..9d6fafe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ mod lab_trait; mod lab1; mod lab3; +mod lab6; use lab_trait::Lab; use eframe::egui; @@ -24,6 +25,7 @@ impl Default for Application { labs: vec![ Box::new(lab1::Window::default()), Box::new(lab3::Window::default()), + Box::new(lab6::Window::default()), ], } } |