opis/integer/
division.rs

1
2use crate::{Integer, Bit};
3use std::error::Error;
4use std::ops::Div;
5use super::divider;
6
7impl Div for Integer {
8    type Output = Result<Self, Box<dyn Error>>;
9    fn div(self, b: Self) -> Result<Self, Box<dyn Error>> {
10        &self / &b
11    }
12}
13
14impl Div<&u8> for &Integer {
15    type Output = Result<Integer, Box<dyn Error>>;
16    fn div(self, b: &u8) -> Result<Integer, Box<dyn Error>> {
17        let b_int: Integer = b.into();
18        self / &b_int
19    }
20}
21
22impl Div<&u16> for &Integer {
23    type Output = Result<Integer, Box<dyn Error>>;
24    fn div(self, b: &u16) -> Result<Integer, Box<dyn Error>> {
25        let b_int: Integer = b.into();
26        self / &b_int
27    }
28}
29
30impl Div<&u32> for &Integer {
31    type Output = Result<Integer, Box<dyn Error>>;
32    fn div(self, b: &u32) -> Result<Integer, Box<dyn Error>> {
33        let b_int: Integer = b.into();
34        self / &b_int
35    }
36}
37
38impl Div<&u64> for &Integer {
39    type Output = Result<Integer, Box<dyn Error>>;
40    fn div(self, b: &u64) -> Result<Integer, Box<dyn Error>> {
41        let b_int: Integer = b.into();
42        self / &b_int
43    }
44}
45
46impl Div<&u128> for &Integer {
47    type Output = Result<Integer, Box<dyn Error>>;
48    fn div(self, b: &u128) -> Result<Integer, Box<dyn Error>> {
49        let b_int: Integer = b.into();
50        self / &b_int
51    }
52}
53
54impl Div<&usize> for &Integer {
55    type Output = Result<Integer, Box<dyn Error>>;
56    fn div(self, b: &usize) -> Result<Integer, Box<dyn Error>> {
57        let b_int: Integer = b.into();
58        self / &b_int
59    }
60}
61
62impl Div for &Integer {
63
64    type Output = Result<Integer, Box<dyn Error>>;
65
66    fn div(self, b: Self) -> Result<Integer, Box<dyn Error>> {
67
68        if b == &Integer::zero() {
69
70            Err("a/0 is undefined!")?
71
72        } else if self == &Integer::zero() {
73
74            Ok(Integer::zero())
75
76        } else {
77
78            let a_pos =
79                if self.0[0] == Bit::Zero {
80                    self.clone()
81                } else {
82                    self.inversion()
83                };
84
85            let b_pos =
86                if b.0[0] == Bit::Zero {
87                    b.clone()
88                } else {
89                    b.inversion()
90                };
91
92            let (quotient, _) = divider::run(&a_pos, &b_pos);
93
94            match (self.0[0], b.0[0]) {
95                (Bit::Zero, Bit::Zero) => Ok(quotient),
96                (Bit::One, Bit::One) => Ok(quotient),
97                (Bit::Zero, Bit::One) => Ok(quotient.inversion()),
98                (Bit::One, Bit::Zero) => Ok(quotient.inversion())
99            }
100
101        }
102    
103    }
104
105}