1
- use std:: convert:: TryFrom ;
2
- use std:: fmt;
3
- use std:: iter:: Sum ;
4
- use std:: ops:: { Add , AddAssign , Div , Mul , Sub } ;
5
- use std:: str:: FromStr ;
6
-
7
- use num:: rational:: Ratio ;
8
- use num:: { BigUint , CheckedSub , Integer } ;
1
+ use std:: {
2
+ convert:: TryFrom ,
3
+ fmt,
4
+ iter:: Sum ,
5
+ ops:: { Add , AddAssign , Div , Mul , Sub } ,
6
+ str:: FromStr ,
7
+ } ;
8
+
9
+ use num:: { pow:: Pow , rational:: Ratio , BigUint , CheckedSub , Integer } ;
9
10
use num_derive:: { Num , NumOps , One , Zero } ;
10
11
use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
11
12
13
+ use crate :: UnifiedNum ;
14
+
12
15
#[ derive(
13
16
Serialize , Deserialize , Clone , PartialEq , Eq , PartialOrd , Ord , NumOps , One , Zero , Num , Default ,
14
17
) ]
@@ -58,6 +61,12 @@ impl fmt::Debug for BigNum {
58
61
}
59
62
}
60
63
64
+ impl fmt:: Display for BigNum {
65
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
66
+ self . 0 . fmt ( f)
67
+ }
68
+ }
69
+
61
70
impl Integer for BigNum {
62
71
fn div_floor ( & self , other : & Self ) -> Self {
63
72
self . 0 . div_floor ( & other. 0 ) . into ( )
@@ -98,6 +107,46 @@ impl Integer for BigNum {
98
107
}
99
108
}
100
109
110
+ impl Pow < BigNum > for BigNum {
111
+ type Output = BigNum ;
112
+
113
+ fn pow ( self , rhs : BigNum ) -> Self :: Output {
114
+ Self ( self . 0 . pow ( rhs. 0 ) )
115
+ }
116
+ }
117
+
118
+ impl Pow < & BigNum > for BigNum {
119
+ type Output = BigNum ;
120
+
121
+ fn pow ( self , rhs : & BigNum ) -> Self :: Output {
122
+ BigNum ( self . 0 . pow ( & rhs. 0 ) )
123
+ }
124
+ }
125
+
126
+ impl Pow < BigNum > for & BigNum {
127
+ type Output = BigNum ;
128
+
129
+ fn pow ( self , rhs : BigNum ) -> Self :: Output {
130
+ BigNum ( Pow :: pow ( & self . 0 , rhs. 0 ) )
131
+ }
132
+ }
133
+
134
+ impl Pow < & BigNum > for & BigNum {
135
+ type Output = BigNum ;
136
+
137
+ fn pow ( self , rhs : & BigNum ) -> Self :: Output {
138
+ BigNum ( Pow :: pow ( & self . 0 , & rhs. 0 ) )
139
+ }
140
+ }
141
+
142
+ impl Pow < u8 > for BigNum {
143
+ type Output = BigNum ;
144
+
145
+ fn pow ( self , rhs : u8 ) -> Self :: Output {
146
+ BigNum ( self . 0 . pow ( rhs) )
147
+ }
148
+ }
149
+
101
150
impl Add < & BigNum > for & BigNum {
102
151
type Output = BigNum ;
103
152
@@ -209,12 +258,6 @@ impl FromStr for BigNum {
209
258
}
210
259
}
211
260
212
- impl ToString for BigNum {
213
- fn to_string ( & self ) -> String {
214
- self . 0 . to_str_radix ( 10 )
215
- }
216
- }
217
-
218
261
impl From < u64 > for BigNum {
219
262
fn from ( value : u64 ) -> Self {
220
263
Self ( BigUint :: from ( value) )
@@ -227,6 +270,12 @@ impl From<BigUint> for BigNum {
227
270
}
228
271
}
229
272
273
+ impl < ' a > Sum < & ' a UnifiedNum > for BigNum {
274
+ fn sum < I : Iterator < Item = & ' a UnifiedNum > > ( iter : I ) -> BigNum {
275
+ BigNum ( iter. map ( |unified| BigUint :: from ( unified. to_u64 ( ) ) ) . sum ( ) )
276
+ }
277
+ }
278
+
230
279
fn biguint_from_str < ' de , D > ( deserializer : D ) -> Result < BigUint , D :: Error >
231
280
where
232
281
D : Deserializer < ' de > ,
@@ -297,4 +346,11 @@ mod test {
297
346
let expected: BigNum = 11 . into ( ) ;
298
347
assert_eq ! ( expected, & big_num * & ratio) ;
299
348
}
349
+ #[ test]
350
+ fn bignum_formatting ( ) {
351
+ let bignum: BigNum = 5000 . into ( ) ;
352
+
353
+ assert_eq ! ( "5000" , & bignum. to_string( ) ) ;
354
+ assert_eq ! ( "BigNum(radix: 10; 5000)" , & format!( "{:?}" , & bignum) ) ;
355
+ }
300
356
}
0 commit comments