diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2023-04-21 09:42:07 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2023-04-25 10:45:12 +0400 |
| commit | 00856e19b215222176cf0cb9c83fd880846c2c0f (patch) | |
| tree | 690d241ba70a5220e68ad881f2e94a6a4f71e8f6 /sem2/src/program.rs | |
| parent | c2f76a4a4c67e2cc178eb9d91b5117233edf763d (diff) | |
Добавлена реализация алгоритма нахождения элемента g порядка q в конечном поле Z_p.
Diffstat (limited to 'sem2/src/program.rs')
| -rw-r--r-- | sem2/src/program.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/sem2/src/program.rs b/sem2/src/program.rs new file mode 100644 index 0000000..3a8dd26 --- /dev/null +++ b/sem2/src/program.rs @@ -0,0 +1,26 @@ +use crate::algo; +use crate::mpn::Number; + +pub fn find_of_order(p: &Number, q: &Number) -> Result<Number, String> { + if !algo::rabin_miller_test(&p, 10) { + return Err("Число p должно быть простым".to_string()); + } + if !algo::rabin_miller_test(&q, 10) { + return Err("Число q должно быть простым".to_string()); + } + let (pow, rem) = (p.clone() - 1.into()).div_rem(q.clone()).unwrap(); + if rem != 0.into() { + return Err( + "Числа p и q должны соотноситься как p = qs + 1".to_string() + ); + } + + loop { + let bound = p.clone() - 3.into(); + let a = bound.random_below() + 2.into(); + let g = a.pow_mod(&pow, p).unwrap(); + if g != 1.into() { + return Ok(g); + } + } +} |