summaryrefslogtreecommitdiff
path: root/src/lab1.rs
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-11-13 11:40:34 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-11-13 11:40:34 +0400
commit9bbc7b8c31458fbf8c639794531e3d324004d8d5 (patch)
tree7d6128c58518c78da03652e9f4e974e6de5a927f /src/lab1.rs
parent14fefa99fae1433de08812558c07a0f81c40ab04 (diff)
Реализации лабораторных перенесены во отдельную папку
Diffstat (limited to 'src/lab1.rs')
-rw-r--r--src/lab1.rs134
1 files changed, 0 insertions, 134 deletions
diff --git a/src/lab1.rs b/src/lab1.rs
deleted file mode 100644
index b442199..0000000
--- a/src/lab1.rs
+++ /dev/null
@@ -1,134 +0,0 @@
-use crate::lab_trait::Lab;
-use eframe::egui;
-
-pub struct Window {
- order: u32,
- element: u32,
- element_check: Option<bool>,
- primitive_roots: Vec<u32>,
- state: State,
-}
-
-impl Window {
- fn clear_state(&mut self) {
- self.element_check = None;
- self.state = State::Idle;
- }
-}
-
-impl Default for Window {
- fn default() -> Self {
- Self {
- order: 29,
- element: 2,
- element_check: None,
- primitive_roots: Vec::new(),
- state: State::Idle,
- }
- }
-}
-
-impl Lab for Window {
- fn get_name(&self) -> &str { "Задача №1" }
-
- fn update(&mut self, ui: &mut egui::Ui) {
- ui.horizontal(|ui| {
- ui.label("Порядок поля: ");
- if ui
- .add(egui::DragValue::new(&mut self.order).clamp_range(2..=u32::MAX))
- .changed()
- {
- self.clear_state();
- }
- });
- ui.horizontal(|ui| {
- ui.label("Проверяемый элемент: ");
- if ui
- .add(egui::DragValue::new(&mut self.element).clamp_range(1..=self.order - 1))
- .changed()
- {
- self.clear_state();
- }
- });
-
- if ui.button("Проверить элемент").clicked() {
- let min = min_order(self.element, self.order);
- self.element_check = Some(min == self.order - 1);
- }
- match self.element_check {
- Some(true) => {
- ui.label("Элемент является порождающим элементом");
- }
- Some(false) => {
- ui.label("Элемент не является порождающим элементом");
- }
- None => {}
- }
-
- if ui.button("Рассчитать порождающие элементы").clicked() {
- self.primitive_roots.clear();
- self.state = if is_prime(self.order) {
- State::Running(1)
- } else {
- State::Error
- }
- }
- match self.state {
- State::Running(current) => {
- ui.label("Вычисление...");
- let min = min_order(current, self.order);
- if min == self.order - 1 {
- self.primitive_roots.push(current);
- }
- self.state = if current == self.order - 1 {
- State::Done
- } else {
- State::Running(current + 1)
- }
- }
- State::Done => {
- ui.label(format!(
- "Порождающие элементы поля F_{}: {:?}",
- self.order, self.primitive_roots
- ));
- }
- State::Idle => {}
- State::Error => {
- ui.label("Можно указать только простое число!");
- }
- }
- }
-}
-
-enum State {
- Idle,
- Running(u32),
- Done,
- Error,
-}
-
-fn min_order(x: u32, order: u32) -> u32 {
- let mut min = 0;
- let mut pow = x;
- for power in 1..order {
- if pow == 1 {
- min = power;
- break;
- }
- pow = (pow * x) % order;
- }
- return min;
-}
-
-fn is_prime(x: u32) -> bool {
- if x <= 1 {
- return false;
- }
- for i in 2..x / 2 + 1 {
- if x % i == 0 {
- return false;
- }
- }
- return true;
-}
-