From 261408786d9579f3c3cea87b3dc54de4b4218ec9 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Mon, 10 Oct 2022 00:39:06 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=88=D0=B5=D1=81=D1=82=D0=B0=D1=8F=20=D0=BB=D0=B0=D0=B1?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lab6.rs | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/lab6.rs (limited to 'src/lab6.rs') 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, + 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 { + 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.sort(); + return vec; + } + } + return Vec::new(); +} -- cgit v1.2.3