summaryrefslogtreecommitdiff
path: root/sem2/src/program.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sem2/src/program.rs')
-rw-r--r--sem2/src/program.rs26
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);
+ }
+ }
+}