summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-10-10 00:39:06 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-10-10 00:39:06 +0400
commit261408786d9579f3c3cea87b3dc54de4b4218ec9 (patch)
tree17dbc07cc7d727acdc81ce69bd859c3906cb9b3b
parentb689ab47f2260345a03130a2a2e8d9dda0ca25ef (diff)
Добавлена шестая лаба
-rw-r--r--src/lab6.rs89
-rw-r--r--src/main.rs2
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()),
],
}
}