use crate::algo; use crate::mpn::Number; #[allow(dead_code)] pub fn find_of_order(p: &Number, q: &Number) -> Result { 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); } } }