use crate::utils::powmod; use crate::window_state::WindowState; use eframe::egui; pub struct Window { e: u64, k: u64, phi: u64, closed: Option, error: Option, } impl Default for Window { fn default() -> Self { Self { e: 0, k: 0, phi: 0, closed: None, error: None, } } } impl Window { fn compute(&mut self) { self.closed = Some(powmod(self.e, self.k - 1, self.phi)); } } impl WindowState for Window { fn get_name(&self) -> &str { "Вычисление секретной экспоненты" } fn update(&mut self, ui: &mut egui::Ui) { ui.label("Открытая экспонента e:"); let resp1 = ui.add(egui::DragValue::new(&mut self.e)); ui.label("Модуль phi(e):"); let resp2 = ui.add(egui::DragValue::new(&mut self.phi).clamp_range(1..=u64::MAX)); ui.label("Порядок k элемента e по модулю phi(n):"); let resp3 = ui.add(egui::DragValue::new(&mut self.k).clamp_range(1..=u64::MAX)); if resp1.changed() || resp2.changed() || resp3.changed() { self.closed = None; self.error = None; } if ui.button("Вычислить секретную экспоненту d").clicked() { self.compute(); } if let Some(d) = &self.closed { let mut tmp = d.to_string(); ui.label("Секретная экспонента d:"); ui.add_enabled(false, egui::TextEdit::singleline(&mut tmp)); } if let Some(err) = &self.error { ui.label(err); } } }