biguint.rs 59 KB

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