biguint.rs 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629
  1. use integer::Integer;
  2. use {BigDigit, BigUint, ToBigUint, big_digit};
  3. use {BigInt, RandBigInt, ToBigInt};
  4. use Sign::Plus;
  5. use std::cmp::Ordering::{Less, Equal, Greater};
  6. use std::{f32, f64};
  7. use std::i64;
  8. use std::iter::repeat;
  9. use std::str::FromStr;
  10. use std::{u8, u16, u32, u64, usize};
  11. use rand::thread_rng;
  12. use traits::{Num, Zero, One, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, ToPrimitive,
  13. FromPrimitive, Float};
  14. /// Assert that an op works for all val/ref combinations
  15. macro_rules! assert_op {
  16. ($left:ident $op:tt $right:ident == $expected:expr) => {
  17. assert_eq!((&$left) $op (&$right), $expected);
  18. assert_eq!((&$left) $op $right.clone(), $expected);
  19. assert_eq!($left.clone() $op (&$right), $expected);
  20. assert_eq!($left.clone() $op $right.clone(), $expected);
  21. };
  22. }
  23. /// Assert that an op works for scalar left or right
  24. macro_rules! assert_scalar_op {
  25. (($($to:ident),*) $left:ident $op:tt $right:ident == $expected:expr) => {
  26. $(
  27. if let Some(left) = $left.$to() {
  28. assert_op!(left $op $right == $expected);
  29. }
  30. if let Some(right) = $right.$to() {
  31. assert_op!($left $op right == $expected);
  32. }
  33. )*
  34. };
  35. ($left:ident $op:tt $right:ident == $expected:expr) => {
  36. assert_scalar_op!((to_u8, to_u16, to_u32, to_u64, to_usize)
  37. $left $op $right == $expected);
  38. };
  39. }
  40. #[test]
  41. fn test_from_slice() {
  42. fn check(slice: &[BigDigit], data: &[BigDigit]) {
  43. assert!(BigUint::from_slice(slice).data == data);
  44. }
  45. check(&[1], &[1]);
  46. check(&[0, 0, 0], &[]);
  47. check(&[1, 2, 0, 0], &[1, 2]);
  48. check(&[0, 0, 1, 2], &[0, 0, 1, 2]);
  49. check(&[0, 0, 1, 2, 0, 0], &[0, 0, 1, 2]);
  50. check(&[-1i32 as BigDigit], &[-1i32 as BigDigit]);
  51. }
  52. #[test]
  53. fn test_assign_from_slice() {
  54. fn check(slice: &[BigDigit], data: &[BigDigit]) {
  55. let mut p = BigUint::from_slice(&[2627_u32, 0_u32, 9182_u32, 42_u32]);
  56. p.assign_from_slice(slice);
  57. assert!(p.data == data);
  58. }
  59. check(&[1], &[1]);
  60. check(&[0, 0, 0], &[]);
  61. check(&[1, 2, 0, 0], &[1, 2]);
  62. check(&[0, 0, 1, 2], &[0, 0, 1, 2]);
  63. check(&[0, 0, 1, 2, 0, 0], &[0, 0, 1, 2]);
  64. check(&[-1i32 as BigDigit], &[-1i32 as BigDigit]);
  65. }
  66. #[test]
  67. fn test_from_bytes_be() {
  68. fn check(s: &str, result: &str) {
  69. assert_eq!(BigUint::from_bytes_be(s.as_bytes()),
  70. BigUint::parse_bytes(result.as_bytes(), 10).unwrap());
  71. }
  72. check("A", "65");
  73. check("AA", "16705");
  74. check("AB", "16706");
  75. check("Hello world!", "22405534230753963835153736737");
  76. assert_eq!(BigUint::from_bytes_be(&[]), Zero::zero());
  77. }
  78. #[test]
  79. fn test_to_bytes_be() {
  80. fn check(s: &str, result: &str) {
  81. let b = BigUint::parse_bytes(result.as_bytes(), 10).unwrap();
  82. assert_eq!(b.to_bytes_be(), s.as_bytes());
  83. }
  84. check("A", "65");
  85. check("AA", "16705");
  86. check("AB", "16706");
  87. check("Hello world!", "22405534230753963835153736737");
  88. let b: BigUint = Zero::zero();
  89. assert_eq!(b.to_bytes_be(), [0]);
  90. // Test with leading/trailing zero bytes and a full BigDigit of value 0
  91. let b = BigUint::from_str_radix("00010000000000000200", 16).unwrap();
  92. assert_eq!(b.to_bytes_be(), [1, 0, 0, 0, 0, 0, 0, 2, 0]);
  93. }
  94. #[test]
  95. fn test_from_bytes_le() {
  96. fn check(s: &str, result: &str) {
  97. assert_eq!(BigUint::from_bytes_le(s.as_bytes()),
  98. BigUint::parse_bytes(result.as_bytes(), 10).unwrap());
  99. }
  100. check("A", "65");
  101. check("AA", "16705");
  102. check("BA", "16706");
  103. check("!dlrow olleH", "22405534230753963835153736737");
  104. assert_eq!(BigUint::from_bytes_le(&[]), Zero::zero());
  105. }
  106. #[test]
  107. fn test_to_bytes_le() {
  108. fn check(s: &str, result: &str) {
  109. let b = BigUint::parse_bytes(result.as_bytes(), 10).unwrap();
  110. assert_eq!(b.to_bytes_le(), s.as_bytes());
  111. }
  112. check("A", "65");
  113. check("AA", "16705");
  114. check("BA", "16706");
  115. check("!dlrow olleH", "22405534230753963835153736737");
  116. let b: BigUint = Zero::zero();
  117. assert_eq!(b.to_bytes_le(), [0]);
  118. // Test with leading/trailing zero bytes and a full BigDigit of value 0
  119. let b = BigUint::from_str_radix("00010000000000000200", 16).unwrap();
  120. assert_eq!(b.to_bytes_le(), [0, 2, 0, 0, 0, 0, 0, 0, 1]);
  121. }
  122. #[test]
  123. fn test_cmp() {
  124. let data: [&[_]; 7] = [&[], &[1], &[2], &[!0], &[0, 1], &[2, 1], &[1, 1, 1]];
  125. let data: Vec<BigUint> = data.iter().map(|v| BigUint::from_slice(*v)).collect();
  126. for (i, ni) in data.iter().enumerate() {
  127. for (j0, nj) in data[i..].iter().enumerate() {
  128. let j = j0 + i;
  129. if i == j {
  130. assert_eq!(ni.cmp(nj), Equal);
  131. assert_eq!(nj.cmp(ni), Equal);
  132. assert_eq!(ni, nj);
  133. assert!(!(ni != nj));
  134. assert!(ni <= nj);
  135. assert!(ni >= nj);
  136. assert!(!(ni < nj));
  137. assert!(!(ni > nj));
  138. } else {
  139. assert_eq!(ni.cmp(nj), Less);
  140. assert_eq!(nj.cmp(ni), Greater);
  141. assert!(!(ni == nj));
  142. assert!(ni != nj);
  143. assert!(ni <= nj);
  144. assert!(!(ni >= nj));
  145. assert!(ni < nj);
  146. assert!(!(ni > nj));
  147. assert!(!(nj <= ni));
  148. assert!(nj >= ni);
  149. assert!(!(nj < ni));
  150. assert!(nj > ni);
  151. }
  152. }
  153. }
  154. }
  155. #[test]
  156. fn test_hash() {
  157. use hash;
  158. let a = BigUint::new(vec![]);
  159. let b = BigUint::new(vec![0]);
  160. let c = BigUint::new(vec![1]);
  161. let d = BigUint::new(vec![1, 0, 0, 0, 0, 0]);
  162. let e = BigUint::new(vec![0, 0, 0, 0, 0, 1]);
  163. assert!(hash(&a) == hash(&b));
  164. assert!(hash(&b) != hash(&c));
  165. assert!(hash(&c) == hash(&d));
  166. assert!(hash(&d) != hash(&e));
  167. }
  168. const BIT_TESTS: &'static [(&'static [BigDigit],
  169. &'static [BigDigit],
  170. &'static [BigDigit],
  171. &'static [BigDigit],
  172. &'static [BigDigit])] = &[// LEFT RIGHT AND OR XOR
  173. (&[], &[], &[], &[], &[]),
  174. (&[268, 482, 17],
  175. &[964, 54],
  176. &[260, 34],
  177. &[972, 502, 17],
  178. &[712, 468, 17])];
  179. #[test]
  180. fn test_bitand() {
  181. for elm in BIT_TESTS {
  182. let (a_vec, b_vec, c_vec, _, _) = *elm;
  183. let a = BigUint::from_slice(a_vec);
  184. let b = BigUint::from_slice(b_vec);
  185. let c = BigUint::from_slice(c_vec);
  186. assert_op!(a & b == c);
  187. assert_op!(b & a == c);
  188. }
  189. }
  190. #[test]
  191. fn test_bitor() {
  192. for elm in BIT_TESTS {
  193. let (a_vec, b_vec, _, c_vec, _) = *elm;
  194. let a = BigUint::from_slice(a_vec);
  195. let b = BigUint::from_slice(b_vec);
  196. let c = BigUint::from_slice(c_vec);
  197. assert_op!(a | b == c);
  198. assert_op!(b | a == c);
  199. }
  200. }
  201. #[test]
  202. fn test_bitxor() {
  203. for elm in BIT_TESTS {
  204. let (a_vec, b_vec, _, _, c_vec) = *elm;
  205. let a = BigUint::from_slice(a_vec);
  206. let b = BigUint::from_slice(b_vec);
  207. let c = BigUint::from_slice(c_vec);
  208. assert_op!(a ^ b == c);
  209. assert_op!(b ^ a == c);
  210. assert_op!(a ^ c == b);
  211. assert_op!(c ^ a == b);
  212. assert_op!(b ^ c == a);
  213. assert_op!(c ^ b == a);
  214. }
  215. }
  216. #[test]
  217. fn test_shl() {
  218. fn check(s: &str, shift: usize, ans: &str) {
  219. let opt_biguint = BigUint::from_str_radix(s, 16).ok();
  220. let bu = (opt_biguint.unwrap() << shift).to_str_radix(16);
  221. assert_eq!(bu, ans);
  222. }
  223. check("0", 3, "0");
  224. check("1", 3, "8");
  225. check("1\
  226. 0000\
  227. 0000\
  228. 0000\
  229. 0001\
  230. 0000\
  231. 0000\
  232. 0000\
  233. 0001",
  234. 3,
  235. "8\
  236. 0000\
  237. 0000\
  238. 0000\
  239. 0008\
  240. 0000\
  241. 0000\
  242. 0000\
  243. 0008");
  244. check("1\
  245. 0000\
  246. 0001\
  247. 0000\
  248. 0001",
  249. 2,
  250. "4\
  251. 0000\
  252. 0004\
  253. 0000\
  254. 0004");
  255. check("1\
  256. 0001\
  257. 0001",
  258. 1,
  259. "2\
  260. 0002\
  261. 0002");
  262. check("\
  263. 4000\
  264. 0000\
  265. 0000\
  266. 0000",
  267. 3,
  268. "2\
  269. 0000\
  270. 0000\
  271. 0000\
  272. 0000");
  273. check("4000\
  274. 0000",
  275. 2,
  276. "1\
  277. 0000\
  278. 0000");
  279. check("4000",
  280. 2,
  281. "1\
  282. 0000");
  283. check("4000\
  284. 0000\
  285. 0000\
  286. 0000",
  287. 67,
  288. "2\
  289. 0000\
  290. 0000\
  291. 0000\
  292. 0000\
  293. 0000\
  294. 0000\
  295. 0000\
  296. 0000");
  297. check("4000\
  298. 0000",
  299. 35,
  300. "2\
  301. 0000\
  302. 0000\
  303. 0000\
  304. 0000");
  305. check("4000",
  306. 19,
  307. "2\
  308. 0000\
  309. 0000");
  310. check("fedc\
  311. ba98\
  312. 7654\
  313. 3210\
  314. fedc\
  315. ba98\
  316. 7654\
  317. 3210",
  318. 4,
  319. "f\
  320. edcb\
  321. a987\
  322. 6543\
  323. 210f\
  324. edcb\
  325. a987\
  326. 6543\
  327. 2100");
  328. check("88887777666655554444333322221111",
  329. 16,
  330. "888877776666555544443333222211110000");
  331. }
  332. #[test]
  333. fn test_shr() {
  334. fn check(s: &str, shift: usize, ans: &str) {
  335. let opt_biguint = BigUint::from_str_radix(s, 16).ok();
  336. let bu = (opt_biguint.unwrap() >> shift).to_str_radix(16);
  337. assert_eq!(bu, ans);
  338. }
  339. check("0", 3, "0");
  340. check("f", 3, "1");
  341. check("1\
  342. 0000\
  343. 0000\
  344. 0000\
  345. 0001\
  346. 0000\
  347. 0000\
  348. 0000\
  349. 0001",
  350. 3,
  351. "2000\
  352. 0000\
  353. 0000\
  354. 0000\
  355. 2000\
  356. 0000\
  357. 0000\
  358. 0000");
  359. check("1\
  360. 0000\
  361. 0001\
  362. 0000\
  363. 0001",
  364. 2,
  365. "4000\
  366. 0000\
  367. 4000\
  368. 0000");
  369. check("1\
  370. 0001\
  371. 0001",
  372. 1,
  373. "8000\
  374. 8000");
  375. check("2\
  376. 0000\
  377. 0000\
  378. 0000\
  379. 0001\
  380. 0000\
  381. 0000\
  382. 0000\
  383. 0001",
  384. 67,
  385. "4000\
  386. 0000\
  387. 0000\
  388. 0000");
  389. check("2\
  390. 0000\
  391. 0001\
  392. 0000\
  393. 0001",
  394. 35,
  395. "4000\
  396. 0000");
  397. check("2\
  398. 0001\
  399. 0001",
  400. 19,
  401. "4000");
  402. check("1\
  403. 0000\
  404. 0000\
  405. 0000\
  406. 0000",
  407. 1,
  408. "8000\
  409. 0000\
  410. 0000\
  411. 0000");
  412. check("1\
  413. 0000\
  414. 0000",
  415. 1,
  416. "8000\
  417. 0000");
  418. check("1\
  419. 0000",
  420. 1,
  421. "8000");
  422. check("f\
  423. edcb\
  424. a987\
  425. 6543\
  426. 210f\
  427. edcb\
  428. a987\
  429. 6543\
  430. 2100",
  431. 4,
  432. "fedc\
  433. ba98\
  434. 7654\
  435. 3210\
  436. fedc\
  437. ba98\
  438. 7654\
  439. 3210");
  440. check("888877776666555544443333222211110000",
  441. 16,
  442. "88887777666655554444333322221111");
  443. }
  444. const N1: BigDigit = -1i32 as BigDigit;
  445. const N2: BigDigit = -2i32 as BigDigit;
  446. // `DoubleBigDigit` size dependent
  447. #[test]
  448. fn test_convert_i64() {
  449. fn check(b1: BigUint, i: i64) {
  450. let b2: BigUint = FromPrimitive::from_i64(i).unwrap();
  451. assert_eq!(b1, b2);
  452. assert_eq!(b1.to_i64().unwrap(), i);
  453. }
  454. check(Zero::zero(), 0);
  455. check(One::one(), 1);
  456. check(i64::MAX.to_biguint().unwrap(), i64::MAX);
  457. check(BigUint::new(vec![]), 0);
  458. check(BigUint::new(vec![1]), (1 << (0 * big_digit::BITS)));
  459. check(BigUint::new(vec![N1]), (1 << (1 * big_digit::BITS)) - 1);
  460. check(BigUint::new(vec![0, 1]), (1 << (1 * big_digit::BITS)));
  461. check(BigUint::new(vec![N1, N1 >> 1]), i64::MAX);
  462. assert_eq!(i64::MIN.to_biguint(), None);
  463. assert_eq!(BigUint::new(vec![N1, N1]).to_i64(), None);
  464. assert_eq!(BigUint::new(vec![0, 0, 1]).to_i64(), None);
  465. assert_eq!(BigUint::new(vec![N1, N1, N1]).to_i64(), None);
  466. }
  467. // `DoubleBigDigit` size dependent
  468. #[test]
  469. fn test_convert_u64() {
  470. fn check(b1: BigUint, u: u64) {
  471. let b2: BigUint = FromPrimitive::from_u64(u).unwrap();
  472. assert_eq!(b1, b2);
  473. assert_eq!(b1.to_u64().unwrap(), u);
  474. }
  475. check(Zero::zero(), 0);
  476. check(One::one(), 1);
  477. check(u64::MIN.to_biguint().unwrap(), u64::MIN);
  478. check(u64::MAX.to_biguint().unwrap(), u64::MAX);
  479. check(BigUint::new(vec![]), 0);
  480. check(BigUint::new(vec![1]), (1 << (0 * big_digit::BITS)));
  481. check(BigUint::new(vec![N1]), (1 << (1 * big_digit::BITS)) - 1);
  482. check(BigUint::new(vec![0, 1]), (1 << (1 * big_digit::BITS)));
  483. check(BigUint::new(vec![N1, N1]), u64::MAX);
  484. assert_eq!(BigUint::new(vec![0, 0, 1]).to_u64(), None);
  485. assert_eq!(BigUint::new(vec![N1, N1, N1]).to_u64(), None);
  486. }
  487. #[test]
  488. fn test_convert_f32() {
  489. fn check(b1: &BigUint, f: f32) {
  490. let b2 = BigUint::from_f32(f).unwrap();
  491. assert_eq!(b1, &b2);
  492. assert_eq!(b1.to_f32().unwrap(), f);
  493. }
  494. check(&BigUint::zero(), 0.0);
  495. check(&BigUint::one(), 1.0);
  496. check(&BigUint::from(u16::MAX), 2.0.powi(16) - 1.0);
  497. check(&BigUint::from(1u64 << 32), 2.0.powi(32));
  498. check(&BigUint::from_slice(&[0, 0, 1]), 2.0.powi(64));
  499. check(&((BigUint::one() << 100) + (BigUint::one() << 123)),
  500. 2.0.powi(100) + 2.0.powi(123));
  501. check(&(BigUint::one() << 127), 2.0.powi(127));
  502. check(&(BigUint::from((1u64 << 24) - 1) << (128 - 24)), f32::MAX);
  503. // keeping all 24 digits with the bits at different offsets to the BigDigits
  504. let x: u32 = 0b00000000101111011111011011011101;
  505. let mut f = x as f32;
  506. let mut b = BigUint::from(x);
  507. for _ in 0..64 {
  508. check(&b, f);
  509. f *= 2.0;
  510. b = b << 1;
  511. }
  512. // this number when rounded to f64 then f32 isn't the same as when rounded straight to f32
  513. let n: u64 = 0b0000000000111111111111111111111111011111111111111111111111111111;
  514. assert!((n as f64) as f32 != n as f32);
  515. assert_eq!(BigUint::from(n).to_f32(), Some(n as f32));
  516. // test rounding up with the bits at different offsets to the BigDigits
  517. let mut f = ((1u64 << 25) - 1) as f32;
  518. let mut b = BigUint::from(1u64 << 25);
  519. for _ in 0..64 {
  520. assert_eq!(b.to_f32(), Some(f));
  521. f *= 2.0;
  522. b = b << 1;
  523. }
  524. // rounding
  525. assert_eq!(BigUint::from_f32(-1.0), None);
  526. assert_eq!(BigUint::from_f32(-0.99999), Some(BigUint::zero()));
  527. assert_eq!(BigUint::from_f32(-0.5), Some(BigUint::zero()));
  528. assert_eq!(BigUint::from_f32(-0.0), Some(BigUint::zero()));
  529. assert_eq!(BigUint::from_f32(f32::MIN_POSITIVE / 2.0),
  530. Some(BigUint::zero()));
  531. assert_eq!(BigUint::from_f32(f32::MIN_POSITIVE), Some(BigUint::zero()));
  532. assert_eq!(BigUint::from_f32(0.5), Some(BigUint::zero()));
  533. assert_eq!(BigUint::from_f32(0.99999), Some(BigUint::zero()));
  534. assert_eq!(BigUint::from_f32(f32::consts::E), Some(BigUint::from(2u32)));
  535. assert_eq!(BigUint::from_f32(f32::consts::PI),
  536. Some(BigUint::from(3u32)));
  537. // special float values
  538. assert_eq!(BigUint::from_f32(f32::NAN), None);
  539. assert_eq!(BigUint::from_f32(f32::INFINITY), None);
  540. assert_eq!(BigUint::from_f32(f32::NEG_INFINITY), None);
  541. assert_eq!(BigUint::from_f32(f32::MIN), None);
  542. // largest BigUint that will round to a finite f32 value
  543. let big_num = (BigUint::one() << 128) - BigUint::one() - (BigUint::one() << (128 - 25));
  544. assert_eq!(big_num.to_f32(), Some(f32::MAX));
  545. assert_eq!((big_num + BigUint::one()).to_f32(), None);
  546. assert_eq!(((BigUint::one() << 128) - BigUint::one()).to_f32(), None);
  547. assert_eq!((BigUint::one() << 128).to_f32(), None);
  548. }
  549. #[test]
  550. fn test_convert_f64() {
  551. fn check(b1: &BigUint, f: f64) {
  552. let b2 = BigUint::from_f64(f).unwrap();
  553. assert_eq!(b1, &b2);
  554. assert_eq!(b1.to_f64().unwrap(), f);
  555. }
  556. check(&BigUint::zero(), 0.0);
  557. check(&BigUint::one(), 1.0);
  558. check(&BigUint::from(u32::MAX), 2.0.powi(32) - 1.0);
  559. check(&BigUint::from(1u64 << 32), 2.0.powi(32));
  560. check(&BigUint::from_slice(&[0, 0, 1]), 2.0.powi(64));
  561. check(&((BigUint::one() << 100) + (BigUint::one() << 152)),
  562. 2.0.powi(100) + 2.0.powi(152));
  563. check(&(BigUint::one() << 1023), 2.0.powi(1023));
  564. check(&(BigUint::from((1u64 << 53) - 1) << (1024 - 53)), f64::MAX);
  565. // keeping all 53 digits with the bits at different offsets to the BigDigits
  566. let x: u64 = 0b0000000000011110111110110111111101110111101111011111011011011101;
  567. let mut f = x as f64;
  568. let mut b = BigUint::from(x);
  569. for _ in 0..128 {
  570. check(&b, f);
  571. f *= 2.0;
  572. b = b << 1;
  573. }
  574. // test rounding up with the bits at different offsets to the BigDigits
  575. let mut f = ((1u64 << 54) - 1) as f64;
  576. let mut b = BigUint::from(1u64 << 54);
  577. for _ in 0..128 {
  578. assert_eq!(b.to_f64(), Some(f));
  579. f *= 2.0;
  580. b = b << 1;
  581. }
  582. // rounding
  583. assert_eq!(BigUint::from_f64(-1.0), None);
  584. assert_eq!(BigUint::from_f64(-0.99999), Some(BigUint::zero()));
  585. assert_eq!(BigUint::from_f64(-0.5), Some(BigUint::zero()));
  586. assert_eq!(BigUint::from_f64(-0.0), Some(BigUint::zero()));
  587. assert_eq!(BigUint::from_f64(f64::MIN_POSITIVE / 2.0),
  588. Some(BigUint::zero()));
  589. assert_eq!(BigUint::from_f64(f64::MIN_POSITIVE), Some(BigUint::zero()));
  590. assert_eq!(BigUint::from_f64(0.5), Some(BigUint::zero()));
  591. assert_eq!(BigUint::from_f64(0.99999), Some(BigUint::zero()));
  592. assert_eq!(BigUint::from_f64(f64::consts::E), Some(BigUint::from(2u32)));
  593. assert_eq!(BigUint::from_f64(f64::consts::PI),
  594. Some(BigUint::from(3u32)));
  595. // special float values
  596. assert_eq!(BigUint::from_f64(f64::NAN), None);
  597. assert_eq!(BigUint::from_f64(f64::INFINITY), None);
  598. assert_eq!(BigUint::from_f64(f64::NEG_INFINITY), None);
  599. assert_eq!(BigUint::from_f64(f64::MIN), None);
  600. // largest BigUint that will round to a finite f64 value
  601. let big_num = (BigUint::one() << 1024) - BigUint::one() - (BigUint::one() << (1024 - 54));
  602. assert_eq!(big_num.to_f64(), Some(f64::MAX));
  603. assert_eq!((big_num + BigUint::one()).to_f64(), None);
  604. assert_eq!(((BigInt::one() << 1024) - BigInt::one()).to_f64(), None);
  605. assert_eq!((BigUint::one() << 1024).to_f64(), None);
  606. }
  607. #[test]
  608. fn test_convert_to_bigint() {
  609. fn check(n: BigUint, ans: BigInt) {
  610. assert_eq!(n.to_bigint().unwrap(), ans);
  611. assert_eq!(n.to_bigint().unwrap().to_biguint().unwrap(), n);
  612. }
  613. check(Zero::zero(), Zero::zero());
  614. check(BigUint::new(vec![1, 2, 3]),
  615. BigInt::from_biguint(Plus, BigUint::new(vec![1, 2, 3])));
  616. }
  617. #[test]
  618. fn test_convert_from_uint() {
  619. macro_rules! check {
  620. ($ty:ident, $max:expr) => {
  621. assert_eq!(BigUint::from($ty::zero()), BigUint::zero());
  622. assert_eq!(BigUint::from($ty::one()), BigUint::one());
  623. assert_eq!(BigUint::from($ty::MAX - $ty::one()), $max - BigUint::one());
  624. assert_eq!(BigUint::from($ty::MAX), $max);
  625. }
  626. }
  627. check!(u8, BigUint::from_slice(&[u8::MAX as BigDigit]));
  628. check!(u16, BigUint::from_slice(&[u16::MAX as BigDigit]));
  629. check!(u32, BigUint::from_slice(&[u32::MAX]));
  630. check!(u64, BigUint::from_slice(&[u32::MAX, u32::MAX]));
  631. check!(usize, BigUint::from(usize::MAX as u64));
  632. }
  633. const SUM_TRIPLES: &'static [(&'static [BigDigit],
  634. &'static [BigDigit],
  635. &'static [BigDigit])] = &[(&[], &[], &[]),
  636. (&[], &[1], &[1]),
  637. (&[1], &[1], &[2]),
  638. (&[1], &[1, 1], &[2, 1]),
  639. (&[1], &[N1], &[0, 1]),
  640. (&[1], &[N1, N1], &[0, 0, 1]),
  641. (&[N1, N1], &[N1, N1], &[N2, N1, 1]),
  642. (&[1, 1, 1], &[N1, N1], &[0, 1, 2]),
  643. (&[2, 2, 1], &[N1, N2], &[1, 1, 2])];
  644. #[test]
  645. fn test_add() {
  646. for elm in SUM_TRIPLES.iter() {
  647. let (a_vec, b_vec, c_vec) = *elm;
  648. let a = BigUint::from_slice(a_vec);
  649. let b = BigUint::from_slice(b_vec);
  650. let c = BigUint::from_slice(c_vec);
  651. assert_op!(a + b == c);
  652. assert_op!(b + a == c);
  653. }
  654. }
  655. #[test]
  656. fn test_scalar_add() {
  657. for elm in SUM_TRIPLES.iter() {
  658. let (a_vec, b_vec, c_vec) = *elm;
  659. let a = BigUint::from_slice(a_vec);
  660. let b = BigUint::from_slice(b_vec);
  661. let c = BigUint::from_slice(c_vec);
  662. assert_scalar_op!(a + b == c);
  663. assert_scalar_op!(b + a == c);
  664. }
  665. }
  666. #[test]
  667. fn test_sub() {
  668. for elm in SUM_TRIPLES.iter() {
  669. let (a_vec, b_vec, c_vec) = *elm;
  670. let a = BigUint::from_slice(a_vec);
  671. let b = BigUint::from_slice(b_vec);
  672. let c = BigUint::from_slice(c_vec);
  673. assert_op!(c - a == b);
  674. assert_op!(c - b == a);
  675. }
  676. }
  677. #[test]
  678. fn test_scalar_sub() {
  679. for elm in SUM_TRIPLES.iter() {
  680. let (a_vec, b_vec, c_vec) = *elm;
  681. let a = BigUint::from_slice(a_vec);
  682. let b = BigUint::from_slice(b_vec);
  683. let c = BigUint::from_slice(c_vec);
  684. assert_scalar_op!(c - a == b);
  685. assert_scalar_op!(c - b == a);
  686. }
  687. }
  688. #[test]
  689. #[should_panic]
  690. fn test_sub_fail_on_underflow() {
  691. let (a, b): (BigUint, BigUint) = (Zero::zero(), One::one());
  692. a - b;
  693. }
  694. const M: u32 = ::std::u32::MAX;
  695. const MUL_TRIPLES: &'static [(&'static [BigDigit],
  696. &'static [BigDigit],
  697. &'static [BigDigit])] = &[(&[], &[], &[]),
  698. (&[], &[1], &[]),
  699. (&[2], &[], &[]),
  700. (&[1], &[1], &[1]),
  701. (&[2], &[3], &[6]),
  702. (&[1], &[1, 1, 1], &[1, 1, 1]),
  703. (&[1, 2, 3], &[3], &[3, 6, 9]),
  704. (&[1, 1, 1], &[N1], &[N1, N1, N1]),
  705. (&[1, 2, 3], &[N1], &[N1, N2, N2, 2]),
  706. (&[1, 2, 3, 4], &[N1], &[N1, N2, N2, N2, 3]),
  707. (&[N1], &[N1], &[1, N2]),
  708. (&[N1, N1], &[N1], &[1, N1, N2]),
  709. (&[N1, N1, N1], &[N1], &[1, N1, N1, N2]),
  710. (&[N1, N1, N1, N1], &[N1], &[1, N1, N1, N1, N2]),
  711. (&[M / 2 + 1], &[2], &[0, 1]),
  712. (&[0, M / 2 + 1], &[2], &[0, 0, 1]),
  713. (&[1, 2], &[1, 2, 3], &[1, 4, 7, 6]),
  714. (&[N1, N1], &[N1, N1, N1], &[1, 0, N1, N2, N1]),
  715. (&[N1, N1, N1],
  716. &[N1, N1, N1, N1],
  717. &[1, 0, 0, N1, N2, N1, N1]),
  718. (&[0, 0, 1], &[1, 2, 3], &[0, 0, 1, 2, 3]),
  719. (&[0, 0, 1], &[0, 0, 0, 1], &[0, 0, 0, 0, 0, 1])];
  720. const DIV_REM_QUADRUPLES: &'static [(&'static [BigDigit],
  721. &'static [BigDigit],
  722. &'static [BigDigit],
  723. &'static [BigDigit])] = &[(&[1], &[2], &[], &[1]),
  724. (&[3], &[2], &[1], &[1]),
  725. (&[1, 1], &[2], &[M / 2 + 1], &[1]),
  726. (&[1, 1, 1], &[2], &[M / 2 + 1, M / 2 + 1], &[1]),
  727. (&[0, 1], &[N1], &[1], &[1]),
  728. (&[N1, N1], &[N2], &[2, 1], &[3])];
  729. #[test]
  730. fn test_mul() {
  731. for elm in MUL_TRIPLES.iter() {
  732. let (a_vec, b_vec, c_vec) = *elm;
  733. let a = BigUint::from_slice(a_vec);
  734. let b = BigUint::from_slice(b_vec);
  735. let c = BigUint::from_slice(c_vec);
  736. assert_op!(a * b == c);
  737. assert_op!(b * a == c);
  738. }
  739. for elm in DIV_REM_QUADRUPLES.iter() {
  740. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  741. let a = BigUint::from_slice(a_vec);
  742. let b = BigUint::from_slice(b_vec);
  743. let c = BigUint::from_slice(c_vec);
  744. let d = BigUint::from_slice(d_vec);
  745. assert!(a == &b * &c + &d);
  746. assert!(a == &c * &b + &d);
  747. }
  748. }
  749. #[test]
  750. fn test_scalar_mul() {
  751. for elm in MUL_TRIPLES.iter() {
  752. let (a_vec, b_vec, c_vec) = *elm;
  753. let a = BigUint::from_slice(a_vec);
  754. let b = BigUint::from_slice(b_vec);
  755. let c = BigUint::from_slice(c_vec);
  756. assert_scalar_op!(a * b == c);
  757. assert_scalar_op!(b * a == c);
  758. }
  759. }
  760. #[test]
  761. fn test_div_rem() {
  762. for elm in MUL_TRIPLES.iter() {
  763. let (a_vec, b_vec, c_vec) = *elm;
  764. let a = BigUint::from_slice(a_vec);
  765. let b = BigUint::from_slice(b_vec);
  766. let c = BigUint::from_slice(c_vec);
  767. if !a.is_zero() {
  768. assert_op!(c / a == b);
  769. assert_op!(c % a == Zero::zero());
  770. assert_eq!(c.div_rem(&a), (b.clone(), Zero::zero()));
  771. }
  772. if !b.is_zero() {
  773. assert_op!(c / b == a);
  774. assert_op!(c % b == Zero::zero());
  775. assert_eq!(c.div_rem(&b), (a.clone(), Zero::zero()));
  776. }
  777. }
  778. for elm in DIV_REM_QUADRUPLES.iter() {
  779. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  780. let a = BigUint::from_slice(a_vec);
  781. let b = BigUint::from_slice(b_vec);
  782. let c = BigUint::from_slice(c_vec);
  783. let d = BigUint::from_slice(d_vec);
  784. if !b.is_zero() {
  785. assert_op!(a / b == c);
  786. assert_op!(a % b == d);
  787. assert!(a.div_rem(&b) == (c, d));
  788. }
  789. }
  790. }
  791. #[test]
  792. fn test_scalar_div_rem() {
  793. for elm in MUL_TRIPLES.iter() {
  794. let (a_vec, b_vec, c_vec) = *elm;
  795. let a = BigUint::from_slice(a_vec);
  796. let b = BigUint::from_slice(b_vec);
  797. let c = BigUint::from_slice(c_vec);
  798. if !a.is_zero() {
  799. assert_scalar_op!(c / a == b);
  800. assert_scalar_op!(c % a == Zero::zero());
  801. }
  802. if !b.is_zero() {
  803. assert_scalar_op!(c / b == a);
  804. assert_scalar_op!(c % b == Zero::zero());
  805. }
  806. }
  807. for elm in DIV_REM_QUADRUPLES.iter() {
  808. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  809. let a = BigUint::from_slice(a_vec);
  810. let b = BigUint::from_slice(b_vec);
  811. let c = BigUint::from_slice(c_vec);
  812. let d = BigUint::from_slice(d_vec);
  813. if !b.is_zero() {
  814. assert_scalar_op!(a / b == c);
  815. assert_scalar_op!(a % b == d);
  816. }
  817. }
  818. }
  819. #[test]
  820. fn test_checked_add() {
  821. for elm in SUM_TRIPLES.iter() {
  822. let (a_vec, b_vec, c_vec) = *elm;
  823. let a = BigUint::from_slice(a_vec);
  824. let b = BigUint::from_slice(b_vec);
  825. let c = BigUint::from_slice(c_vec);
  826. assert!(a.checked_add(&b).unwrap() == c);
  827. assert!(b.checked_add(&a).unwrap() == c);
  828. }
  829. }
  830. #[test]
  831. fn test_checked_sub() {
  832. for elm in SUM_TRIPLES.iter() {
  833. let (a_vec, b_vec, c_vec) = *elm;
  834. let a = BigUint::from_slice(a_vec);
  835. let b = BigUint::from_slice(b_vec);
  836. let c = BigUint::from_slice(c_vec);
  837. assert!(c.checked_sub(&a).unwrap() == b);
  838. assert!(c.checked_sub(&b).unwrap() == a);
  839. if a > c {
  840. assert!(a.checked_sub(&c).is_none());
  841. }
  842. if b > c {
  843. assert!(b.checked_sub(&c).is_none());
  844. }
  845. }
  846. }
  847. #[test]
  848. fn test_checked_mul() {
  849. for elm in MUL_TRIPLES.iter() {
  850. let (a_vec, b_vec, c_vec) = *elm;
  851. let a = BigUint::from_slice(a_vec);
  852. let b = BigUint::from_slice(b_vec);
  853. let c = BigUint::from_slice(c_vec);
  854. assert!(a.checked_mul(&b).unwrap() == c);
  855. assert!(b.checked_mul(&a).unwrap() == c);
  856. }
  857. for elm in DIV_REM_QUADRUPLES.iter() {
  858. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  859. let a = BigUint::from_slice(a_vec);
  860. let b = BigUint::from_slice(b_vec);
  861. let c = BigUint::from_slice(c_vec);
  862. let d = BigUint::from_slice(d_vec);
  863. assert!(a == b.checked_mul(&c).unwrap() + &d);
  864. assert!(a == c.checked_mul(&b).unwrap() + &d);
  865. }
  866. }
  867. #[test]
  868. fn test_mul_overflow() {
  869. /* Test for issue #187 - overflow due to mac3 incorrectly sizing temporary */
  870. let s = "531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502232636710047537552105951370000796528760829212940754539968588340162273730474622005920097370111";
  871. let a: BigUint = s.parse().unwrap();
  872. let b = a.clone();
  873. let _ = a.checked_mul(&b);
  874. }
  875. #[test]
  876. fn test_checked_div() {
  877. for elm in MUL_TRIPLES.iter() {
  878. let (a_vec, b_vec, c_vec) = *elm;
  879. let a = BigUint::from_slice(a_vec);
  880. let b = BigUint::from_slice(b_vec);
  881. let c = BigUint::from_slice(c_vec);
  882. if !a.is_zero() {
  883. assert!(c.checked_div(&a).unwrap() == b);
  884. }
  885. if !b.is_zero() {
  886. assert!(c.checked_div(&b).unwrap() == a);
  887. }
  888. assert!(c.checked_div(&Zero::zero()).is_none());
  889. }
  890. }
  891. #[test]
  892. fn test_gcd() {
  893. fn check(a: usize, b: usize, c: usize) {
  894. let big_a: BigUint = FromPrimitive::from_usize(a).unwrap();
  895. let big_b: BigUint = FromPrimitive::from_usize(b).unwrap();
  896. let big_c: BigUint = FromPrimitive::from_usize(c).unwrap();
  897. assert_eq!(big_a.gcd(&big_b), big_c);
  898. }
  899. check(10, 2, 2);
  900. check(10, 3, 1);
  901. check(0, 3, 3);
  902. check(3, 3, 3);
  903. check(56, 42, 14);
  904. }
  905. #[test]
  906. fn test_lcm() {
  907. fn check(a: usize, b: usize, c: usize) {
  908. let big_a: BigUint = FromPrimitive::from_usize(a).unwrap();
  909. let big_b: BigUint = FromPrimitive::from_usize(b).unwrap();
  910. let big_c: BigUint = FromPrimitive::from_usize(c).unwrap();
  911. assert_eq!(big_a.lcm(&big_b), big_c);
  912. }
  913. check(1, 0, 0);
  914. check(0, 1, 0);
  915. check(1, 1, 1);
  916. check(8, 9, 72);
  917. check(11, 5, 55);
  918. check(99, 17, 1683);
  919. }
  920. #[test]
  921. fn test_is_even() {
  922. let one: BigUint = FromStr::from_str("1").unwrap();
  923. let two: BigUint = FromStr::from_str("2").unwrap();
  924. let thousand: BigUint = FromStr::from_str("1000").unwrap();
  925. let big: BigUint = FromStr::from_str("1000000000000000000000").unwrap();
  926. let bigger: BigUint = FromStr::from_str("1000000000000000000001").unwrap();
  927. assert!(one.is_odd());
  928. assert!(two.is_even());
  929. assert!(thousand.is_even());
  930. assert!(big.is_even());
  931. assert!(bigger.is_odd());
  932. assert!((&one << 64).is_even());
  933. assert!(((&one << 64) + one).is_odd());
  934. }
  935. fn to_str_pairs() -> Vec<(BigUint, Vec<(u32, String)>)> {
  936. let bits = big_digit::BITS;
  937. vec![(Zero::zero(),
  938. vec![(2, "0".to_string()), (3, "0".to_string())]),
  939. (BigUint::from_slice(&[0xff]),
  940. vec![(2, "11111111".to_string()),
  941. (3, "100110".to_string()),
  942. (4, "3333".to_string()),
  943. (5, "2010".to_string()),
  944. (6, "1103".to_string()),
  945. (7, "513".to_string()),
  946. (8, "377".to_string()),
  947. (9, "313".to_string()),
  948. (10, "255".to_string()),
  949. (11, "212".to_string()),
  950. (12, "193".to_string()),
  951. (13, "168".to_string()),
  952. (14, "143".to_string()),
  953. (15, "120".to_string()),
  954. (16, "ff".to_string())]),
  955. (BigUint::from_slice(&[0xfff]),
  956. vec![(2, "111111111111".to_string()),
  957. (4, "333333".to_string()),
  958. (16, "fff".to_string())]),
  959. (BigUint::from_slice(&[1, 2]),
  960. vec![(2,
  961. format!("10{}1", repeat("0").take(bits - 1).collect::<String>())),
  962. (4,
  963. format!("2{}1", repeat("0").take(bits / 2 - 1).collect::<String>())),
  964. (10,
  965. match bits {
  966. 64 => "36893488147419103233".to_string(),
  967. 32 => "8589934593".to_string(),
  968. 16 => "131073".to_string(),
  969. _ => panic!(),
  970. }),
  971. (16,
  972. format!("2{}1", repeat("0").take(bits / 4 - 1).collect::<String>()))]),
  973. (BigUint::from_slice(&[1, 2, 3]),
  974. vec![(2,
  975. format!("11{}10{}1",
  976. repeat("0").take(bits - 2).collect::<String>(),
  977. repeat("0").take(bits - 1).collect::<String>())),
  978. (4,
  979. format!("3{}2{}1",
  980. repeat("0").take(bits / 2 - 1).collect::<String>(),
  981. repeat("0").take(bits / 2 - 1).collect::<String>())),
  982. (8,
  983. match bits {
  984. 64 => "14000000000000000000004000000000000000000001".to_string(),
  985. 32 => "6000000000100000000001".to_string(),
  986. 16 => "140000400001".to_string(),
  987. _ => panic!(),
  988. }),
  989. (10,
  990. match bits {
  991. 64 => "1020847100762815390427017310442723737601".to_string(),
  992. 32 => "55340232229718589441".to_string(),
  993. 16 => "12885032961".to_string(),
  994. _ => panic!(),
  995. }),
  996. (16,
  997. format!("3{}2{}1",
  998. repeat("0").take(bits / 4 - 1).collect::<String>(),
  999. repeat("0").take(bits / 4 - 1).collect::<String>()))])]
  1000. }
  1001. #[test]
  1002. fn test_to_str_radix() {
  1003. let r = to_str_pairs();
  1004. for num_pair in r.iter() {
  1005. let &(ref n, ref rs) = num_pair;
  1006. for str_pair in rs.iter() {
  1007. let &(ref radix, ref str) = str_pair;
  1008. assert_eq!(n.to_str_radix(*radix), *str);
  1009. }
  1010. }
  1011. }
  1012. #[test]
  1013. fn test_from_and_to_radix() {
  1014. const GROUND_TRUTH : &'static[(&'static[u8], u32, &'static[u8])] = &[
  1015. (b"0", 42, &[0]),
  1016. (b"ffffeeffbb", 2, &[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
  1017. 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1018. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
  1019. (b"ffffeeffbb", 3, &[2, 2, 1, 1, 2, 1, 1, 2, 0, 0, 0, 0, 0, 1, 2,
  1020. 0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 1]),
  1021. (b"ffffeeffbb", 4, &[3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3,
  1022. 3, 3, 3, 3, 3]),
  1023. (b"ffffeeffbb", 5, &[0, 4, 3, 3, 1, 4, 2, 4, 1, 4, 4, 2, 3, 0, 0,
  1024. 1, 2, 1]),
  1025. (b"ffffeeffbb", 6, &[5, 5, 4, 5, 5, 0, 0, 1, 2, 5, 3, 0, 1, 0, 2, 2]),
  1026. (b"ffffeeffbb", 7, &[4, 2, 3, 6, 0, 1, 6, 1, 6, 2, 0, 3, 2, 4, 1]),
  1027. (b"ffffeeffbb", 8, &[3, 7, 6, 7, 7, 5, 3, 7, 7, 7, 7, 7, 7, 1]),
  1028. (b"ffffeeffbb", 9, &[8, 4, 5, 7, 0, 0, 3, 2, 0, 3, 0, 8, 3]),
  1029. (b"ffffeeffbb", 10, &[5, 9, 5, 3, 1, 5, 0, 1, 5, 9, 9, 0, 1]),
  1030. (b"ffffeeffbb", 11, &[10, 7, 6, 5, 2, 0, 3, 3, 3, 4, 9, 3]),
  1031. (b"ffffeeffbb", 12, &[11, 8, 5, 10, 1, 10, 3, 1, 1, 9, 5, 1]),
  1032. (b"ffffeeffbb", 13, &[0, 5, 7, 4, 6, 5, 6, 11, 8, 12, 7]),
  1033. (b"ffffeeffbb", 14, &[11, 4, 4, 11, 8, 4, 6, 0, 3, 11, 3]),
  1034. (b"ffffeeffbb", 15, &[5, 11, 13, 2, 1, 10, 2, 0, 9, 13, 1]),
  1035. (b"ffffeeffbb", 16, &[11, 11, 15, 15, 14, 14, 15, 15, 15, 15]),
  1036. (b"ffffeeffbb", 17, &[0, 2, 14, 12, 2, 14, 8, 10, 4, 9]),
  1037. (b"ffffeeffbb", 18, &[17, 15, 5, 13, 10, 16, 16, 13, 9, 5]),
  1038. (b"ffffeeffbb", 19, &[14, 13, 2, 8, 9, 0, 1, 14, 7, 3]),
  1039. (b"ffffeeffbb", 20, &[15, 19, 3, 14, 0, 17, 19, 18, 2, 2]),
  1040. (b"ffffeeffbb", 21, &[11, 5, 4, 13, 5, 18, 9, 1, 8, 1]),
  1041. (b"ffffeeffbb", 22, &[21, 3, 7, 21, 15, 12, 17, 0, 20]),
  1042. (b"ffffeeffbb", 23, &[21, 21, 6, 9, 10, 7, 21, 0, 14]),
  1043. (b"ffffeeffbb", 24, &[11, 10, 19, 14, 22, 11, 17, 23, 9]),
  1044. (b"ffffeeffbb", 25, &[20, 18, 21, 22, 21, 14, 3, 5, 7]),
  1045. (b"ffffeeffbb", 26, &[13, 15, 24, 11, 17, 6, 23, 6, 5]),
  1046. (b"ffffeeffbb", 27, &[17, 16, 7, 0, 21, 0, 3, 24, 3]),
  1047. (b"ffffeeffbb", 28, &[11, 16, 11, 15, 14, 18, 13, 25, 2]),
  1048. (b"ffffeeffbb", 29, &[6, 8, 7, 19, 14, 13, 21, 5, 2]),
  1049. (b"ffffeeffbb", 30, &[5, 13, 18, 11, 10, 7, 8, 20, 1]),
  1050. (b"ffffeeffbb", 31, &[22, 26, 15, 19, 8, 27, 29, 8, 1]),
  1051. (b"ffffeeffbb", 32, &[27, 29, 31, 29, 30, 31, 31, 31]),
  1052. (b"ffffeeffbb", 33, &[32, 20, 27, 12, 1, 12, 26, 25]),
  1053. (b"ffffeeffbb", 34, &[17, 9, 16, 33, 13, 25, 31, 20]),
  1054. (b"ffffeeffbb", 35, &[25, 32, 2, 25, 11, 4, 3, 17]),
  1055. (b"ffffeeffbb", 36, &[35, 34, 5, 6, 32, 3, 1, 14]),
  1056. (b"ffffeeffbb", 37, &[16, 21, 18, 4, 33, 19, 21, 11]),
  1057. (b"ffffeeffbb", 38, &[33, 25, 19, 29, 20, 6, 23, 9]),
  1058. (b"ffffeeffbb", 39, &[26, 27, 29, 23, 16, 18, 0, 8]),
  1059. (b"ffffeeffbb", 40, &[35, 39, 30, 11, 16, 17, 28, 6]),
  1060. (b"ffffeeffbb", 41, &[36, 30, 9, 18, 12, 19, 26, 5]),
  1061. (b"ffffeeffbb", 42, &[11, 34, 37, 27, 1, 13, 32, 4]),
  1062. (b"ffffeeffbb", 43, &[3, 24, 11, 2, 10, 40, 1, 4]),
  1063. (b"ffffeeffbb", 44, &[43, 12, 40, 32, 3, 23, 19, 3]),
  1064. (b"ffffeeffbb", 45, &[35, 38, 44, 18, 22, 18, 42, 2]),
  1065. (b"ffffeeffbb", 46, &[21, 45, 18, 41, 17, 2, 24, 2]),
  1066. (b"ffffeeffbb", 47, &[37, 37, 11, 12, 6, 0, 8, 2]),
  1067. (b"ffffeeffbb", 48, &[11, 41, 40, 43, 5, 43, 41, 1]),
  1068. (b"ffffeeffbb", 49, &[18, 45, 7, 13, 20, 21, 30, 1]),
  1069. (b"ffffeeffbb", 50, &[45, 21, 5, 34, 21, 18, 20, 1]),
  1070. (b"ffffeeffbb", 51, &[17, 6, 26, 22, 38, 24, 11, 1]),
  1071. (b"ffffeeffbb", 52, &[39, 33, 38, 30, 46, 31, 3, 1]),
  1072. (b"ffffeeffbb", 53, &[31, 7, 44, 23, 9, 32, 49]),
  1073. (b"ffffeeffbb", 54, &[17, 35, 8, 37, 31, 18, 44]),
  1074. (b"ffffeeffbb", 55, &[10, 52, 9, 48, 36, 39, 39]),
  1075. (b"ffffeeffbb", 56, &[11, 50, 51, 22, 25, 36, 35]),
  1076. (b"ffffeeffbb", 57, &[14, 55, 12, 43, 20, 3, 32]),
  1077. (b"ffffeeffbb", 58, &[35, 18, 45, 56, 9, 51, 28]),
  1078. (b"ffffeeffbb", 59, &[51, 28, 20, 26, 55, 3, 26]),
  1079. (b"ffffeeffbb", 60, &[35, 6, 27, 46, 58, 33, 23]),
  1080. (b"ffffeeffbb", 61, &[58, 7, 6, 54, 49, 20, 21]),
  1081. (b"ffffeeffbb", 62, &[53, 59, 3, 14, 10, 22, 19]),
  1082. (b"ffffeeffbb", 63, &[53, 50, 23, 4, 56, 36, 17]),
  1083. (b"ffffeeffbb", 64, &[59, 62, 47, 59, 63, 63, 15]),
  1084. (b"ffffeeffbb", 65, &[0, 53, 39, 4, 40, 37, 14]),
  1085. (b"ffffeeffbb", 66, &[65, 59, 39, 1, 64, 19, 13]),
  1086. (b"ffffeeffbb", 67, &[35, 14, 19, 16, 25, 10, 12]),
  1087. (b"ffffeeffbb", 68, &[51, 38, 63, 50, 15, 8, 11]),
  1088. (b"ffffeeffbb", 69, &[44, 45, 18, 58, 68, 12, 10]),
  1089. (b"ffffeeffbb", 70, &[25, 51, 0, 60, 13, 24, 9]),
  1090. (b"ffffeeffbb", 71, &[54, 30, 9, 65, 28, 41, 8]),
  1091. (b"ffffeeffbb", 72, &[35, 35, 55, 54, 17, 64, 7]),
  1092. (b"ffffeeffbb", 73, &[34, 4, 48, 40, 27, 19, 7]),
  1093. (b"ffffeeffbb", 74, &[53, 47, 4, 56, 36, 51, 6]),
  1094. (b"ffffeeffbb", 75, &[20, 56, 10, 72, 24, 13, 6]),
  1095. (b"ffffeeffbb", 76, &[71, 31, 52, 60, 48, 53, 5]),
  1096. (b"ffffeeffbb", 77, &[32, 73, 14, 63, 15, 21, 5]),
  1097. (b"ffffeeffbb", 78, &[65, 13, 17, 32, 64, 68, 4]),
  1098. (b"ffffeeffbb", 79, &[37, 56, 2, 56, 25, 41, 4]),
  1099. (b"ffffeeffbb", 80, &[75, 59, 37, 41, 43, 15, 4]),
  1100. (b"ffffeeffbb", 81, &[44, 68, 0, 21, 27, 72, 3]),
  1101. (b"ffffeeffbb", 82, &[77, 35, 2, 74, 46, 50, 3]),
  1102. (b"ffffeeffbb", 83, &[52, 51, 19, 76, 10, 30, 3]),
  1103. (b"ffffeeffbb", 84, &[11, 80, 19, 19, 76, 10, 3]),
  1104. (b"ffffeeffbb", 85, &[0, 82, 20, 14, 68, 77, 2]),
  1105. (b"ffffeeffbb", 86, &[3, 12, 78, 37, 62, 61, 2]),
  1106. (b"ffffeeffbb", 87, &[35, 12, 20, 8, 52, 46, 2]),
  1107. (b"ffffeeffbb", 88, &[43, 6, 54, 42, 30, 32, 2]),
  1108. (b"ffffeeffbb", 89, &[49, 52, 85, 21, 80, 18, 2]),
  1109. (b"ffffeeffbb", 90, &[35, 64, 78, 24, 18, 6, 2]),
  1110. (b"ffffeeffbb", 91, &[39, 17, 83, 63, 17, 85, 1]),
  1111. (b"ffffeeffbb", 92, &[67, 22, 85, 79, 75, 74, 1]),
  1112. (b"ffffeeffbb", 93, &[53, 60, 39, 29, 4, 65, 1]),
  1113. (b"ffffeeffbb", 94, &[37, 89, 2, 72, 76, 55, 1]),
  1114. (b"ffffeeffbb", 95, &[90, 74, 89, 9, 9, 47, 1]),
  1115. (b"ffffeeffbb", 96, &[59, 20, 46, 35, 81, 38, 1]),
  1116. (b"ffffeeffbb", 97, &[94, 87, 60, 71, 3, 31, 1]),
  1117. (b"ffffeeffbb", 98, &[67, 22, 63, 50, 62, 23, 1]),
  1118. (b"ffffeeffbb", 99, &[98, 6, 69, 12, 61, 16, 1]),
  1119. (b"ffffeeffbb", 100, &[95, 35, 51, 10, 95, 9, 1]),
  1120. (b"ffffeeffbb", 101, &[87, 27, 7, 8, 62, 3, 1]),
  1121. (b"ffffeeffbb", 102, &[17, 3, 32, 79, 59, 99]),
  1122. (b"ffffeeffbb", 103, &[30, 22, 90, 0, 87, 94]),
  1123. (b"ffffeeffbb", 104, &[91, 68, 87, 68, 38, 90]),
  1124. (b"ffffeeffbb", 105, &[95, 80, 54, 73, 15, 86]),
  1125. (b"ffffeeffbb", 106, &[31, 30, 24, 16, 17, 82]),
  1126. (b"ffffeeffbb", 107, &[51, 50, 10, 12, 42, 78]),
  1127. (b"ffffeeffbb", 108, &[71, 71, 96, 78, 89, 74]),
  1128. (b"ffffeeffbb", 109, &[33, 18, 93, 22, 50, 71]),
  1129. (b"ffffeeffbb", 110, &[65, 53, 57, 88, 29, 68]),
  1130. (b"ffffeeffbb", 111, &[53, 93, 67, 90, 27, 65]),
  1131. (b"ffffeeffbb", 112, &[11, 109, 96, 65, 43, 62]),
  1132. (b"ffffeeffbb", 113, &[27, 23, 106, 56, 76, 59]),
  1133. (b"ffffeeffbb", 114, &[71, 84, 31, 112, 11, 57]),
  1134. (b"ffffeeffbb", 115, &[90, 22, 1, 56, 76, 54]),
  1135. (b"ffffeeffbb", 116, &[35, 38, 98, 57, 40, 52]),
  1136. (b"ffffeeffbb", 117, &[26, 113, 115, 62, 17, 50]),
  1137. (b"ffffeeffbb", 118, &[51, 14, 5, 18, 7, 48]),
  1138. (b"ffffeeffbb", 119, &[102, 31, 110, 108, 8, 46]),
  1139. (b"ffffeeffbb", 120, &[35, 93, 96, 50, 22, 44]),
  1140. (b"ffffeeffbb", 121, &[87, 61, 2, 36, 47, 42]),
  1141. (b"ffffeeffbb", 122, &[119, 64, 1, 22, 83, 40]),
  1142. (b"ffffeeffbb", 123, &[77, 119, 32, 90, 6, 39]),
  1143. (b"ffffeeffbb", 124, &[115, 122, 31, 79, 62, 37]),
  1144. (b"ffffeeffbb", 125, &[95, 108, 47, 74, 3, 36]),
  1145. (b"ffffeeffbb", 126, &[53, 25, 116, 39, 78, 34]),
  1146. (b"ffffeeffbb", 127, &[22, 23, 125, 67, 35, 33]),
  1147. (b"ffffeeffbb", 128, &[59, 127, 59, 127, 127, 31]),
  1148. (b"ffffeeffbb", 129, &[89, 36, 1, 59, 100, 30]),
  1149. (b"ffffeeffbb", 130, &[65, 91, 123, 89, 79, 29]),
  1150. (b"ffffeeffbb", 131, &[58, 72, 39, 63, 65, 28]),
  1151. (b"ffffeeffbb", 132, &[131, 62, 92, 82, 57, 27]),
  1152. (b"ffffeeffbb", 133, &[109, 31, 51, 123, 55, 26]),
  1153. (b"ffffeeffbb", 134, &[35, 74, 21, 27, 60, 25]),
  1154. (b"ffffeeffbb", 135, &[125, 132, 49, 37, 70, 24]),
  1155. (b"ffffeeffbb", 136, &[51, 121, 117, 133, 85, 23]),
  1156. (b"ffffeeffbb", 137, &[113, 60, 135, 22, 107, 22]),
  1157. (b"ffffeeffbb", 138, &[113, 91, 73, 93, 133, 21]),
  1158. (b"ffffeeffbb", 139, &[114, 75, 102, 51, 26, 21]),
  1159. (b"ffffeeffbb", 140, &[95, 25, 35, 16, 62, 20]),
  1160. (b"ffffeeffbb", 141, &[131, 137, 16, 110, 102, 19]),
  1161. (b"ffffeeffbb", 142, &[125, 121, 108, 34, 6, 19]),
  1162. (b"ffffeeffbb", 143, &[65, 78, 138, 55, 55, 18]),
  1163. (b"ffffeeffbb", 144, &[107, 125, 121, 15, 109, 17]),
  1164. (b"ffffeeffbb", 145, &[35, 13, 122, 42, 22, 17]),
  1165. (b"ffffeeffbb", 146, &[107, 38, 103, 123, 83, 16]),
  1166. (b"ffffeeffbb", 147, &[116, 96, 71, 98, 2, 16]),
  1167. (b"ffffeeffbb", 148, &[127, 23, 75, 99, 71, 15]),
  1168. (b"ffffeeffbb", 149, &[136, 110, 53, 114, 144, 14]),
  1169. (b"ffffeeffbb", 150, &[95, 140, 133, 130, 71, 14]),
  1170. (b"ffffeeffbb", 151, &[15, 50, 29, 137, 0, 14]),
  1171. (b"ffffeeffbb", 152, &[147, 15, 89, 121, 83, 13]),
  1172. (b"ffffeeffbb", 153, &[17, 87, 93, 72, 17, 13]),
  1173. (b"ffffeeffbb", 154, &[109, 113, 3, 133, 106, 12]),
  1174. (b"ffffeeffbb", 155, &[115, 141, 120, 139, 44, 12]),
  1175. (b"ffffeeffbb", 156, &[143, 45, 4, 82, 140, 11]),
  1176. (b"ffffeeffbb", 157, &[149, 92, 15, 106, 82, 11]),
  1177. (b"ffffeeffbb", 158, &[37, 107, 79, 46, 26, 11]),
  1178. (b"ffffeeffbb", 159, &[137, 37, 146, 51, 130, 10]),
  1179. (b"ffffeeffbb", 160, &[155, 69, 29, 115, 77, 10]),
  1180. (b"ffffeeffbb", 161, &[67, 98, 46, 68, 26, 10]),
  1181. (b"ffffeeffbb", 162, &[125, 155, 60, 63, 138, 9]),
  1182. (b"ffffeeffbb", 163, &[96, 43, 118, 93, 90, 9]),
  1183. (b"ffffeeffbb", 164, &[159, 99, 123, 152, 43, 9]),
  1184. (b"ffffeeffbb", 165, &[65, 17, 1, 69, 163, 8]),
  1185. (b"ffffeeffbb", 166, &[135, 108, 25, 165, 119, 8]),
  1186. (b"ffffeeffbb", 167, &[165, 116, 164, 103, 77, 8]),
  1187. (b"ffffeeffbb", 168, &[11, 166, 67, 44, 36, 8]),
  1188. (b"ffffeeffbb", 169, &[65, 59, 71, 149, 164, 7]),
  1189. (b"ffffeeffbb", 170, &[85, 83, 26, 76, 126, 7]),
  1190. (b"ffffeeffbb", 171, &[71, 132, 140, 157, 88, 7]),
  1191. (b"ffffeeffbb", 172, &[3, 6, 127, 47, 52, 7]),
  1192. (b"ffffeeffbb", 173, &[122, 66, 53, 83, 16, 7]),
  1193. (b"ffffeeffbb", 174, &[35, 6, 5, 88, 155, 6]),
  1194. (b"ffffeeffbb", 175, &[95, 20, 84, 56, 122, 6]),
  1195. (b"ffffeeffbb", 176, &[43, 91, 57, 159, 89, 6]),
  1196. (b"ffffeeffbb", 177, &[110, 127, 54, 40, 58, 6]),
  1197. (b"ffffeeffbb", 178, &[49, 115, 43, 47, 27, 6]),
  1198. (b"ffffeeffbb", 179, &[130, 91, 4, 178, 175, 5]),
  1199. (b"ffffeeffbb", 180, &[35, 122, 109, 70, 147, 5]),
  1200. (b"ffffeeffbb", 181, &[94, 94, 4, 79, 119, 5]),
  1201. (b"ffffeeffbb", 182, &[39, 54, 66, 19, 92, 5]),
  1202. (b"ffffeeffbb", 183, &[119, 2, 143, 69, 65, 5]),
  1203. (b"ffffeeffbb", 184, &[67, 57, 90, 44, 39, 5]),
  1204. (b"ffffeeffbb", 185, &[90, 63, 141, 123, 13, 5]),
  1205. (b"ffffeeffbb", 186, &[53, 123, 172, 119, 174, 4]),
  1206. (b"ffffeeffbb", 187, &[153, 21, 68, 28, 151, 4]),
  1207. (b"ffffeeffbb", 188, &[131, 138, 94, 32, 128, 4]),
  1208. (b"ffffeeffbb", 189, &[179, 121, 156, 130, 105, 4]),
  1209. (b"ffffeeffbb", 190, &[185, 179, 164, 131, 83, 4]),
  1210. (b"ffffeeffbb", 191, &[118, 123, 37, 31, 62, 4]),
  1211. (b"ffffeeffbb", 192, &[59, 106, 83, 16, 41, 4]),
  1212. (b"ffffeeffbb", 193, &[57, 37, 47, 86, 20, 4]),
  1213. (b"ffffeeffbb", 194, &[191, 140, 63, 45, 0, 4]),
  1214. (b"ffffeeffbb", 195, &[65, 169, 83, 84, 175, 3]),
  1215. (b"ffffeeffbb", 196, &[67, 158, 64, 6, 157, 3]),
  1216. (b"ffffeeffbb", 197, &[121, 26, 167, 3, 139, 3]),
  1217. (b"ffffeeffbb", 198, &[197, 151, 165, 75, 121, 3]),
  1218. (b"ffffeeffbb", 199, &[55, 175, 36, 22, 104, 3]),
  1219. (b"ffffeeffbb", 200, &[195, 167, 162, 38, 87, 3]),
  1220. (b"ffffeeffbb", 201, &[35, 27, 136, 124, 70, 3]),
  1221. (b"ffffeeffbb", 202, &[87, 64, 153, 76, 54, 3]),
  1222. (b"ffffeeffbb", 203, &[151, 191, 14, 94, 38, 3]),
  1223. (b"ffffeeffbb", 204, &[119, 103, 135, 175, 22, 3]),
  1224. (b"ffffeeffbb", 205, &[200, 79, 123, 115, 7, 3]),
  1225. (b"ffffeeffbb", 206, &[133, 165, 202, 115, 198, 2]),
  1226. (b"ffffeeffbb", 207, &[44, 153, 193, 175, 184, 2]),
  1227. (b"ffffeeffbb", 208, &[91, 190, 125, 86, 171, 2]),
  1228. (b"ffffeeffbb", 209, &[109, 151, 34, 53, 158, 2]),
  1229. (b"ffffeeffbb", 210, &[95, 40, 171, 74, 145, 2]),
  1230. (b"ffffeeffbb", 211, &[84, 195, 162, 150, 132, 2]),
  1231. (b"ffffeeffbb", 212, &[31, 15, 59, 68, 120, 2]),
  1232. (b"ffffeeffbb", 213, &[125, 57, 127, 36, 108, 2]),
  1233. (b"ffffeeffbb", 214, &[51, 132, 2, 55, 96, 2]),
  1234. (b"ffffeeffbb", 215, &[175, 133, 177, 122, 84, 2]),
  1235. (b"ffffeeffbb", 216, &[179, 35, 78, 23, 73, 2]),
  1236. (b"ffffeeffbb", 217, &[53, 101, 208, 186, 61, 2]),
  1237. (b"ffffeeffbb", 218, &[33, 9, 214, 179, 50, 2]),
  1238. (b"ffffeeffbb", 219, &[107, 147, 175, 217, 39, 2]),
  1239. (b"ffffeeffbb", 220, &[175, 81, 179, 79, 29, 2]),
  1240. (b"ffffeeffbb", 221, &[0, 76, 95, 204, 18, 2]),
  1241. (b"ffffeeffbb", 222, &[53, 213, 16, 150, 8, 2]),
  1242. (b"ffffeeffbb", 223, &[158, 161, 42, 136, 221, 1]),
  1243. (b"ffffeeffbb", 224, &[123, 54, 52, 162, 212, 1]),
  1244. (b"ffffeeffbb", 225, &[170, 43, 151, 2, 204, 1]),
  1245. (b"ffffeeffbb", 226, &[27, 68, 224, 105, 195, 1]),
  1246. (b"ffffeeffbb", 227, &[45, 69, 157, 20, 187, 1]),
  1247. (b"ffffeeffbb", 228, &[71, 213, 64, 199, 178, 1]),
  1248. (b"ffffeeffbb", 229, &[129, 203, 66, 186, 170, 1]),
  1249. (b"ffffeeffbb", 230, &[205, 183, 57, 208, 162, 1]),
  1250. (b"ffffeeffbb", 231, &[32, 50, 164, 33, 155, 1]),
  1251. (b"ffffeeffbb", 232, &[35, 135, 53, 123, 147, 1]),
  1252. (b"ffffeeffbb", 233, &[209, 47, 89, 13, 140, 1]),
  1253. (b"ffffeeffbb", 234, &[143, 56, 175, 168, 132, 1]),
  1254. (b"ffffeeffbb", 235, &[225, 157, 216, 121, 125, 1]),
  1255. (b"ffffeeffbb", 236, &[51, 66, 119, 105, 118, 1]),
  1256. (b"ffffeeffbb", 237, &[116, 150, 26, 119, 111, 1]),
  1257. (b"ffffeeffbb", 238, &[221, 15, 87, 162, 104, 1]),
  1258. (b"ffffeeffbb", 239, &[234, 155, 214, 234, 97, 1]),
  1259. (b"ffffeeffbb", 240, &[155, 46, 84, 96, 91, 1]),
  1260. (b"ffffeeffbb", 241, &[187, 48, 90, 225, 84, 1]),
  1261. (b"ffffeeffbb", 242, &[87, 212, 151, 140, 78, 1]),
  1262. (b"ffffeeffbb", 243, &[206, 22, 189, 81, 72, 1]),
  1263. (b"ffffeeffbb", 244, &[119, 93, 122, 48, 66, 1]),
  1264. (b"ffffeeffbb", 245, &[165, 224, 117, 40, 60, 1]),
  1265. (b"ffffeeffbb", 246, &[77, 121, 100, 57, 54, 1]),
  1266. (b"ffffeeffbb", 247, &[52, 128, 242, 98, 48, 1]),
  1267. (b"ffffeeffbb", 248, &[115, 247, 224, 164, 42, 1]),
  1268. (b"ffffeeffbb", 249, &[218, 127, 223, 5, 37, 1]),
  1269. (b"ffffeeffbb", 250, &[95, 54, 168, 118, 31, 1]),
  1270. (b"ffffeeffbb", 251, &[121, 204, 240, 3, 26, 1]),
  1271. (b"ffffeeffbb", 252, &[179, 138, 123, 162, 20, 1]),
  1272. (b"ffffeeffbb", 253, &[21, 50, 1, 91, 15, 1]),
  1273. (b"ffffeeffbb", 254, &[149, 11, 63, 40, 10, 1]),
  1274. (b"ffffeeffbb", 255, &[170, 225, 247, 9, 5, 1]),
  1275. (b"ffffeeffbb", 256, &[187, 255, 238, 255, 255]),
  1276. ];
  1277. for &(bigint, radix, inbaseradix_le) in GROUND_TRUTH.iter() {
  1278. let bigint = BigUint::parse_bytes(bigint, 16).unwrap();
  1279. // to_radix_le
  1280. assert_eq!(bigint.to_radix_le(radix), inbaseradix_le);
  1281. // to_radix_be
  1282. let mut inbase_be = bigint.to_radix_be(radix);
  1283. inbase_be.reverse(); // now le
  1284. assert_eq!(inbase_be, inbaseradix_le);
  1285. // from_radix_le
  1286. assert_eq!(BigUint::from_radix_le(inbaseradix_le, radix).unwrap(), bigint);
  1287. // from_radix_be
  1288. let mut inbaseradix_be = Vec::from(inbaseradix_le);
  1289. inbaseradix_be.reverse();
  1290. assert_eq!(BigUint::from_radix_be(&inbaseradix_be, radix).unwrap(), bigint);
  1291. }
  1292. assert!(BigUint::from_radix_le(&[10,100,10], 50).is_none());
  1293. }
  1294. #[test]
  1295. fn test_from_str_radix() {
  1296. let r = to_str_pairs();
  1297. for num_pair in r.iter() {
  1298. let &(ref n, ref rs) = num_pair;
  1299. for str_pair in rs.iter() {
  1300. let &(ref radix, ref str) = str_pair;
  1301. assert_eq!(n, &BigUint::from_str_radix(str, *radix).unwrap());
  1302. }
  1303. }
  1304. let zed = BigUint::from_str_radix("Z", 10).ok();
  1305. assert_eq!(zed, None);
  1306. let blank = BigUint::from_str_radix("_", 2).ok();
  1307. assert_eq!(blank, None);
  1308. let plus_one = BigUint::from_str_radix("+1", 10).ok();
  1309. assert_eq!(plus_one, Some(BigUint::from_slice(&[1])));
  1310. let plus_plus_one = BigUint::from_str_radix("++1", 10).ok();
  1311. assert_eq!(plus_plus_one, None);
  1312. let minus_one = BigUint::from_str_radix("-1", 10).ok();
  1313. assert_eq!(minus_one, None);
  1314. let zero_plus_two = BigUint::from_str_radix("0+2", 10).ok();
  1315. assert_eq!(zero_plus_two, None);
  1316. }
  1317. #[test]
  1318. fn test_all_str_radix() {
  1319. use std::ascii::AsciiExt;
  1320. let n = BigUint::new((0..10).collect());
  1321. for radix in 2..37 {
  1322. let s = n.to_str_radix(radix);
  1323. let x = BigUint::from_str_radix(&s, radix);
  1324. assert_eq!(x.unwrap(), n);
  1325. let s = s.to_ascii_uppercase();
  1326. let x = BigUint::from_str_radix(&s, radix);
  1327. assert_eq!(x.unwrap(), n);
  1328. }
  1329. }
  1330. #[test]
  1331. fn test_lower_hex() {
  1332. let a = BigUint::parse_bytes(b"A", 16).unwrap();
  1333. let hello = BigUint::parse_bytes("22405534230753963835153736737".as_bytes(), 10).unwrap();
  1334. assert_eq!(format!("{:x}", a), "a");
  1335. assert_eq!(format!("{:x}", hello), "48656c6c6f20776f726c6421");
  1336. assert_eq!(format!("{:♥>+#8x}", a), "♥♥♥♥+0xa");
  1337. }
  1338. #[test]
  1339. fn test_upper_hex() {
  1340. let a = BigUint::parse_bytes(b"A", 16).unwrap();
  1341. let hello = BigUint::parse_bytes("22405534230753963835153736737".as_bytes(), 10).unwrap();
  1342. assert_eq!(format!("{:X}", a), "A");
  1343. assert_eq!(format!("{:X}", hello), "48656C6C6F20776F726C6421");
  1344. assert_eq!(format!("{:♥>+#8X}", a), "♥♥♥♥+0xA");
  1345. }
  1346. #[test]
  1347. fn test_binary() {
  1348. let a = BigUint::parse_bytes(b"A", 16).unwrap();
  1349. let hello = BigUint::parse_bytes("224055342307539".as_bytes(), 10).unwrap();
  1350. assert_eq!(format!("{:b}", a), "1010");
  1351. assert_eq!(format!("{:b}", hello),
  1352. "110010111100011011110011000101101001100011010011");
  1353. assert_eq!(format!("{:♥>+#8b}", a), "♥+0b1010");
  1354. }
  1355. #[test]
  1356. fn test_octal() {
  1357. let a = BigUint::parse_bytes(b"A", 16).unwrap();
  1358. let hello = BigUint::parse_bytes("22405534230753963835153736737".as_bytes(), 10).unwrap();
  1359. assert_eq!(format!("{:o}", a), "12");
  1360. assert_eq!(format!("{:o}", hello), "22062554330674403566756233062041");
  1361. assert_eq!(format!("{:♥>+#8o}", a), "♥♥♥+0o12");
  1362. }
  1363. #[test]
  1364. fn test_display() {
  1365. let a = BigUint::parse_bytes(b"A", 16).unwrap();
  1366. let hello = BigUint::parse_bytes("22405534230753963835153736737".as_bytes(), 10).unwrap();
  1367. assert_eq!(format!("{}", a), "10");
  1368. assert_eq!(format!("{}", hello), "22405534230753963835153736737");
  1369. assert_eq!(format!("{:♥>+#8}", a), "♥♥♥♥♥+10");
  1370. }
  1371. #[test]
  1372. fn test_factor() {
  1373. fn factor(n: usize) -> BigUint {
  1374. let mut f: BigUint = One::one();
  1375. for i in 2..n + 1 {
  1376. // FIXME(#5992): assignment operator overloads
  1377. // f *= FromPrimitive::from_usize(i);
  1378. let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
  1379. f = f * bu;
  1380. }
  1381. return f;
  1382. }
  1383. fn check(n: usize, s: &str) {
  1384. let n = factor(n);
  1385. let ans = match BigUint::from_str_radix(s, 10) {
  1386. Ok(x) => x,
  1387. Err(_) => panic!(),
  1388. };
  1389. assert_eq!(n, ans);
  1390. }
  1391. check(3, "6");
  1392. check(10, "3628800");
  1393. check(20, "2432902008176640000");
  1394. check(30, "265252859812191058636308480000000");
  1395. }
  1396. #[test]
  1397. fn test_bits() {
  1398. assert_eq!(BigUint::new(vec![0, 0, 0, 0]).bits(), 0);
  1399. let n: BigUint = FromPrimitive::from_usize(0).unwrap();
  1400. assert_eq!(n.bits(), 0);
  1401. let n: BigUint = FromPrimitive::from_usize(1).unwrap();
  1402. assert_eq!(n.bits(), 1);
  1403. let n: BigUint = FromPrimitive::from_usize(3).unwrap();
  1404. assert_eq!(n.bits(), 2);
  1405. let n: BigUint = BigUint::from_str_radix("4000000000", 16).unwrap();
  1406. assert_eq!(n.bits(), 39);
  1407. let one: BigUint = One::one();
  1408. assert_eq!((one << 426).bits(), 427);
  1409. }
  1410. #[test]
  1411. fn test_rand() {
  1412. let mut rng = thread_rng();
  1413. let _n: BigUint = rng.gen_biguint(137);
  1414. assert!(rng.gen_biguint(0).is_zero());
  1415. }
  1416. #[test]
  1417. fn test_rand_range() {
  1418. let mut rng = thread_rng();
  1419. for _ in 0..10 {
  1420. assert_eq!(rng.gen_bigint_range(&FromPrimitive::from_usize(236).unwrap(),
  1421. &FromPrimitive::from_usize(237).unwrap()),
  1422. FromPrimitive::from_usize(236).unwrap());
  1423. }
  1424. let l = FromPrimitive::from_usize(403469000 + 2352).unwrap();
  1425. let u = FromPrimitive::from_usize(403469000 + 3513).unwrap();
  1426. for _ in 0..1000 {
  1427. let n: BigUint = rng.gen_biguint_below(&u);
  1428. assert!(n < u);
  1429. let n: BigUint = rng.gen_biguint_range(&l, &u);
  1430. assert!(n >= l);
  1431. assert!(n < u);
  1432. }
  1433. }
  1434. #[test]
  1435. #[should_panic]
  1436. fn test_zero_rand_range() {
  1437. thread_rng().gen_biguint_range(&FromPrimitive::from_usize(54).unwrap(),
  1438. &FromPrimitive::from_usize(54).unwrap());
  1439. }
  1440. #[test]
  1441. #[should_panic]
  1442. fn test_negative_rand_range() {
  1443. let mut rng = thread_rng();
  1444. let l = FromPrimitive::from_usize(2352).unwrap();
  1445. let u = FromPrimitive::from_usize(3513).unwrap();
  1446. // Switching u and l should fail:
  1447. let _n: BigUint = rng.gen_biguint_range(&u, &l);
  1448. }
  1449. fn test_mul_divide_torture_count(count: usize) {
  1450. use rand::{SeedableRng, StdRng, Rng};
  1451. let bits_max = 1 << 12;
  1452. let seed: &[_] = &[1, 2, 3, 4];
  1453. let mut rng: StdRng = SeedableRng::from_seed(seed);
  1454. for _ in 0..count {
  1455. // Test with numbers of random sizes:
  1456. let xbits = rng.gen_range(0, bits_max);
  1457. let ybits = rng.gen_range(0, bits_max);
  1458. let x = rng.gen_biguint(xbits);
  1459. let y = rng.gen_biguint(ybits);
  1460. if x.is_zero() || y.is_zero() {
  1461. continue;
  1462. }
  1463. let prod = &x * &y;
  1464. assert_eq!(&prod / &x, y);
  1465. assert_eq!(&prod / &y, x);
  1466. }
  1467. }
  1468. #[test]
  1469. fn test_mul_divide_torture() {
  1470. test_mul_divide_torture_count(1000);
  1471. }
  1472. #[test]
  1473. #[ignore]
  1474. fn test_mul_divide_torture_long() {
  1475. test_mul_divide_torture_count(1000000);
  1476. }