summaryrefslogtreecommitdiff
path: root/sem2/src/mpn.rs
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2023-04-21 09:42:07 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2023-04-25 10:45:12 +0400
commit00856e19b215222176cf0cb9c83fd880846c2c0f (patch)
tree690d241ba70a5220e68ad881f2e94a6a4f71e8f6 /sem2/src/mpn.rs
parentc2f76a4a4c67e2cc178eb9d91b5117233edf763d (diff)
Добавлена реализация алгоритма нахождения элемента g порядка q в конечном поле Z_p.
Diffstat (limited to 'sem2/src/mpn.rs')
-rw-r--r--sem2/src/mpn.rs46
1 files changed, 44 insertions, 2 deletions
diff --git a/sem2/src/mpn.rs b/sem2/src/mpn.rs
index 91d3ff8..cb95e7f 100644
--- a/sem2/src/mpn.rs
+++ b/sem2/src/mpn.rs
@@ -1,11 +1,12 @@
+use fastrand;
use std::cmp::{max, Ordering};
use std::fmt;
use std::ops::{Add, Div, Index, IndexMut, Mul, Rem, Sub};
#[derive(Debug)]
pub struct Number {
- radix: u8,
- digits: Vec<u8>,
+ pub radix: u8,
+ pub digits: Vec<u8>,
}
impl Clone for Number {
@@ -81,6 +82,27 @@ impl Number {
return true;
}
+ pub fn random_below(&self) -> Number {
+ loop {
+ let num = Number::random_num(self.len(), self.radix);
+ if num < self.clone() {
+ return num;
+ }
+ }
+ }
+
+ pub fn random_num(size: usize, radix: u8) -> Number {
+ let mut digits = Vec::new();
+ for _ in 0..size - 1 {
+ digits.push(fastrand::u8(..radix));
+ }
+ digits.push(fastrand::u8(1..radix));
+
+ return Number::from_digits(&digits, radix).unwrap();
+ }
+}
+
+impl Number {
fn parse_digit(c: u8) -> Option<u8> {
if c >= 'a' as u8 {
Some(c - 'a' as u8 + 10_u8)
@@ -107,6 +129,26 @@ impl Number {
}
}
+impl From<u64> for Number {
+ fn from(mut num: u64) -> Self {
+ let radix = 10;
+ let mut digits = Vec::new();
+ while num != 0 {
+ let digit = num % radix;
+ num /= radix;
+ digits.push(digit as u8);
+ }
+ if digits.len() == 0 {
+ digits.push(0);
+ }
+ return Number {
+ radix: radix as u8,
+ digits,
+ }
+ .fix_leading_zeros();
+ }
+}
+
impl fmt::Display for Number {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for i in (0..self.digits.len()).rev() {