summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: ca9fccaffadcceea6d77e919e5a05d911bf5645b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use eframe::egui;

fn main() {
    let options = eframe::NativeOptions::default();
    eframe::run_native(
        "Криптографические методы защиты информации",
        options,
        Box::new(|_cc| Box::new(MyApp::default())),
    );
}

struct MyApp {
    order: u32,
    lastorder: u32,
    elements: Vec<u32>,
    computing: bool,
    current: u32,
    error: bool,
}

impl Default for MyApp {
    fn default() -> Self {
        Self {
            order: 29,
            lastorder: 0,
            elements: Vec::new(),
            computing: false,
            current: 1,
            error: false,
        }
    }
}

fn modpow(x: u32, e: u32, m: u32) -> u32 {
    let mut pow = x;
    for _ in 1..e {
        pow = (pow * x) % m;
    }
    return pow;
}

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;
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        if self.lastorder != self.order {
            self.lastorder = 0;
            self.computing = false;
            self.error = false;
        }
        egui::Window::new("Задача №1").show(ctx, |ui| {
            ui.add(egui::Slider::new(&mut self.order, 1..=4294967295).text("порядок поля"));
            if ui.button("Рассчитать порождающие элементы").clicked() {
                self.elements.clear();
                if is_prime(self.order) {
                    self.computing = true;
                    self.current = 1;
                }
                else {
                    self.error = true;
                }
                self.lastorder = self.order;
            }
            if self.computing {
                ui.label("Вычисление...");
                let mut min = 0;
                for power in 1..self.order {
                    let pow = modpow(self.current, power, self.order);
                    if pow == 1 {
                        min = power;
                        break;
                    }
                }
                if min == self.order - 1 {
                    self.elements.push(self.current);
                }
                if self.current == self.order - 1 {
                    self.computing = false;
                }
                else {
                    self.current += 1;
                }
            }
            else if self.lastorder == self.order {
                if self.error {
                    ui.label("Можно указать только простое число!");
                }
                else {
                    ui.label(format!("Порождающие элементы поля F_{}: {:?}", self.order, self.elements));
                }
            }
        });
    }
}