浏览代码

Add fn to_radix() for radix > 36.

Phaiax 7 年之前
父节点
当前提交
1ab07df709
共有 3 个文件被更改,包括 856 次插入83 次删除
  1. 20 0
      bigint/src/bigint.rs
  2. 564 83
      bigint/src/biguint.rs
  3. 272 0
      bigint/src/tests/biguint.rs

+ 20 - 0
bigint/src/bigint.rs

@@ -1033,6 +1033,26 @@ impl BigInt {
         unsafe { String::from_utf8_unchecked(v) }
     }
 
+    /// Returns the integer in a given base. Each digit is given as an u8
+    /// number. Conversion to an alphabet has to be performed afterwards.
+    /// In contrast to the usual arabic style of written numbers as returned by
+    /// `to_str_radix`, the most significant digit comes last.
+    /// `radix` must be in the range `[2, 256]`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use num_bigint::{BigInt, Sign};
+    ///
+    /// assert_eq!(BigInt::from(-0xFFFFi64).to_radix(159),
+    ///            (Sign::Minus, vec![27, 94, 2]));
+    /// // 0xFFFF = 65535 = 27 + 94*159 + 2*(159^2)
+    /// ```
+    #[inline]
+    pub fn to_radix(&self, radix: u32) -> (Sign, Vec<u8>) {
+        (self.sign, self.data.to_radix(radix))
+    }
+
     /// Returns the sign of the `BigInt` as a `Sign`.
     ///
     /// # Examples

+ 564 - 83
bigint/src/biguint.rs

@@ -887,14 +887,10 @@ fn to_radix_digits_le(u: &BigUint, radix: u32) -> Vec<u8> {
     res
 }
 
-pub fn to_str_radix_reversed(u: &BigUint, radix: u32) -> Vec<u8> {
-    assert!(2 <= radix && radix <= 36, "The radix must be within 2...36");
-
+pub fn to_radix_reversed(u: &BigUint, radix: u32) -> Vec<u8> {
     if u.is_zero() {
-        return vec![b'0'];
-    }
-
-    let mut res = if radix.is_power_of_two() {
+        vec![0]
+    } else if radix.is_power_of_two() {
         // Powers of two can use bitwise masks and shifting instead of division
         let bits = ilog2(radix);
         if big_digit::BITS % bits == 0 {
@@ -908,7 +904,17 @@ pub fn to_str_radix_reversed(u: &BigUint, radix: u32) -> Vec<u8> {
         to_radix_digits_le(u, 10)
     } else {
         to_radix_digits_le(u, radix)
-    };
+    }
+}
+
+pub fn to_str_radix_reversed(u: &BigUint, radix: u32) -> Vec<u8> {
+    assert!(2 <= radix && radix <= 36, "The radix must be within 2...36");
+
+    if u.is_zero() {
+        return vec![b'0'];
+    }
+
+    let mut res = to_radix_reversed(u, radix);
 
     // Now convert everything to ASCII digits.
     for r in &mut res {
@@ -1034,6 +1040,26 @@ impl BigUint {
         unsafe { String::from_utf8_unchecked(v) }
     }
 
+    /// Returns the integer in a given base. Each digit is given as an u8
+    /// number. Conversion to an alphabet has to be performed afterwards.
+    /// In contrast to the usual arabic style of written numbers as returned by
+    /// `to_str_radix`, the most significant digit comes last.
+    /// `radix` must be in the range `[2, 256]`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use num_bigint::BigUint;
+    ///
+    /// assert_eq!(BigUint::from(0xFFFFu64).to_radix(159),
+    ///            vec![27, 94, 2]);
+    /// // 0xFFFF = 65535 = 27 + 94*159 + 2*(159^2)
+    /// ```
+    #[inline]
+    pub fn to_radix(&self, radix: u32) -> Vec<u8> {
+        to_radix_reversed(self, radix)
+    }
+
     /// Creates and initializes a `BigUint`.
     ///
     /// # Examples
@@ -1093,11 +1119,11 @@ impl serde::Deserialize for BigUint {
 /// Returns the greatest power of the radix <= big_digit::BASE
 #[inline]
 fn get_radix_base(radix: u32) -> (BigDigit, usize) {
-    debug_assert!(2 <= radix && radix <= 36, "The radix must be within 2...36");
+    debug_assert!(2 <= radix && radix <= 256, "The radix must be within 2...256");
     debug_assert!(!radix.is_power_of_two());
 
     // To generate this table:
-    //    for radix in 2u64..37 {
+    //    for radix in 2u64..257 {
     //        let mut power = big_digit::BITS / fls(radix as u64);
     //        let mut base = radix.pow(power as u32);
     //
@@ -1111,87 +1137,542 @@ fn get_radix_base(radix: u32) -> (BigDigit, usize) {
     //
     //        println!("({:10}, {:2}), // {:2}", base, power, radix);
     //    }
-
+    // and
+    //    for radix in 2u64..257 {
+    //        let mut power = 64 / fls(radix as u64);
+    //        let mut base = radix.pow(power as u32);
+    //
+    //        while let Some(b) = base.checked_mul(radix) {
+    //            base = b;
+    //            power += 1;
+    //        }
+    //
+    //        println!("({:20}, {:2}), // {:2}", base, power, radix);
+    //    }
     match big_digit::BITS {
         32  => {
-            const BASES: [(u32, usize); 37] = [(0, 0), (0, 0),
-                (0,                     0), // 2
-                (3486784401,            20),// 3
-                (0,                     0), // 4
-                (1220703125,            13),// 5
-                (2176782336,            12),// 6
-                (1977326743,            11),// 7
-                (0,                     0), // 8
-                (3486784401,            10),// 9
-                (1000000000,            9), // 10
-                (2357947691,            9), // 11
-                (429981696,             8), // 12
-                (815730721,             8), // 13
-                (1475789056,            8), // 14
-                (2562890625,            8), // 15
-                (0,                     0), // 16
-                (410338673,             7), // 17
-                (612220032,             7), // 18
-                (893871739,             7), // 19
-                (1280000000,            7), // 20
-                (1801088541,            7), // 21
-                (2494357888,            7), // 22
-                (3404825447,            7), // 23
-                (191102976,             6), // 24
-                (244140625,             6), // 25
-                (308915776,             6), // 26
-                (387420489,             6), // 27
-                (481890304,             6), // 28
-                (594823321,             6), // 29
-                (729000000,             6), // 30
-                (887503681,             6), // 31
-                (0,                     0), // 32
-                (1291467969,            6), // 33
-                (1544804416,            6), // 34
-                (1838265625,            6), // 35
-                (2176782336,            6)  // 36
+            const BASES: [(u32, usize); 257] = [
+                (         0,  0),
+                (         0,  0),
+                (         0,  0), //  2
+                (3486784401, 20), //  3
+                (         0,  0), //  4
+                (1220703125, 13), //  5
+                (2176782336, 12), //  6
+                (1977326743, 11), //  7
+                (         0,  0), //  8
+                (3486784401, 10), //  9
+                (1000000000,  9), // 10
+                (2357947691,  9), // 11
+                ( 429981696,  8), // 12
+                ( 815730721,  8), // 13
+                (1475789056,  8), // 14
+                (2562890625,  8), // 15
+                (         0,  0), // 16
+                ( 410338673,  7), // 17
+                ( 612220032,  7), // 18
+                ( 893871739,  7), // 19
+                (1280000000,  7), // 20
+                (1801088541,  7), // 21
+                (2494357888,  7), // 22
+                (3404825447,  7), // 23
+                ( 191102976,  6), // 24
+                ( 244140625,  6), // 25
+                ( 308915776,  6), // 26
+                ( 387420489,  6), // 27
+                ( 481890304,  6), // 28
+                ( 594823321,  6), // 29
+                ( 729000000,  6), // 30
+                ( 887503681,  6), // 31
+                (         0,  0), // 32
+                (1291467969,  6), // 33
+                (1544804416,  6), // 34
+                (1838265625,  6), // 35
+                (2176782336,  6), // 36
+                (2565726409,  6), // 37
+                (3010936384,  6), // 38
+                (3518743761,  6), // 39
+                (4096000000,  6), // 40
+                ( 115856201,  5), // 41
+                ( 130691232,  5), // 42
+                ( 147008443,  5), // 43
+                ( 164916224,  5), // 44
+                ( 184528125,  5), // 45
+                ( 205962976,  5), // 46
+                ( 229345007,  5), // 47
+                ( 254803968,  5), // 48
+                ( 282475249,  5), // 49
+                ( 312500000,  5), // 50
+                ( 345025251,  5), // 51
+                ( 380204032,  5), // 52
+                ( 418195493,  5), // 53
+                ( 459165024,  5), // 54
+                ( 503284375,  5), // 55
+                ( 550731776,  5), // 56
+                ( 601692057,  5), // 57
+                ( 656356768,  5), // 58
+                ( 714924299,  5), // 59
+                ( 777600000,  5), // 60
+                ( 844596301,  5), // 61
+                ( 916132832,  5), // 62
+                ( 992436543,  5), // 63
+                (         0,  0), // 64
+                (1160290625,  5), // 65
+                (1252332576,  5), // 66
+                (1350125107,  5), // 67
+                (1453933568,  5), // 68
+                (1564031349,  5), // 69
+                (1680700000,  5), // 70
+                (1804229351,  5), // 71
+                (1934917632,  5), // 72
+                (2073071593,  5), // 73
+                (2219006624,  5), // 74
+                (2373046875,  5), // 75
+                (2535525376,  5), // 76
+                (2706784157,  5), // 77
+                (2887174368,  5), // 78
+                (3077056399,  5), // 79
+                (3276800000,  5), // 80
+                (3486784401,  5), // 81
+                (3707398432,  5), // 82
+                (3939040643,  5), // 83
+                (4182119424,  5), // 84
+                (  52200625,  4), // 85
+                (  54700816,  4), // 86
+                (  57289761,  4), // 87
+                (  59969536,  4), // 88
+                (  62742241,  4), // 89
+                (  65610000,  4), // 90
+                (  68574961,  4), // 91
+                (  71639296,  4), // 92
+                (  74805201,  4), // 93
+                (  78074896,  4), // 94
+                (  81450625,  4), // 95
+                (  84934656,  4), // 96
+                (  88529281,  4), // 97
+                (  92236816,  4), // 98
+                (  96059601,  4), // 99
+                ( 100000000,  4), // 100
+                ( 104060401,  4), // 101
+                ( 108243216,  4), // 102
+                ( 112550881,  4), // 103
+                ( 116985856,  4), // 104
+                ( 121550625,  4), // 105
+                ( 126247696,  4), // 106
+                ( 131079601,  4), // 107
+                ( 136048896,  4), // 108
+                ( 141158161,  4), // 109
+                ( 146410000,  4), // 110
+                ( 151807041,  4), // 111
+                ( 157351936,  4), // 112
+                ( 163047361,  4), // 113
+                ( 168896016,  4), // 114
+                ( 174900625,  4), // 115
+                ( 181063936,  4), // 116
+                ( 187388721,  4), // 117
+                ( 193877776,  4), // 118
+                ( 200533921,  4), // 119
+                ( 207360000,  4), // 120
+                ( 214358881,  4), // 121
+                ( 221533456,  4), // 122
+                ( 228886641,  4), // 123
+                ( 236421376,  4), // 124
+                ( 244140625,  4), // 125
+                ( 252047376,  4), // 126
+                ( 260144641,  4), // 127
+                (         0,  0), // 128
+                ( 276922881,  4), // 129
+                ( 285610000,  4), // 130
+                ( 294499921,  4), // 131
+                ( 303595776,  4), // 132
+                ( 312900721,  4), // 133
+                ( 322417936,  4), // 134
+                ( 332150625,  4), // 135
+                ( 342102016,  4), // 136
+                ( 352275361,  4), // 137
+                ( 362673936,  4), // 138
+                ( 373301041,  4), // 139
+                ( 384160000,  4), // 140
+                ( 395254161,  4), // 141
+                ( 406586896,  4), // 142
+                ( 418161601,  4), // 143
+                ( 429981696,  4), // 144
+                ( 442050625,  4), // 145
+                ( 454371856,  4), // 146
+                ( 466948881,  4), // 147
+                ( 479785216,  4), // 148
+                ( 492884401,  4), // 149
+                ( 506250000,  4), // 150
+                ( 519885601,  4), // 151
+                ( 533794816,  4), // 152
+                ( 547981281,  4), // 153
+                ( 562448656,  4), // 154
+                ( 577200625,  4), // 155
+                ( 592240896,  4), // 156
+                ( 607573201,  4), // 157
+                ( 623201296,  4), // 158
+                ( 639128961,  4), // 159
+                ( 655360000,  4), // 160
+                ( 671898241,  4), // 161
+                ( 688747536,  4), // 162
+                ( 705911761,  4), // 163
+                ( 723394816,  4), // 164
+                ( 741200625,  4), // 165
+                ( 759333136,  4), // 166
+                ( 777796321,  4), // 167
+                ( 796594176,  4), // 168
+                ( 815730721,  4), // 169
+                ( 835210000,  4), // 170
+                ( 855036081,  4), // 171
+                ( 875213056,  4), // 172
+                ( 895745041,  4), // 173
+                ( 916636176,  4), // 174
+                ( 937890625,  4), // 175
+                ( 959512576,  4), // 176
+                ( 981506241,  4), // 177
+                (1003875856,  4), // 178
+                (1026625681,  4), // 179
+                (1049760000,  4), // 180
+                (1073283121,  4), // 181
+                (1097199376,  4), // 182
+                (1121513121,  4), // 183
+                (1146228736,  4), // 184
+                (1171350625,  4), // 185
+                (1196883216,  4), // 186
+                (1222830961,  4), // 187
+                (1249198336,  4), // 188
+                (1275989841,  4), // 189
+                (1303210000,  4), // 190
+                (1330863361,  4), // 191
+                (1358954496,  4), // 192
+                (1387488001,  4), // 193
+                (1416468496,  4), // 194
+                (1445900625,  4), // 195
+                (1475789056,  4), // 196
+                (1506138481,  4), // 197
+                (1536953616,  4), // 198
+                (1568239201,  4), // 199
+                (1600000000,  4), // 200
+                (1632240801,  4), // 201
+                (1664966416,  4), // 202
+                (1698181681,  4), // 203
+                (1731891456,  4), // 204
+                (1766100625,  4), // 205
+                (1800814096,  4), // 206
+                (1836036801,  4), // 207
+                (1871773696,  4), // 208
+                (1908029761,  4), // 209
+                (1944810000,  4), // 210
+                (1982119441,  4), // 211
+                (2019963136,  4), // 212
+                (2058346161,  4), // 213
+                (2097273616,  4), // 214
+                (2136750625,  4), // 215
+                (2176782336,  4), // 216
+                (2217373921,  4), // 217
+                (2258530576,  4), // 218
+                (2300257521,  4), // 219
+                (2342560000,  4), // 220
+                (2385443281,  4), // 221
+                (2428912656,  4), // 222
+                (2472973441,  4), // 223
+                (2517630976,  4), // 224
+                (2562890625,  4), // 225
+                (2608757776,  4), // 226
+                (2655237841,  4), // 227
+                (2702336256,  4), // 228
+                (2750058481,  4), // 229
+                (2798410000,  4), // 230
+                (2847396321,  4), // 231
+                (2897022976,  4), // 232
+                (2947295521,  4), // 233
+                (2998219536,  4), // 234
+                (3049800625,  4), // 235
+                (3102044416,  4), // 236
+                (3154956561,  4), // 237
+                (3208542736,  4), // 238
+                (3262808641,  4), // 239
+                (3317760000,  4), // 240
+                (3373402561,  4), // 241
+                (3429742096,  4), // 242
+                (3486784401,  4), // 243
+                (3544535296,  4), // 244
+                (3603000625,  4), // 245
+                (3662186256,  4), // 246
+                (3722098081,  4), // 247
+                (3782742016,  4), // 248
+                (3844124001,  4), // 249
+                (3906250000,  4), // 250
+                (3969126001,  4), // 251
+                (4032758016,  4), // 252
+                (4097152081,  4), // 253
+                (4162314256,  4), // 254
+                (4228250625,  4), // 255
+                (         0,  0), // 256
             ];
 
             let (base, power) = BASES[radix as usize];
             (base as BigDigit, power)
         }
         64  => {
-            const BASES: [(u64, usize); 37] = [(0, 0), (0, 0),
-                (9223372036854775808,	63), //  2
-                (12157665459056928801,	40), //  3
-                (4611686018427387904,	31), //  4
-                (7450580596923828125,	27), //  5
-                (4738381338321616896,	24), //  6
-                (3909821048582988049,	22), //  7
-                (9223372036854775808,	21), //  8
-                (12157665459056928801,	20), //  9
-                (10000000000000000000,	19), // 10
-                (5559917313492231481,	18), // 11
-                (2218611106740436992,	17), // 12
-                (8650415919381337933,	17), // 13
-                (2177953337809371136,	16), // 14
-                (6568408355712890625,	16), // 15
-                (1152921504606846976,	15), // 16
-                (2862423051509815793,	15), // 17
-                (6746640616477458432,	15), // 18
-                (15181127029874798299,	15), // 19
-                (1638400000000000000,	14), // 20
-                (3243919932521508681,	14), // 21
-                (6221821273427820544,	14), // 22
-                (11592836324538749809,	14), // 23
-                (876488338465357824,	13), // 24
-                (1490116119384765625,	13), // 25
-                (2481152873203736576,	13), // 26
-                (4052555153018976267,	13), // 27
-                (6502111422497947648,	13), // 28
-                (10260628712958602189,	13), // 29
-                (15943230000000000000,	13), // 30
-                (787662783788549761,	12), // 31
-                (1152921504606846976,	12), // 32
-                (1667889514952984961,	12), // 33
-                (2386420683693101056,	12), // 34
-                (3379220508056640625,	12), // 35
-                (4738381338321616896,	12), // 36
+            const BASES: [(u64, usize); 257] = [
+                (                   0,  0),
+                (                   0,  0),
+                ( 9223372036854775808, 63), //  2
+                (12157665459056928801, 40), //  3
+                ( 4611686018427387904, 31), //  4
+                ( 7450580596923828125, 27), //  5
+                ( 4738381338321616896, 24), //  6
+                ( 3909821048582988049, 22), //  7
+                ( 9223372036854775808, 21), //  8
+                (12157665459056928801, 20), //  9
+                (10000000000000000000, 19), // 10
+                ( 5559917313492231481, 18), // 11
+                ( 2218611106740436992, 17), // 12
+                ( 8650415919381337933, 17), // 13
+                ( 2177953337809371136, 16), // 14
+                ( 6568408355712890625, 16), // 15
+                ( 1152921504606846976, 15), // 16
+                ( 2862423051509815793, 15), // 17
+                ( 6746640616477458432, 15), // 18
+                (15181127029874798299, 15), // 19
+                ( 1638400000000000000, 14), // 20
+                ( 3243919932521508681, 14), // 21
+                ( 6221821273427820544, 14), // 22
+                (11592836324538749809, 14), // 23
+                (  876488338465357824, 13), // 24
+                ( 1490116119384765625, 13), // 25
+                ( 2481152873203736576, 13), // 26
+                ( 4052555153018976267, 13), // 27
+                ( 6502111422497947648, 13), // 28
+                (10260628712958602189, 13), // 29
+                (15943230000000000000, 13), // 30
+                (  787662783788549761, 12), // 31
+                ( 1152921504606846976, 12), // 32
+                ( 1667889514952984961, 12), // 33
+                ( 2386420683693101056, 12), // 34
+                ( 3379220508056640625, 12), // 35
+                ( 4738381338321616896, 12), // 36
+                ( 6582952005840035281, 12), // 37
+                ( 9065737908494995456, 12), // 38
+                (12381557655576425121, 12), // 39
+                (16777216000000000000, 12), // 40
+                (  550329031716248441, 11), // 41
+                (  717368321110468608, 11), // 42
+                (  929293739471222707, 11), // 43
+                ( 1196683881290399744, 11), // 44
+                ( 1532278301220703125, 11), // 45
+                ( 1951354384207722496, 11), // 46
+                ( 2472159215084012303, 11), // 47
+                ( 3116402981210161152, 11), // 48
+                ( 3909821048582988049, 11), // 49
+                ( 4882812500000000000, 11), // 50
+                ( 6071163615208263051, 11), // 51
+                ( 7516865509350965248, 11), // 52
+                ( 9269035929372191597, 11), // 53
+                (11384956040305711104, 11), // 54
+                (13931233916552734375, 11), // 55
+                (16985107389382393856, 11), // 56
+                (  362033331456891249, 10), // 57
+                (  430804206899405824, 10), // 58
+                (  511116753300641401, 10), // 59
+                (  604661760000000000, 10), // 60
+                (  713342911662882601, 10), // 61
+                (  839299365868340224, 10), // 62
+                (  984930291881790849, 10), // 63
+                ( 1152921504606846976, 10), // 64
+                ( 1346274334462890625, 10), // 65
+                ( 1568336880910795776, 10), // 66
+                ( 1822837804551761449, 10), // 67
+                ( 2113922820157210624, 10), // 68
+                ( 2446194060654759801, 10), // 69
+                ( 2824752490000000000, 10), // 70
+                ( 3255243551009881201, 10), // 71
+                ( 3743906242624487424, 10), // 72
+                ( 4297625829703557649, 10), // 73
+                ( 4923990397355877376, 10), // 74
+                ( 5631351470947265625, 10), // 75
+                ( 6428888932339941376, 10), // 76
+                ( 7326680472586200649, 10), // 77
+                ( 8335775831236199424, 10), // 78
+                ( 9468276082626847201, 10), // 79
+                (10737418240000000000, 10), // 80
+                (12157665459056928801, 10), // 81
+                (13744803133596058624, 10), // 82
+                (15516041187205853449, 10), // 83
+                (17490122876598091776, 10), // 84
+                (  231616946283203125,  9), // 85
+                (  257327417311663616,  9), // 86
+                (  285544154243029527,  9), // 87
+                (  316478381828866048,  9), // 88
+                (  350356403707485209,  9), // 89
+                (  387420489000000000,  9), // 90
+                (  427929800129788411,  9), // 91
+                (  472161363286556672,  9), // 92
+                (  520411082988487293,  9), // 93
+                (  572994802228616704,  9), // 94
+                (  630249409724609375,  9), // 95
+                (  692533995824480256,  9), // 96
+                (  760231058654565217,  9), // 97
+                (  833747762130149888,  9), // 98
+                (  913517247483640899,  9), // 99
+                ( 1000000000000000000,  9), // 100
+                ( 1093685272684360901,  9), // 101
+                ( 1195092568622310912,  9), // 102
+                ( 1304773183829244583,  9), // 103
+                ( 1423311812421484544,  9), // 104
+                ( 1551328215978515625,  9), // 105
+                ( 1689478959002692096,  9), // 106
+                ( 1838459212420154507,  9), // 107
+                ( 1999004627104432128,  9), // 108
+                ( 2171893279442309389,  9), // 109
+                ( 2357947691000000000,  9), // 110
+                ( 2558036924386500591,  9), // 111
+                ( 2773078757450186752,  9), // 112
+                ( 3004041937984268273,  9), // 113
+                ( 3251948521156637184,  9), // 114
+                ( 3517876291919921875,  9), // 115
+                ( 3802961274698203136,  9), // 116
+                ( 4108400332687853397,  9), // 117
+                ( 4435453859151328768,  9), // 118
+                ( 4785448563124474679,  9), // 119
+                ( 5159780352000000000,  9), // 120
+                ( 5559917313492231481,  9), // 121
+                ( 5987402799531080192,  9), // 122
+                ( 6443858614676334363,  9), // 123
+                ( 6930988311686938624,  9), // 124
+                ( 7450580596923828125,  9), // 125
+                ( 8004512848309157376,  9), // 126
+                ( 8594754748609397887,  9), // 127
+                ( 9223372036854775808,  9), // 128
+                ( 9892530380752880769,  9), // 129
+                (10604499373000000000,  9), // 130
+                (11361656654439817571,  9), // 131
+                (12166492167065567232,  9), // 132
+                (13021612539908538853,  9), // 133
+                (13929745610903012864,  9), // 134
+                (14893745087865234375,  9), // 135
+                (15916595351771938816,  9), // 136
+                (17001416405572203977,  9), // 137
+                (18151468971815029248,  9), // 138
+                (  139353667211683681,  8), // 139
+                (  147578905600000000,  8), // 140
+                (  156225851787813921,  8), // 141
+                (  165312903998914816,  8), // 142
+                (  174859124550883201,  8), // 143
+                (  184884258895036416,  8), // 144
+                (  195408755062890625,  8), // 145
+                (  206453783524884736,  8), // 146
+                (  218041257467152161,  8), // 147
+                (  230193853492166656,  8), // 148
+                (  242935032749128801,  8), // 149
+                (  256289062500000000,  8), // 150
+                (  270281038127131201,  8), // 151
+                (  284936905588473856,  8), // 152
+                (  300283484326400961,  8), // 153
+                (  316348490636206336,  8), // 154
+                (  333160561500390625,  8), // 155
+                (  350749278894882816,  8), // 156
+                (  369145194573386401,  8), // 157
+                (  388379855336079616,  8), // 158
+                (  408485828788939521,  8), // 159
+                (  429496729600000000,  8), // 160
+                (  451447246258894081,  8), // 161
+                (  474373168346071296,  8), // 162
+                (  498311414318121121,  8), // 163
+                (  523300059815673856,  8), // 164
+                (  549378366500390625,  8), // 165
+                (  576586811427594496,  8), // 166
+                (  604967116961135041,  8), // 167
+                (  634562281237118976,  8), // 168
+                (  665416609183179841,  8), // 169
+                (  697575744100000000,  8), // 170
+                (  731086699811838561,  8), // 171
+                (  765997893392859136,  8), // 172
+                (  802359178476091681,  8), // 173
+                (  840221879151902976,  8), // 174
+                (  879638824462890625,  8), // 175
+                (  920664383502155776,  8), // 176
+                (  963354501121950081,  8), // 177
+                ( 1007766734259732736,  8), // 178
+                ( 1053960288888713761,  8), // 179
+                ( 1101996057600000000,  8), // 180
+                ( 1151936657823500641,  8), // 181
+                ( 1203846470694789376,  8), // 182
+                ( 1257791680575160641,  8), // 183
+                ( 1313840315232157696,  8), // 184
+                ( 1372062286687890625,  8), // 185
+                ( 1432529432742502656,  8), // 186
+                ( 1495315559180183521,  8), // 187
+                ( 1560496482665168896,  8), // 188
+                ( 1628150074335205281,  8), // 189
+                ( 1698356304100000000,  8), // 190
+                ( 1771197285652216321,  8), // 191
+                ( 1846757322198614016,  8), // 192
+                ( 1925122952918976001,  8), // 193
+                ( 2006383000160502016,  8), // 194
+                ( 2090628617375390625,  8), // 195
+                ( 2177953337809371136,  8), // 196
+                ( 2268453123948987361,  8), // 197
+                ( 2362226417735475456,  8), // 198
+                ( 2459374191553118401,  8), // 199
+                ( 2560000000000000000,  8), // 200
+                ( 2664210032449121601,  8), // 201
+                ( 2772113166407885056,  8), // 202
+                ( 2883821021683985761,  8), // 203
+                ( 2999448015365799936,  8), // 204
+                ( 3119111417625390625,  8), // 205
+                ( 3242931408352297216,  8), // 206
+                ( 3371031134626313601,  8), // 207
+                ( 3503536769037500416,  8), // 208
+                ( 3640577568861717121,  8), // 209
+                ( 3782285936100000000,  8), // 210
+                ( 3928797478390152481,  8), // 211
+                ( 4080251070798954496,  8), // 212
+                ( 4236788918503437921,  8), // 213
+                ( 4398556620369715456,  8), // 214
+                ( 4565703233437890625,  8), // 215
+                ( 4738381338321616896,  8), // 216
+                ( 4916747105530914241,  8), // 217
+                ( 5100960362726891776,  8), // 218
+                ( 5291184662917065441,  8), // 219
+                ( 5487587353600000000,  8), // 220
+                ( 5690339646868044961,  8), // 221
+                ( 5899616690476974336,  8), // 222
+                ( 6115597639891380481,  8), // 223
+                ( 6338465731314712576,  8), // 224
+                ( 6568408355712890625,  8), // 225
+                ( 6805617133840466176,  8), // 226
+                ( 7050287992278341281,  8), // 227
+                ( 7302621240492097536,  8), // 228
+                ( 7562821648920027361,  8), // 229
+                ( 7831098528100000000,  8), // 230
+                ( 8107665808844335041,  8), // 231
+                ( 8392742123471896576,  8), // 232
+                ( 8686550888106661441,  8), // 233
+                ( 8989320386052055296,  8), // 234
+                ( 9301283852250390625,  8), // 235
+                ( 9622679558836781056,  8), // 236
+                ( 9953750901796946721,  8), // 237
+                (10294746488738365696,  8), // 238
+                (10645920227784266881,  8), // 239
+                (11007531417600000000,  8), // 240
+                (11379844838561358721,  8), // 241
+                (11763130845074473216,  8), // 242
+                (12157665459056928801,  8), // 243
+                (12563730464589807616,  8), // 244
+                (12981613503750390625,  8), // 245
+                (13411608173635297536,  8), // 246
+                (13854014124583882561,  8), // 247
+                (14309137159611744256,  8), // 248
+                (14777289335064248001,  8), // 249
+                (15258789062500000000,  8), // 250
+                (15753961211814252001,  8), // 251
+                (16263137215612256256,  8), // 252
+                (16786655174842630561,  8), // 253
+                (17324859965700833536,  8), // 254
+                (17878103347812890625,  8), // 255
+                (   72057594037927936,  7), // 256
             ];
 
             let (base, power) = BASES[radix as usize];

+ 272 - 0
bigint/src/tests/biguint.rs

@@ -1020,6 +1020,278 @@ fn test_to_str_radix() {
     }
 }
 
+#[test]
+fn test_to_radix() {
+    const GROUND_TRUTH : &[(&[u8], u32, &[u8])] = &[
+        (b"0",          42, &[0]),
+        (b"ffffeeffbb", 2, &[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+                             1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+                             1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
+        (b"ffffeeffbb", 3, &[2, 2, 1, 1, 2, 1, 1, 2, 0, 0, 0, 0, 0, 1, 2,
+                             0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 1]),
+        (b"ffffeeffbb", 4, &[3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3,
+                             3, 3, 3, 3, 3]),
+        (b"ffffeeffbb", 5, &[0, 4, 3, 3, 1, 4, 2, 4, 1, 4, 4, 2, 3, 0, 0,
+                             1, 2, 1]),
+        (b"ffffeeffbb", 6, &[5, 5, 4, 5, 5, 0, 0, 1, 2, 5, 3, 0, 1, 0, 2, 2]),
+        (b"ffffeeffbb", 7, &[4, 2, 3, 6, 0, 1, 6, 1, 6, 2, 0, 3, 2, 4, 1]),
+        (b"ffffeeffbb", 8, &[3, 7, 6, 7, 7, 5, 3, 7, 7, 7, 7, 7, 7, 1]),
+        (b"ffffeeffbb", 9, &[8, 4, 5, 7, 0, 0, 3, 2, 0, 3, 0, 8, 3]),
+        (b"ffffeeffbb", 10, &[5, 9, 5, 3, 1, 5, 0, 1, 5, 9, 9, 0, 1]),
+        (b"ffffeeffbb", 11, &[10, 7, 6, 5, 2, 0, 3, 3, 3, 4, 9, 3]),
+        (b"ffffeeffbb", 12, &[11, 8, 5, 10, 1, 10, 3, 1, 1, 9, 5, 1]),
+        (b"ffffeeffbb", 13, &[0, 5, 7, 4, 6, 5, 6, 11, 8, 12, 7]),
+        (b"ffffeeffbb", 14, &[11, 4, 4, 11, 8, 4, 6, 0, 3, 11, 3]),
+        (b"ffffeeffbb", 15, &[5, 11, 13, 2, 1, 10, 2, 0, 9, 13, 1]),
+        (b"ffffeeffbb", 16, &[11, 11, 15, 15, 14, 14, 15, 15, 15, 15]),
+        (b"ffffeeffbb", 17, &[0, 2, 14, 12, 2, 14, 8, 10, 4, 9]),
+        (b"ffffeeffbb", 18, &[17, 15, 5, 13, 10, 16, 16, 13, 9, 5]),
+        (b"ffffeeffbb", 19, &[14, 13, 2, 8, 9, 0, 1, 14, 7, 3]),
+        (b"ffffeeffbb", 20, &[15, 19, 3, 14, 0, 17, 19, 18, 2, 2]),
+        (b"ffffeeffbb", 21, &[11, 5, 4, 13, 5, 18, 9, 1, 8, 1]),
+        (b"ffffeeffbb", 22, &[21, 3, 7, 21, 15, 12, 17, 0, 20]),
+        (b"ffffeeffbb", 23, &[21, 21, 6, 9, 10, 7, 21, 0, 14]),
+        (b"ffffeeffbb", 24, &[11, 10, 19, 14, 22, 11, 17, 23, 9]),
+        (b"ffffeeffbb", 25, &[20, 18, 21, 22, 21, 14, 3, 5, 7]),
+        (b"ffffeeffbb", 26, &[13, 15, 24, 11, 17, 6, 23, 6, 5]),
+        (b"ffffeeffbb", 27, &[17, 16, 7, 0, 21, 0, 3, 24, 3]),
+        (b"ffffeeffbb", 28, &[11, 16, 11, 15, 14, 18, 13, 25, 2]),
+        (b"ffffeeffbb", 29, &[6, 8, 7, 19, 14, 13, 21, 5, 2]),
+        (b"ffffeeffbb", 30, &[5, 13, 18, 11, 10, 7, 8, 20, 1]),
+        (b"ffffeeffbb", 31, &[22, 26, 15, 19, 8, 27, 29, 8, 1]),
+        (b"ffffeeffbb", 32, &[27, 29, 31, 29, 30, 31, 31, 31]),
+        (b"ffffeeffbb", 33, &[32, 20, 27, 12, 1, 12, 26, 25]),
+        (b"ffffeeffbb", 34, &[17, 9, 16, 33, 13, 25, 31, 20]),
+        (b"ffffeeffbb", 35, &[25, 32, 2, 25, 11, 4, 3, 17]),
+        (b"ffffeeffbb", 36, &[35, 34, 5, 6, 32, 3, 1, 14]),
+        (b"ffffeeffbb", 37, &[16, 21, 18, 4, 33, 19, 21, 11]),
+        (b"ffffeeffbb", 38, &[33, 25, 19, 29, 20, 6, 23, 9]),
+        (b"ffffeeffbb", 39, &[26, 27, 29, 23, 16, 18, 0, 8]),
+        (b"ffffeeffbb", 40, &[35, 39, 30, 11, 16, 17, 28, 6]),
+        (b"ffffeeffbb", 41, &[36, 30, 9, 18, 12, 19, 26, 5]),
+        (b"ffffeeffbb", 42, &[11, 34, 37, 27, 1, 13, 32, 4]),
+        (b"ffffeeffbb", 43, &[3, 24, 11, 2, 10, 40, 1, 4]),
+        (b"ffffeeffbb", 44, &[43, 12, 40, 32, 3, 23, 19, 3]),
+        (b"ffffeeffbb", 45, &[35, 38, 44, 18, 22, 18, 42, 2]),
+        (b"ffffeeffbb", 46, &[21, 45, 18, 41, 17, 2, 24, 2]),
+        (b"ffffeeffbb", 47, &[37, 37, 11, 12, 6, 0, 8, 2]),
+        (b"ffffeeffbb", 48, &[11, 41, 40, 43, 5, 43, 41, 1]),
+        (b"ffffeeffbb", 49, &[18, 45, 7, 13, 20, 21, 30, 1]),
+        (b"ffffeeffbb", 50, &[45, 21, 5, 34, 21, 18, 20, 1]),
+        (b"ffffeeffbb", 51, &[17, 6, 26, 22, 38, 24, 11, 1]),
+        (b"ffffeeffbb", 52, &[39, 33, 38, 30, 46, 31, 3, 1]),
+        (b"ffffeeffbb", 53, &[31, 7, 44, 23, 9, 32, 49]),
+        (b"ffffeeffbb", 54, &[17, 35, 8, 37, 31, 18, 44]),
+        (b"ffffeeffbb", 55, &[10, 52, 9, 48, 36, 39, 39]),
+        (b"ffffeeffbb", 56, &[11, 50, 51, 22, 25, 36, 35]),
+        (b"ffffeeffbb", 57, &[14, 55, 12, 43, 20, 3, 32]),
+        (b"ffffeeffbb", 58, &[35, 18, 45, 56, 9, 51, 28]),
+        (b"ffffeeffbb", 59, &[51, 28, 20, 26, 55, 3, 26]),
+        (b"ffffeeffbb", 60, &[35, 6, 27, 46, 58, 33, 23]),
+        (b"ffffeeffbb", 61, &[58, 7, 6, 54, 49, 20, 21]),
+        (b"ffffeeffbb", 62, &[53, 59, 3, 14, 10, 22, 19]),
+        (b"ffffeeffbb", 63, &[53, 50, 23, 4, 56, 36, 17]),
+        (b"ffffeeffbb", 64, &[59, 62, 47, 59, 63, 63, 15]),
+        (b"ffffeeffbb", 65, &[0, 53, 39, 4, 40, 37, 14]),
+        (b"ffffeeffbb", 66, &[65, 59, 39, 1, 64, 19, 13]),
+        (b"ffffeeffbb", 67, &[35, 14, 19, 16, 25, 10, 12]),
+        (b"ffffeeffbb", 68, &[51, 38, 63, 50, 15, 8, 11]),
+        (b"ffffeeffbb", 69, &[44, 45, 18, 58, 68, 12, 10]),
+        (b"ffffeeffbb", 70, &[25, 51, 0, 60, 13, 24, 9]),
+        (b"ffffeeffbb", 71, &[54, 30, 9, 65, 28, 41, 8]),
+        (b"ffffeeffbb", 72, &[35, 35, 55, 54, 17, 64, 7]),
+        (b"ffffeeffbb", 73, &[34, 4, 48, 40, 27, 19, 7]),
+        (b"ffffeeffbb", 74, &[53, 47, 4, 56, 36, 51, 6]),
+        (b"ffffeeffbb", 75, &[20, 56, 10, 72, 24, 13, 6]),
+        (b"ffffeeffbb", 76, &[71, 31, 52, 60, 48, 53, 5]),
+        (b"ffffeeffbb", 77, &[32, 73, 14, 63, 15, 21, 5]),
+        (b"ffffeeffbb", 78, &[65, 13, 17, 32, 64, 68, 4]),
+        (b"ffffeeffbb", 79, &[37, 56, 2, 56, 25, 41, 4]),
+        (b"ffffeeffbb", 80, &[75, 59, 37, 41, 43, 15, 4]),
+        (b"ffffeeffbb", 81, &[44, 68, 0, 21, 27, 72, 3]),
+        (b"ffffeeffbb", 82, &[77, 35, 2, 74, 46, 50, 3]),
+        (b"ffffeeffbb", 83, &[52, 51, 19, 76, 10, 30, 3]),
+        (b"ffffeeffbb", 84, &[11, 80, 19, 19, 76, 10, 3]),
+        (b"ffffeeffbb", 85, &[0, 82, 20, 14, 68, 77, 2]),
+        (b"ffffeeffbb", 86, &[3, 12, 78, 37, 62, 61, 2]),
+        (b"ffffeeffbb", 87, &[35, 12, 20, 8, 52, 46, 2]),
+        (b"ffffeeffbb", 88, &[43, 6, 54, 42, 30, 32, 2]),
+        (b"ffffeeffbb", 89, &[49, 52, 85, 21, 80, 18, 2]),
+        (b"ffffeeffbb", 90, &[35, 64, 78, 24, 18, 6, 2]),
+        (b"ffffeeffbb", 91, &[39, 17, 83, 63, 17, 85, 1]),
+        (b"ffffeeffbb", 92, &[67, 22, 85, 79, 75, 74, 1]),
+        (b"ffffeeffbb", 93, &[53, 60, 39, 29, 4, 65, 1]),
+        (b"ffffeeffbb", 94, &[37, 89, 2, 72, 76, 55, 1]),
+        (b"ffffeeffbb", 95, &[90, 74, 89, 9, 9, 47, 1]),
+        (b"ffffeeffbb", 96, &[59, 20, 46, 35, 81, 38, 1]),
+        (b"ffffeeffbb", 97, &[94, 87, 60, 71, 3, 31, 1]),
+        (b"ffffeeffbb", 98, &[67, 22, 63, 50, 62, 23, 1]),
+        (b"ffffeeffbb", 99, &[98, 6, 69, 12, 61, 16, 1]),
+        (b"ffffeeffbb", 100, &[95, 35, 51, 10, 95, 9, 1]),
+        (b"ffffeeffbb", 101, &[87, 27, 7, 8, 62, 3, 1]),
+        (b"ffffeeffbb", 102, &[17, 3, 32, 79, 59, 99]),
+        (b"ffffeeffbb", 103, &[30, 22, 90, 0, 87, 94]),
+        (b"ffffeeffbb", 104, &[91, 68, 87, 68, 38, 90]),
+        (b"ffffeeffbb", 105, &[95, 80, 54, 73, 15, 86]),
+        (b"ffffeeffbb", 106, &[31, 30, 24, 16, 17, 82]),
+        (b"ffffeeffbb", 107, &[51, 50, 10, 12, 42, 78]),
+        (b"ffffeeffbb", 108, &[71, 71, 96, 78, 89, 74]),
+        (b"ffffeeffbb", 109, &[33, 18, 93, 22, 50, 71]),
+        (b"ffffeeffbb", 110, &[65, 53, 57, 88, 29, 68]),
+        (b"ffffeeffbb", 111, &[53, 93, 67, 90, 27, 65]),
+        (b"ffffeeffbb", 112, &[11, 109, 96, 65, 43, 62]),
+        (b"ffffeeffbb", 113, &[27, 23, 106, 56, 76, 59]),
+        (b"ffffeeffbb", 114, &[71, 84, 31, 112, 11, 57]),
+        (b"ffffeeffbb", 115, &[90, 22, 1, 56, 76, 54]),
+        (b"ffffeeffbb", 116, &[35, 38, 98, 57, 40, 52]),
+        (b"ffffeeffbb", 117, &[26, 113, 115, 62, 17, 50]),
+        (b"ffffeeffbb", 118, &[51, 14, 5, 18, 7, 48]),
+        (b"ffffeeffbb", 119, &[102, 31, 110, 108, 8, 46]),
+        (b"ffffeeffbb", 120, &[35, 93, 96, 50, 22, 44]),
+        (b"ffffeeffbb", 121, &[87, 61, 2, 36, 47, 42]),
+        (b"ffffeeffbb", 122, &[119, 64, 1, 22, 83, 40]),
+        (b"ffffeeffbb", 123, &[77, 119, 32, 90, 6, 39]),
+        (b"ffffeeffbb", 124, &[115, 122, 31, 79, 62, 37]),
+        (b"ffffeeffbb", 125, &[95, 108, 47, 74, 3, 36]),
+        (b"ffffeeffbb", 126, &[53, 25, 116, 39, 78, 34]),
+        (b"ffffeeffbb", 127, &[22, 23, 125, 67, 35, 33]),
+        (b"ffffeeffbb", 128, &[59, 127, 59, 127, 127, 31]),
+        (b"ffffeeffbb", 129, &[89, 36, 1, 59, 100, 30]),
+        (b"ffffeeffbb", 130, &[65, 91, 123, 89, 79, 29]),
+        (b"ffffeeffbb", 131, &[58, 72, 39, 63, 65, 28]),
+        (b"ffffeeffbb", 132, &[131, 62, 92, 82, 57, 27]),
+        (b"ffffeeffbb", 133, &[109, 31, 51, 123, 55, 26]),
+        (b"ffffeeffbb", 134, &[35, 74, 21, 27, 60, 25]),
+        (b"ffffeeffbb", 135, &[125, 132, 49, 37, 70, 24]),
+        (b"ffffeeffbb", 136, &[51, 121, 117, 133, 85, 23]),
+        (b"ffffeeffbb", 137, &[113, 60, 135, 22, 107, 22]),
+        (b"ffffeeffbb", 138, &[113, 91, 73, 93, 133, 21]),
+        (b"ffffeeffbb", 139, &[114, 75, 102, 51, 26, 21]),
+        (b"ffffeeffbb", 140, &[95, 25, 35, 16, 62, 20]),
+        (b"ffffeeffbb", 141, &[131, 137, 16, 110, 102, 19]),
+        (b"ffffeeffbb", 142, &[125, 121, 108, 34, 6, 19]),
+        (b"ffffeeffbb", 143, &[65, 78, 138, 55, 55, 18]),
+        (b"ffffeeffbb", 144, &[107, 125, 121, 15, 109, 17]),
+        (b"ffffeeffbb", 145, &[35, 13, 122, 42, 22, 17]),
+        (b"ffffeeffbb", 146, &[107, 38, 103, 123, 83, 16]),
+        (b"ffffeeffbb", 147, &[116, 96, 71, 98, 2, 16]),
+        (b"ffffeeffbb", 148, &[127, 23, 75, 99, 71, 15]),
+        (b"ffffeeffbb", 149, &[136, 110, 53, 114, 144, 14]),
+        (b"ffffeeffbb", 150, &[95, 140, 133, 130, 71, 14]),
+        (b"ffffeeffbb", 151, &[15, 50, 29, 137, 0, 14]),
+        (b"ffffeeffbb", 152, &[147, 15, 89, 121, 83, 13]),
+        (b"ffffeeffbb", 153, &[17, 87, 93, 72, 17, 13]),
+        (b"ffffeeffbb", 154, &[109, 113, 3, 133, 106, 12]),
+        (b"ffffeeffbb", 155, &[115, 141, 120, 139, 44, 12]),
+        (b"ffffeeffbb", 156, &[143, 45, 4, 82, 140, 11]),
+        (b"ffffeeffbb", 157, &[149, 92, 15, 106, 82, 11]),
+        (b"ffffeeffbb", 158, &[37, 107, 79, 46, 26, 11]),
+        (b"ffffeeffbb", 159, &[137, 37, 146, 51, 130, 10]),
+        (b"ffffeeffbb", 160, &[155, 69, 29, 115, 77, 10]),
+        (b"ffffeeffbb", 161, &[67, 98, 46, 68, 26, 10]),
+        (b"ffffeeffbb", 162, &[125, 155, 60, 63, 138, 9]),
+        (b"ffffeeffbb", 163, &[96, 43, 118, 93, 90, 9]),
+        (b"ffffeeffbb", 164, &[159, 99, 123, 152, 43, 9]),
+        (b"ffffeeffbb", 165, &[65, 17, 1, 69, 163, 8]),
+        (b"ffffeeffbb", 166, &[135, 108, 25, 165, 119, 8]),
+        (b"ffffeeffbb", 167, &[165, 116, 164, 103, 77, 8]),
+        (b"ffffeeffbb", 168, &[11, 166, 67, 44, 36, 8]),
+        (b"ffffeeffbb", 169, &[65, 59, 71, 149, 164, 7]),
+        (b"ffffeeffbb", 170, &[85, 83, 26, 76, 126, 7]),
+        (b"ffffeeffbb", 171, &[71, 132, 140, 157, 88, 7]),
+        (b"ffffeeffbb", 172, &[3, 6, 127, 47, 52, 7]),
+        (b"ffffeeffbb", 173, &[122, 66, 53, 83, 16, 7]),
+        (b"ffffeeffbb", 174, &[35, 6, 5, 88, 155, 6]),
+        (b"ffffeeffbb", 175, &[95, 20, 84, 56, 122, 6]),
+        (b"ffffeeffbb", 176, &[43, 91, 57, 159, 89, 6]),
+        (b"ffffeeffbb", 177, &[110, 127, 54, 40, 58, 6]),
+        (b"ffffeeffbb", 178, &[49, 115, 43, 47, 27, 6]),
+        (b"ffffeeffbb", 179, &[130, 91, 4, 178, 175, 5]),
+        (b"ffffeeffbb", 180, &[35, 122, 109, 70, 147, 5]),
+        (b"ffffeeffbb", 181, &[94, 94, 4, 79, 119, 5]),
+        (b"ffffeeffbb", 182, &[39, 54, 66, 19, 92, 5]),
+        (b"ffffeeffbb", 183, &[119, 2, 143, 69, 65, 5]),
+        (b"ffffeeffbb", 184, &[67, 57, 90, 44, 39, 5]),
+        (b"ffffeeffbb", 185, &[90, 63, 141, 123, 13, 5]),
+        (b"ffffeeffbb", 186, &[53, 123, 172, 119, 174, 4]),
+        (b"ffffeeffbb", 187, &[153, 21, 68, 28, 151, 4]),
+        (b"ffffeeffbb", 188, &[131, 138, 94, 32, 128, 4]),
+        (b"ffffeeffbb", 189, &[179, 121, 156, 130, 105, 4]),
+        (b"ffffeeffbb", 190, &[185, 179, 164, 131, 83, 4]),
+        (b"ffffeeffbb", 191, &[118, 123, 37, 31, 62, 4]),
+        (b"ffffeeffbb", 192, &[59, 106, 83, 16, 41, 4]),
+        (b"ffffeeffbb", 193, &[57, 37, 47, 86, 20, 4]),
+        (b"ffffeeffbb", 194, &[191, 140, 63, 45, 0, 4]),
+        (b"ffffeeffbb", 195, &[65, 169, 83, 84, 175, 3]),
+        (b"ffffeeffbb", 196, &[67, 158, 64, 6, 157, 3]),
+        (b"ffffeeffbb", 197, &[121, 26, 167, 3, 139, 3]),
+        (b"ffffeeffbb", 198, &[197, 151, 165, 75, 121, 3]),
+        (b"ffffeeffbb", 199, &[55, 175, 36, 22, 104, 3]),
+        (b"ffffeeffbb", 200, &[195, 167, 162, 38, 87, 3]),
+        (b"ffffeeffbb", 201, &[35, 27, 136, 124, 70, 3]),
+        (b"ffffeeffbb", 202, &[87, 64, 153, 76, 54, 3]),
+        (b"ffffeeffbb", 203, &[151, 191, 14, 94, 38, 3]),
+        (b"ffffeeffbb", 204, &[119, 103, 135, 175, 22, 3]),
+        (b"ffffeeffbb", 205, &[200, 79, 123, 115, 7, 3]),
+        (b"ffffeeffbb", 206, &[133, 165, 202, 115, 198, 2]),
+        (b"ffffeeffbb", 207, &[44, 153, 193, 175, 184, 2]),
+        (b"ffffeeffbb", 208, &[91, 190, 125, 86, 171, 2]),
+        (b"ffffeeffbb", 209, &[109, 151, 34, 53, 158, 2]),
+        (b"ffffeeffbb", 210, &[95, 40, 171, 74, 145, 2]),
+        (b"ffffeeffbb", 211, &[84, 195, 162, 150, 132, 2]),
+        (b"ffffeeffbb", 212, &[31, 15, 59, 68, 120, 2]),
+        (b"ffffeeffbb", 213, &[125, 57, 127, 36, 108, 2]),
+        (b"ffffeeffbb", 214, &[51, 132, 2, 55, 96, 2]),
+        (b"ffffeeffbb", 215, &[175, 133, 177, 122, 84, 2]),
+        (b"ffffeeffbb", 216, &[179, 35, 78, 23, 73, 2]),
+        (b"ffffeeffbb", 217, &[53, 101, 208, 186, 61, 2]),
+        (b"ffffeeffbb", 218, &[33, 9, 214, 179, 50, 2]),
+        (b"ffffeeffbb", 219, &[107, 147, 175, 217, 39, 2]),
+        (b"ffffeeffbb", 220, &[175, 81, 179, 79, 29, 2]),
+        (b"ffffeeffbb", 221, &[0, 76, 95, 204, 18, 2]),
+        (b"ffffeeffbb", 222, &[53, 213, 16, 150, 8, 2]),
+        (b"ffffeeffbb", 223, &[158, 161, 42, 136, 221, 1]),
+        (b"ffffeeffbb", 224, &[123, 54, 52, 162, 212, 1]),
+        (b"ffffeeffbb", 225, &[170, 43, 151, 2, 204, 1]),
+        (b"ffffeeffbb", 226, &[27, 68, 224, 105, 195, 1]),
+        (b"ffffeeffbb", 227, &[45, 69, 157, 20, 187, 1]),
+        (b"ffffeeffbb", 228, &[71, 213, 64, 199, 178, 1]),
+        (b"ffffeeffbb", 229, &[129, 203, 66, 186, 170, 1]),
+        (b"ffffeeffbb", 230, &[205, 183, 57, 208, 162, 1]),
+        (b"ffffeeffbb", 231, &[32, 50, 164, 33, 155, 1]),
+        (b"ffffeeffbb", 232, &[35, 135, 53, 123, 147, 1]),
+        (b"ffffeeffbb", 233, &[209, 47, 89, 13, 140, 1]),
+        (b"ffffeeffbb", 234, &[143, 56, 175, 168, 132, 1]),
+        (b"ffffeeffbb", 235, &[225, 157, 216, 121, 125, 1]),
+        (b"ffffeeffbb", 236, &[51, 66, 119, 105, 118, 1]),
+        (b"ffffeeffbb", 237, &[116, 150, 26, 119, 111, 1]),
+        (b"ffffeeffbb", 238, &[221, 15, 87, 162, 104, 1]),
+        (b"ffffeeffbb", 239, &[234, 155, 214, 234, 97, 1]),
+        (b"ffffeeffbb", 240, &[155, 46, 84, 96, 91, 1]),
+        (b"ffffeeffbb", 241, &[187, 48, 90, 225, 84, 1]),
+        (b"ffffeeffbb", 242, &[87, 212, 151, 140, 78, 1]),
+        (b"ffffeeffbb", 243, &[206, 22, 189, 81, 72, 1]),
+        (b"ffffeeffbb", 244, &[119, 93, 122, 48, 66, 1]),
+        (b"ffffeeffbb", 245, &[165, 224, 117, 40, 60, 1]),
+        (b"ffffeeffbb", 246, &[77, 121, 100, 57, 54, 1]),
+        (b"ffffeeffbb", 247, &[52, 128, 242, 98, 48, 1]),
+        (b"ffffeeffbb", 248, &[115, 247, 224, 164, 42, 1]),
+        (b"ffffeeffbb", 249, &[218, 127, 223, 5, 37, 1]),
+        (b"ffffeeffbb", 250, &[95, 54, 168, 118, 31, 1]),
+        (b"ffffeeffbb", 251, &[121, 204, 240, 3, 26, 1]),
+        (b"ffffeeffbb", 252, &[179, 138, 123, 162, 20, 1]),
+        (b"ffffeeffbb", 253, &[21, 50, 1, 91, 15, 1]),
+        (b"ffffeeffbb", 254, &[149, 11, 63, 40, 10, 1]),
+        (b"ffffeeffbb", 255, &[170, 225, 247, 9, 5, 1]),
+        (b"ffffeeffbb", 256, &[187, 255, 238, 255, 255]),
+    ];
+
+    for &(bigint, radix, solution) in GROUND_TRUTH.iter() {
+        let bigint = BigUint::parse_bytes(bigint, 16).unwrap();
+        assert_eq!(bigint.to_radix(radix), solution);
+    }
+}
+
 #[test]
 fn test_from_str_radix() {
     let r = to_str_pairs();