bigint.rs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194
  1. use {BigDigit, BigUint, big_digit};
  2. use {Sign, BigInt, RandBigInt, ToBigInt};
  3. use Sign::{Minus, NoSign, Plus};
  4. use std::cmp::Ordering::{Less, Equal, Greater};
  5. use std::{f32, f64};
  6. use std::{i8, i16, i32, i64, isize};
  7. use std::iter::repeat;
  8. use std::{u8, u16, u32, u64, usize};
  9. use std::ops::Neg;
  10. use rand::thread_rng;
  11. use integer::Integer;
  12. use traits::{Zero, One, Signed, ToPrimitive, FromPrimitive, Num, Float};
  13. /// Assert that an op works for all val/ref combinations
  14. macro_rules! assert_op {
  15. ($left:ident $op:tt $right:ident == $expected:expr) => {
  16. assert_eq!((&$left) $op (&$right), $expected);
  17. assert_eq!((&$left) $op $right.clone(), $expected);
  18. assert_eq!($left.clone() $op (&$right), $expected);
  19. assert_eq!($left.clone() $op $right.clone(), $expected);
  20. };
  21. }
  22. /// Assert that an op works for scalar left or right
  23. macro_rules! assert_scalar_op {
  24. (($($to:ident),*) $left:ident $op:tt $right:ident == $expected:expr) => {
  25. $(
  26. if let Some(left) = $left.$to() {
  27. assert_op!(left $op $right == $expected);
  28. }
  29. if let Some(right) = $right.$to() {
  30. assert_op!($left $op right == $expected);
  31. }
  32. )*
  33. };
  34. ($left:ident $op:tt $right:ident == $expected:expr) => {
  35. assert_scalar_op!((to_u8, to_u16, to_u32, to_u64, to_usize,
  36. to_i8, to_i16, to_i32, to_i64, to_isize)
  37. $left $op $right == $expected);
  38. };
  39. }
  40. #[test]
  41. fn test_from_biguint() {
  42. fn check(inp_s: Sign, inp_n: usize, ans_s: Sign, ans_n: usize) {
  43. let inp = BigInt::from_biguint(inp_s, FromPrimitive::from_usize(inp_n).unwrap());
  44. let ans = BigInt {
  45. sign: ans_s,
  46. data: FromPrimitive::from_usize(ans_n).unwrap(),
  47. };
  48. assert_eq!(inp, ans);
  49. }
  50. check(Plus, 1, Plus, 1);
  51. check(Plus, 0, NoSign, 0);
  52. check(Minus, 1, Minus, 1);
  53. check(NoSign, 1, NoSign, 0);
  54. }
  55. #[test]
  56. fn test_from_slice() {
  57. fn check(inp_s: Sign, inp_n: u32, ans_s: Sign, ans_n: u32) {
  58. let inp = BigInt::from_slice(inp_s, &[inp_n]);
  59. let ans = BigInt {
  60. sign: ans_s,
  61. data: FromPrimitive::from_u32(ans_n).unwrap(),
  62. };
  63. assert_eq!(inp, ans);
  64. }
  65. check(Plus, 1, Plus, 1);
  66. check(Plus, 0, NoSign, 0);
  67. check(Minus, 1, Minus, 1);
  68. check(NoSign, 1, NoSign, 0);
  69. }
  70. #[test]
  71. fn test_assign_from_slice() {
  72. fn check(inp_s: Sign, inp_n: u32, ans_s: Sign, ans_n: u32) {
  73. let mut inp = BigInt::from_slice(Minus, &[2627_u32, 0_u32, 9182_u32, 42_u32]);
  74. inp.assign_from_slice(inp_s, &[inp_n]);
  75. let ans = BigInt {
  76. sign: ans_s,
  77. data: FromPrimitive::from_u32(ans_n).unwrap(),
  78. };
  79. assert_eq!(inp, ans);
  80. }
  81. check(Plus, 1, Plus, 1);
  82. check(Plus, 0, NoSign, 0);
  83. check(Minus, 1, Minus, 1);
  84. check(NoSign, 1, NoSign, 0);
  85. }
  86. #[test]
  87. fn test_from_bytes_be() {
  88. fn check(s: &str, result: &str) {
  89. assert_eq!(BigInt::from_bytes_be(Plus, s.as_bytes()),
  90. BigInt::parse_bytes(result.as_bytes(), 10).unwrap());
  91. }
  92. check("A", "65");
  93. check("AA", "16705");
  94. check("AB", "16706");
  95. check("Hello world!", "22405534230753963835153736737");
  96. assert_eq!(BigInt::from_bytes_be(Plus, &[]), Zero::zero());
  97. assert_eq!(BigInt::from_bytes_be(Minus, &[]), Zero::zero());
  98. }
  99. #[test]
  100. fn test_to_bytes_be() {
  101. fn check(s: &str, result: &str) {
  102. let b = BigInt::parse_bytes(result.as_bytes(), 10).unwrap();
  103. let (sign, v) = b.to_bytes_be();
  104. assert_eq!((Plus, s.as_bytes()), (sign, &*v));
  105. }
  106. check("A", "65");
  107. check("AA", "16705");
  108. check("AB", "16706");
  109. check("Hello world!", "22405534230753963835153736737");
  110. let b: BigInt = Zero::zero();
  111. assert_eq!(b.to_bytes_be(), (NoSign, vec![0]));
  112. // Test with leading/trailing zero bytes and a full BigDigit of value 0
  113. let b = BigInt::from_str_radix("00010000000000000200", 16).unwrap();
  114. assert_eq!(b.to_bytes_be(), (Plus, vec![1, 0, 0, 0, 0, 0, 0, 2, 0]));
  115. }
  116. #[test]
  117. fn test_from_bytes_le() {
  118. fn check(s: &str, result: &str) {
  119. assert_eq!(BigInt::from_bytes_le(Plus, s.as_bytes()),
  120. BigInt::parse_bytes(result.as_bytes(), 10).unwrap());
  121. }
  122. check("A", "65");
  123. check("AA", "16705");
  124. check("BA", "16706");
  125. check("!dlrow olleH", "22405534230753963835153736737");
  126. assert_eq!(BigInt::from_bytes_le(Plus, &[]), Zero::zero());
  127. assert_eq!(BigInt::from_bytes_le(Minus, &[]), Zero::zero());
  128. }
  129. #[test]
  130. fn test_to_bytes_le() {
  131. fn check(s: &str, result: &str) {
  132. let b = BigInt::parse_bytes(result.as_bytes(), 10).unwrap();
  133. let (sign, v) = b.to_bytes_le();
  134. assert_eq!((Plus, s.as_bytes()), (sign, &*v));
  135. }
  136. check("A", "65");
  137. check("AA", "16705");
  138. check("BA", "16706");
  139. check("!dlrow olleH", "22405534230753963835153736737");
  140. let b: BigInt = Zero::zero();
  141. assert_eq!(b.to_bytes_le(), (NoSign, vec![0]));
  142. // Test with leading/trailing zero bytes and a full BigDigit of value 0
  143. let b = BigInt::from_str_radix("00010000000000000200", 16).unwrap();
  144. assert_eq!(b.to_bytes_le(), (Plus, vec![0, 2, 0, 0, 0, 0, 0, 0, 1]));
  145. }
  146. #[test]
  147. fn test_to_signed_bytes_le() {
  148. fn check(s: &str, result: Vec<u8>) {
  149. assert_eq!(BigInt::parse_bytes(s.as_bytes(), 10).unwrap().to_signed_bytes_le(),
  150. result);
  151. }
  152. check("0", vec![0]);
  153. check("32767", vec![0xff, 0x7f]);
  154. check("-1", vec![0xff]);
  155. check("16777216", vec![0, 0, 0, 1]);
  156. check("-100", vec![156]);
  157. check("-8388608", vec![0, 0, 0x80]);
  158. check("-192", vec![0x40, 0xff]);
  159. }
  160. #[test]
  161. fn test_from_signed_bytes_le() {
  162. fn check(s: &[u8], result: &str) {
  163. assert_eq!(BigInt::from_signed_bytes_le(s),
  164. BigInt::parse_bytes(result.as_bytes(), 10).unwrap());
  165. }
  166. check(&[], "0");
  167. check(&[0], "0");
  168. check(&[0; 10], "0");
  169. check(&[0xff, 0x7f], "32767");
  170. check(&[0xff], "-1");
  171. check(&[0, 0, 0, 1], "16777216");
  172. check(&[156], "-100");
  173. check(&[0, 0, 0x80], "-8388608");
  174. check(&[0xff; 10], "-1");
  175. check(&[0x40, 0xff], "-192");
  176. }
  177. #[test]
  178. fn test_to_signed_bytes_be() {
  179. fn check(s: &str, result: Vec<u8>) {
  180. assert_eq!(BigInt::parse_bytes(s.as_bytes(), 10).unwrap().to_signed_bytes_be(),
  181. result);
  182. }
  183. check("0", vec![0]);
  184. check("32767", vec![0x7f, 0xff]);
  185. check("-1", vec![255]);
  186. check("16777216", vec![1, 0, 0, 0]);
  187. check("-100", vec![156]);
  188. check("-8388608", vec![128, 0, 0]);
  189. check("-192", vec![0xff, 0x40]);
  190. }
  191. #[test]
  192. fn test_from_signed_bytes_be() {
  193. fn check(s: &[u8], result: &str) {
  194. assert_eq!(BigInt::from_signed_bytes_be(s),
  195. BigInt::parse_bytes(result.as_bytes(), 10).unwrap());
  196. }
  197. check(&[], "0");
  198. check(&[0], "0");
  199. check(&[0; 10], "0");
  200. check(&[127, 255], "32767");
  201. check(&[255], "-1");
  202. check(&[1, 0, 0, 0], "16777216");
  203. check(&[156], "-100");
  204. check(&[128, 0, 0], "-8388608");
  205. check(&[255; 10], "-1");
  206. check(&[0xff, 0x40], "-192");
  207. }
  208. #[test]
  209. fn test_cmp() {
  210. let vs: [&[BigDigit]; 4] = [&[2 as BigDigit], &[1, 1], &[2, 1], &[1, 1, 1]];
  211. let mut nums = Vec::new();
  212. for s in vs.iter().rev() {
  213. nums.push(BigInt::from_slice(Minus, *s));
  214. }
  215. nums.push(Zero::zero());
  216. nums.extend(vs.iter().map(|s| BigInt::from_slice(Plus, *s)));
  217. for (i, ni) in nums.iter().enumerate() {
  218. for (j0, nj) in nums[i..].iter().enumerate() {
  219. let j = i + j0;
  220. if i == j {
  221. assert_eq!(ni.cmp(nj), Equal);
  222. assert_eq!(nj.cmp(ni), Equal);
  223. assert_eq!(ni, nj);
  224. assert!(!(ni != nj));
  225. assert!(ni <= nj);
  226. assert!(ni >= nj);
  227. assert!(!(ni < nj));
  228. assert!(!(ni > nj));
  229. } else {
  230. assert_eq!(ni.cmp(nj), Less);
  231. assert_eq!(nj.cmp(ni), Greater);
  232. assert!(!(ni == nj));
  233. assert!(ni != nj);
  234. assert!(ni <= nj);
  235. assert!(!(ni >= nj));
  236. assert!(ni < nj);
  237. assert!(!(ni > nj));
  238. assert!(!(nj <= ni));
  239. assert!(nj >= ni);
  240. assert!(!(nj < ni));
  241. assert!(nj > ni);
  242. }
  243. }
  244. }
  245. }
  246. #[test]
  247. fn test_hash() {
  248. use hash;
  249. let a = BigInt::new(NoSign, vec![]);
  250. let b = BigInt::new(NoSign, vec![0]);
  251. let c = BigInt::new(Plus, vec![1]);
  252. let d = BigInt::new(Plus, vec![1, 0, 0, 0, 0, 0]);
  253. let e = BigInt::new(Plus, vec![0, 0, 0, 0, 0, 1]);
  254. let f = BigInt::new(Minus, vec![1]);
  255. assert!(hash(&a) == hash(&b));
  256. assert!(hash(&b) != hash(&c));
  257. assert!(hash(&c) == hash(&d));
  258. assert!(hash(&d) != hash(&e));
  259. assert!(hash(&c) != hash(&f));
  260. }
  261. #[test]
  262. fn test_convert_i64() {
  263. fn check(b1: BigInt, i: i64) {
  264. let b2: BigInt = FromPrimitive::from_i64(i).unwrap();
  265. assert!(b1 == b2);
  266. assert!(b1.to_i64().unwrap() == i);
  267. }
  268. check(Zero::zero(), 0);
  269. check(One::one(), 1);
  270. check(i64::MIN.to_bigint().unwrap(), i64::MIN);
  271. check(i64::MAX.to_bigint().unwrap(), i64::MAX);
  272. assert_eq!((i64::MAX as u64 + 1).to_bigint().unwrap().to_i64(), None);
  273. assert_eq!(BigInt::from_biguint(Plus, BigUint::new(vec![1, 2, 3, 4, 5])).to_i64(),
  274. None);
  275. assert_eq!(BigInt::from_biguint(Minus,
  276. BigUint::new(vec![1, 0, 0, 1 << (big_digit::BITS - 1)]))
  277. .to_i64(),
  278. None);
  279. assert_eq!(BigInt::from_biguint(Minus, BigUint::new(vec![1, 2, 3, 4, 5])).to_i64(),
  280. None);
  281. }
  282. #[test]
  283. fn test_convert_u64() {
  284. fn check(b1: BigInt, u: u64) {
  285. let b2: BigInt = FromPrimitive::from_u64(u).unwrap();
  286. assert!(b1 == b2);
  287. assert!(b1.to_u64().unwrap() == u);
  288. }
  289. check(Zero::zero(), 0);
  290. check(One::one(), 1);
  291. check(u64::MIN.to_bigint().unwrap(), u64::MIN);
  292. check(u64::MAX.to_bigint().unwrap(), u64::MAX);
  293. assert_eq!(BigInt::from_biguint(Plus, BigUint::new(vec![1, 2, 3, 4, 5])).to_u64(),
  294. None);
  295. let max_value: BigUint = FromPrimitive::from_u64(u64::MAX).unwrap();
  296. assert_eq!(BigInt::from_biguint(Minus, max_value).to_u64(), None);
  297. assert_eq!(BigInt::from_biguint(Minus, BigUint::new(vec![1, 2, 3, 4, 5])).to_u64(),
  298. None);
  299. }
  300. #[test]
  301. fn test_convert_f32() {
  302. fn check(b1: &BigInt, f: f32) {
  303. let b2 = BigInt::from_f32(f).unwrap();
  304. assert_eq!(b1, &b2);
  305. assert_eq!(b1.to_f32().unwrap(), f);
  306. let neg_b1 = -b1;
  307. let neg_b2 = BigInt::from_f32(-f).unwrap();
  308. assert_eq!(neg_b1, neg_b2);
  309. assert_eq!(neg_b1.to_f32().unwrap(), -f);
  310. }
  311. check(&BigInt::zero(), 0.0);
  312. check(&BigInt::one(), 1.0);
  313. check(&BigInt::from(u16::MAX), 2.0.powi(16) - 1.0);
  314. check(&BigInt::from(1u64 << 32), 2.0.powi(32));
  315. check(&BigInt::from_slice(Plus, &[0, 0, 1]), 2.0.powi(64));
  316. check(&((BigInt::one() << 100) + (BigInt::one() << 123)),
  317. 2.0.powi(100) + 2.0.powi(123));
  318. check(&(BigInt::one() << 127), 2.0.powi(127));
  319. check(&(BigInt::from((1u64 << 24) - 1) << (128 - 24)), f32::MAX);
  320. // keeping all 24 digits with the bits at different offsets to the BigDigits
  321. let x: u32 = 0b00000000101111011111011011011101;
  322. let mut f = x as f32;
  323. let mut b = BigInt::from(x);
  324. for _ in 0..64 {
  325. check(&b, f);
  326. f *= 2.0;
  327. b = b << 1;
  328. }
  329. // this number when rounded to f64 then f32 isn't the same as when rounded straight to f32
  330. let mut n: i64 = 0b0000000000111111111111111111111111011111111111111111111111111111;
  331. assert!((n as f64) as f32 != n as f32);
  332. assert_eq!(BigInt::from(n).to_f32(), Some(n as f32));
  333. n = -n;
  334. assert!((n as f64) as f32 != n as f32);
  335. assert_eq!(BigInt::from(n).to_f32(), Some(n as f32));
  336. // test rounding up with the bits at different offsets to the BigDigits
  337. let mut f = ((1u64 << 25) - 1) as f32;
  338. let mut b = BigInt::from(1u64 << 25);
  339. for _ in 0..64 {
  340. assert_eq!(b.to_f32(), Some(f));
  341. f *= 2.0;
  342. b = b << 1;
  343. }
  344. // rounding
  345. assert_eq!(BigInt::from_f32(-f32::consts::PI),
  346. Some(BigInt::from(-3i32)));
  347. assert_eq!(BigInt::from_f32(-f32::consts::E), Some(BigInt::from(-2i32)));
  348. assert_eq!(BigInt::from_f32(-0.99999), Some(BigInt::zero()));
  349. assert_eq!(BigInt::from_f32(-0.5), Some(BigInt::zero()));
  350. assert_eq!(BigInt::from_f32(-0.0), Some(BigInt::zero()));
  351. assert_eq!(BigInt::from_f32(f32::MIN_POSITIVE / 2.0),
  352. Some(BigInt::zero()));
  353. assert_eq!(BigInt::from_f32(f32::MIN_POSITIVE), Some(BigInt::zero()));
  354. assert_eq!(BigInt::from_f32(0.5), Some(BigInt::zero()));
  355. assert_eq!(BigInt::from_f32(0.99999), Some(BigInt::zero()));
  356. assert_eq!(BigInt::from_f32(f32::consts::E), Some(BigInt::from(2u32)));
  357. assert_eq!(BigInt::from_f32(f32::consts::PI), Some(BigInt::from(3u32)));
  358. // special float values
  359. assert_eq!(BigInt::from_f32(f32::NAN), None);
  360. assert_eq!(BigInt::from_f32(f32::INFINITY), None);
  361. assert_eq!(BigInt::from_f32(f32::NEG_INFINITY), None);
  362. // largest BigInt that will round to a finite f32 value
  363. let big_num = (BigInt::one() << 128) - BigInt::one() - (BigInt::one() << (128 - 25));
  364. assert_eq!(big_num.to_f32(), Some(f32::MAX));
  365. assert_eq!((&big_num + BigInt::one()).to_f32(), None);
  366. assert_eq!((-&big_num).to_f32(), Some(f32::MIN));
  367. assert_eq!(((-&big_num) - BigInt::one()).to_f32(), None);
  368. assert_eq!(((BigInt::one() << 128) - BigInt::one()).to_f32(), None);
  369. assert_eq!((BigInt::one() << 128).to_f32(), None);
  370. assert_eq!((-((BigInt::one() << 128) - BigInt::one())).to_f32(), None);
  371. assert_eq!((-(BigInt::one() << 128)).to_f32(), None);
  372. }
  373. #[test]
  374. fn test_convert_f64() {
  375. fn check(b1: &BigInt, f: f64) {
  376. let b2 = BigInt::from_f64(f).unwrap();
  377. assert_eq!(b1, &b2);
  378. assert_eq!(b1.to_f64().unwrap(), f);
  379. let neg_b1 = -b1;
  380. let neg_b2 = BigInt::from_f64(-f).unwrap();
  381. assert_eq!(neg_b1, neg_b2);
  382. assert_eq!(neg_b1.to_f64().unwrap(), -f);
  383. }
  384. check(&BigInt::zero(), 0.0);
  385. check(&BigInt::one(), 1.0);
  386. check(&BigInt::from(u32::MAX), 2.0.powi(32) - 1.0);
  387. check(&BigInt::from(1u64 << 32), 2.0.powi(32));
  388. check(&BigInt::from_slice(Plus, &[0, 0, 1]), 2.0.powi(64));
  389. check(&((BigInt::one() << 100) + (BigInt::one() << 152)),
  390. 2.0.powi(100) + 2.0.powi(152));
  391. check(&(BigInt::one() << 1023), 2.0.powi(1023));
  392. check(&(BigInt::from((1u64 << 53) - 1) << (1024 - 53)), f64::MAX);
  393. // keeping all 53 digits with the bits at different offsets to the BigDigits
  394. let x: u64 = 0b0000000000011110111110110111111101110111101111011111011011011101;
  395. let mut f = x as f64;
  396. let mut b = BigInt::from(x);
  397. for _ in 0..128 {
  398. check(&b, f);
  399. f *= 2.0;
  400. b = b << 1;
  401. }
  402. // test rounding up with the bits at different offsets to the BigDigits
  403. let mut f = ((1u64 << 54) - 1) as f64;
  404. let mut b = BigInt::from(1u64 << 54);
  405. for _ in 0..128 {
  406. assert_eq!(b.to_f64(), Some(f));
  407. f *= 2.0;
  408. b = b << 1;
  409. }
  410. // rounding
  411. assert_eq!(BigInt::from_f64(-f64::consts::PI),
  412. Some(BigInt::from(-3i32)));
  413. assert_eq!(BigInt::from_f64(-f64::consts::E), Some(BigInt::from(-2i32)));
  414. assert_eq!(BigInt::from_f64(-0.99999), Some(BigInt::zero()));
  415. assert_eq!(BigInt::from_f64(-0.5), Some(BigInt::zero()));
  416. assert_eq!(BigInt::from_f64(-0.0), Some(BigInt::zero()));
  417. assert_eq!(BigInt::from_f64(f64::MIN_POSITIVE / 2.0),
  418. Some(BigInt::zero()));
  419. assert_eq!(BigInt::from_f64(f64::MIN_POSITIVE), Some(BigInt::zero()));
  420. assert_eq!(BigInt::from_f64(0.5), Some(BigInt::zero()));
  421. assert_eq!(BigInt::from_f64(0.99999), Some(BigInt::zero()));
  422. assert_eq!(BigInt::from_f64(f64::consts::E), Some(BigInt::from(2u32)));
  423. assert_eq!(BigInt::from_f64(f64::consts::PI), Some(BigInt::from(3u32)));
  424. // special float values
  425. assert_eq!(BigInt::from_f64(f64::NAN), None);
  426. assert_eq!(BigInt::from_f64(f64::INFINITY), None);
  427. assert_eq!(BigInt::from_f64(f64::NEG_INFINITY), None);
  428. // largest BigInt that will round to a finite f64 value
  429. let big_num = (BigInt::one() << 1024) - BigInt::one() - (BigInt::one() << (1024 - 54));
  430. assert_eq!(big_num.to_f64(), Some(f64::MAX));
  431. assert_eq!((&big_num + BigInt::one()).to_f64(), None);
  432. assert_eq!((-&big_num).to_f64(), Some(f64::MIN));
  433. assert_eq!(((-&big_num) - BigInt::one()).to_f64(), None);
  434. assert_eq!(((BigInt::one() << 1024) - BigInt::one()).to_f64(), None);
  435. assert_eq!((BigInt::one() << 1024).to_f64(), None);
  436. assert_eq!((-((BigInt::one() << 1024) - BigInt::one())).to_f64(), None);
  437. assert_eq!((-(BigInt::one() << 1024)).to_f64(), None);
  438. }
  439. #[test]
  440. fn test_convert_to_biguint() {
  441. fn check(n: BigInt, ans_1: BigUint) {
  442. assert_eq!(n.to_biguint().unwrap(), ans_1);
  443. assert_eq!(n.to_biguint().unwrap().to_bigint().unwrap(), n);
  444. }
  445. let zero: BigInt = Zero::zero();
  446. let unsigned_zero: BigUint = Zero::zero();
  447. let positive = BigInt::from_biguint(Plus, BigUint::new(vec![1, 2, 3]));
  448. let negative = -&positive;
  449. check(zero, unsigned_zero);
  450. check(positive, BigUint::new(vec![1, 2, 3]));
  451. assert_eq!(negative.to_biguint(), None);
  452. }
  453. #[test]
  454. fn test_convert_from_uint() {
  455. macro_rules! check {
  456. ($ty:ident, $max:expr) => {
  457. assert_eq!(BigInt::from($ty::zero()), BigInt::zero());
  458. assert_eq!(BigInt::from($ty::one()), BigInt::one());
  459. assert_eq!(BigInt::from($ty::MAX - $ty::one()), $max - BigInt::one());
  460. assert_eq!(BigInt::from($ty::MAX), $max);
  461. }
  462. }
  463. check!(u8, BigInt::from_slice(Plus, &[u8::MAX as BigDigit]));
  464. check!(u16, BigInt::from_slice(Plus, &[u16::MAX as BigDigit]));
  465. check!(u32, BigInt::from_slice(Plus, &[u32::MAX as BigDigit]));
  466. check!(u64,
  467. BigInt::from_slice(Plus, &[u32::MAX as BigDigit, u32::MAX as BigDigit]));
  468. check!(usize, BigInt::from(usize::MAX as u64));
  469. }
  470. #[test]
  471. fn test_convert_from_int() {
  472. macro_rules! check {
  473. ($ty:ident, $min:expr, $max:expr) => {
  474. assert_eq!(BigInt::from($ty::MIN), $min);
  475. assert_eq!(BigInt::from($ty::MIN + $ty::one()), $min + BigInt::one());
  476. assert_eq!(BigInt::from(-$ty::one()), -BigInt::one());
  477. assert_eq!(BigInt::from($ty::zero()), BigInt::zero());
  478. assert_eq!(BigInt::from($ty::one()), BigInt::one());
  479. assert_eq!(BigInt::from($ty::MAX - $ty::one()), $max - BigInt::one());
  480. assert_eq!(BigInt::from($ty::MAX), $max);
  481. }
  482. }
  483. check!(i8,
  484. BigInt::from_slice(Minus, &[1 << 7]),
  485. BigInt::from_slice(Plus, &[i8::MAX as BigDigit]));
  486. check!(i16,
  487. BigInt::from_slice(Minus, &[1 << 15]),
  488. BigInt::from_slice(Plus, &[i16::MAX as BigDigit]));
  489. check!(i32,
  490. BigInt::from_slice(Minus, &[1 << 31]),
  491. BigInt::from_slice(Plus, &[i32::MAX as BigDigit]));
  492. check!(i64,
  493. BigInt::from_slice(Minus, &[0, 1 << 31]),
  494. BigInt::from_slice(Plus, &[u32::MAX as BigDigit, i32::MAX as BigDigit]));
  495. check!(isize,
  496. BigInt::from(isize::MIN as i64),
  497. BigInt::from(isize::MAX as i64));
  498. }
  499. #[test]
  500. fn test_convert_from_biguint() {
  501. assert_eq!(BigInt::from(BigUint::zero()), BigInt::zero());
  502. assert_eq!(BigInt::from(BigUint::one()), BigInt::one());
  503. assert_eq!(BigInt::from(BigUint::from_slice(&[1, 2, 3])),
  504. BigInt::from_slice(Plus, &[1, 2, 3]));
  505. }
  506. const N1: BigDigit = -1i32 as BigDigit;
  507. const N2: BigDigit = -2i32 as BigDigit;
  508. const SUM_TRIPLES: &'static [(&'static [BigDigit],
  509. &'static [BigDigit],
  510. &'static [BigDigit])] = &[(&[], &[], &[]),
  511. (&[], &[1], &[1]),
  512. (&[1], &[1], &[2]),
  513. (&[1], &[1, 1], &[2, 1]),
  514. (&[1], &[N1], &[0, 1]),
  515. (&[1], &[N1, N1], &[0, 0, 1]),
  516. (&[N1, N1], &[N1, N1], &[N2, N1, 1]),
  517. (&[1, 1, 1], &[N1, N1], &[0, 1, 2]),
  518. (&[2, 2, 1], &[N1, N2], &[1, 1, 2])];
  519. #[test]
  520. fn test_add() {
  521. for elm in SUM_TRIPLES.iter() {
  522. let (a_vec, b_vec, c_vec) = *elm;
  523. let a = BigInt::from_slice(Plus, a_vec);
  524. let b = BigInt::from_slice(Plus, b_vec);
  525. let c = BigInt::from_slice(Plus, c_vec);
  526. let (na, nb, nc) = (-&a, -&b, -&c);
  527. assert_op!(a + b == c);
  528. assert_op!(b + a == c);
  529. assert_op!(c + na == b);
  530. assert_op!(c + nb == a);
  531. assert_op!(a + nc == nb);
  532. assert_op!(b + nc == na);
  533. assert_op!(na + nb == nc);
  534. assert_op!(a + na == Zero::zero());
  535. }
  536. }
  537. #[test]
  538. fn test_scalar_add() {
  539. for elm in SUM_TRIPLES.iter() {
  540. let (a_vec, b_vec, c_vec) = *elm;
  541. let a = BigInt::from_slice(Plus, a_vec);
  542. let b = BigInt::from_slice(Plus, b_vec);
  543. let c = BigInt::from_slice(Plus, c_vec);
  544. let (na, nb, nc) = (-&a, -&b, -&c);
  545. assert_scalar_op!(a + b == c);
  546. assert_scalar_op!(b + a == c);
  547. assert_scalar_op!(c + na == b);
  548. assert_scalar_op!(c + nb == a);
  549. assert_scalar_op!(a + nc == nb);
  550. assert_scalar_op!(b + nc == na);
  551. assert_scalar_op!(na + nb == nc);
  552. assert_scalar_op!(a + na == Zero::zero());
  553. }
  554. }
  555. #[test]
  556. fn test_sub() {
  557. for elm in SUM_TRIPLES.iter() {
  558. let (a_vec, b_vec, c_vec) = *elm;
  559. let a = BigInt::from_slice(Plus, a_vec);
  560. let b = BigInt::from_slice(Plus, b_vec);
  561. let c = BigInt::from_slice(Plus, c_vec);
  562. let (na, nb, nc) = (-&a, -&b, -&c);
  563. assert_op!(c - a == b);
  564. assert_op!(c - b == a);
  565. assert_op!(nb - a == nc);
  566. assert_op!(na - b == nc);
  567. assert_op!(b - na == c);
  568. assert_op!(a - nb == c);
  569. assert_op!(nc - na == nb);
  570. assert_op!(a - a == Zero::zero());
  571. }
  572. }
  573. #[test]
  574. fn test_scalar_sub() {
  575. for elm in SUM_TRIPLES.iter() {
  576. let (a_vec, b_vec, c_vec) = *elm;
  577. let a = BigInt::from_slice(Plus, a_vec);
  578. let b = BigInt::from_slice(Plus, b_vec);
  579. let c = BigInt::from_slice(Plus, c_vec);
  580. let (na, nb, nc) = (-&a, -&b, -&c);
  581. assert_scalar_op!(c - a == b);
  582. assert_scalar_op!(c - b == a);
  583. assert_scalar_op!(nb - a == nc);
  584. assert_scalar_op!(na - b == nc);
  585. assert_scalar_op!(b - na == c);
  586. assert_scalar_op!(a - nb == c);
  587. assert_scalar_op!(nc - na == nb);
  588. assert_scalar_op!(a - a == Zero::zero());
  589. }
  590. }
  591. const M: u32 = ::std::u32::MAX;
  592. static MUL_TRIPLES: &'static [(&'static [BigDigit],
  593. &'static [BigDigit],
  594. &'static [BigDigit])] = &[(&[], &[], &[]),
  595. (&[], &[1], &[]),
  596. (&[2], &[], &[]),
  597. (&[1], &[1], &[1]),
  598. (&[2], &[3], &[6]),
  599. (&[1], &[1, 1, 1], &[1, 1, 1]),
  600. (&[1, 2, 3], &[3], &[3, 6, 9]),
  601. (&[1, 1, 1], &[N1], &[N1, N1, N1]),
  602. (&[1, 2, 3], &[N1], &[N1, N2, N2, 2]),
  603. (&[1, 2, 3, 4], &[N1], &[N1, N2, N2, N2, 3]),
  604. (&[N1], &[N1], &[1, N2]),
  605. (&[N1, N1], &[N1], &[1, N1, N2]),
  606. (&[N1, N1, N1], &[N1], &[1, N1, N1, N2]),
  607. (&[N1, N1, N1, N1], &[N1], &[1, N1, N1, N1, N2]),
  608. (&[M / 2 + 1], &[2], &[0, 1]),
  609. (&[0, M / 2 + 1], &[2], &[0, 0, 1]),
  610. (&[1, 2], &[1, 2, 3], &[1, 4, 7, 6]),
  611. (&[N1, N1], &[N1, N1, N1], &[1, 0, N1, N2, N1]),
  612. (&[N1, N1, N1],
  613. &[N1, N1, N1, N1],
  614. &[1, 0, 0, N1, N2, N1, N1]),
  615. (&[0, 0, 1], &[1, 2, 3], &[0, 0, 1, 2, 3]),
  616. (&[0, 0, 1], &[0, 0, 0, 1], &[0, 0, 0, 0, 0, 1])];
  617. static DIV_REM_QUADRUPLES: &'static [(&'static [BigDigit],
  618. &'static [BigDigit],
  619. &'static [BigDigit],
  620. &'static [BigDigit])] = &[(&[1], &[2], &[], &[1]),
  621. (&[3], &[2], &[1], &[1]),
  622. (&[1, 1], &[2], &[M / 2 + 1], &[1]),
  623. (&[1, 1, 1], &[2], &[M / 2 + 1, M / 2 + 1], &[1]),
  624. (&[0, 1], &[N1], &[1], &[1]),
  625. (&[N1, N1], &[N2], &[2, 1], &[3])];
  626. #[test]
  627. fn test_mul() {
  628. for elm in MUL_TRIPLES.iter() {
  629. let (a_vec, b_vec, c_vec) = *elm;
  630. let a = BigInt::from_slice(Plus, a_vec);
  631. let b = BigInt::from_slice(Plus, b_vec);
  632. let c = BigInt::from_slice(Plus, c_vec);
  633. let (na, nb, nc) = (-&a, -&b, -&c);
  634. assert_op!(a * b == c);
  635. assert_op!(b * a == c);
  636. assert_op!(na * nb == c);
  637. assert_op!(na * b == nc);
  638. assert_op!(nb * a == nc);
  639. }
  640. for elm in DIV_REM_QUADRUPLES.iter() {
  641. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  642. let a = BigInt::from_slice(Plus, a_vec);
  643. let b = BigInt::from_slice(Plus, b_vec);
  644. let c = BigInt::from_slice(Plus, c_vec);
  645. let d = BigInt::from_slice(Plus, d_vec);
  646. assert!(a == &b * &c + &d);
  647. assert!(a == &c * &b + &d);
  648. }
  649. }
  650. #[test]
  651. fn test_scalar_mul() {
  652. for elm in MUL_TRIPLES.iter() {
  653. let (a_vec, b_vec, c_vec) = *elm;
  654. let a = BigInt::from_slice(Plus, a_vec);
  655. let b = BigInt::from_slice(Plus, b_vec);
  656. let c = BigInt::from_slice(Plus, c_vec);
  657. let (na, nb, nc) = (-&a, -&b, -&c);
  658. assert_scalar_op!(a * b == c);
  659. assert_scalar_op!(b * a == c);
  660. assert_scalar_op!(na * nb == c);
  661. assert_scalar_op!(na * b == nc);
  662. assert_scalar_op!(nb * a == nc);
  663. }
  664. }
  665. #[test]
  666. fn test_div_mod_floor() {
  667. fn check_sub(a: &BigInt, b: &BigInt, ans_d: &BigInt, ans_m: &BigInt) {
  668. let (d, m) = a.div_mod_floor(b);
  669. if !m.is_zero() {
  670. assert_eq!(m.sign, b.sign);
  671. }
  672. assert!(m.abs() <= b.abs());
  673. assert!(*a == b * &d + &m);
  674. assert!(d == *ans_d);
  675. assert!(m == *ans_m);
  676. }
  677. fn check(a: &BigInt, b: &BigInt, d: &BigInt, m: &BigInt) {
  678. if m.is_zero() {
  679. check_sub(a, b, d, m);
  680. check_sub(a, &b.neg(), &d.neg(), m);
  681. check_sub(&a.neg(), b, &d.neg(), m);
  682. check_sub(&a.neg(), &b.neg(), d, m);
  683. } else {
  684. let one: BigInt = One::one();
  685. check_sub(a, b, d, m);
  686. check_sub(a, &b.neg(), &(d.neg() - &one), &(m - b));
  687. check_sub(&a.neg(), b, &(d.neg() - &one), &(b - m));
  688. check_sub(&a.neg(), &b.neg(), d, &m.neg());
  689. }
  690. }
  691. for elm in MUL_TRIPLES.iter() {
  692. let (a_vec, b_vec, c_vec) = *elm;
  693. let a = BigInt::from_slice(Plus, a_vec);
  694. let b = BigInt::from_slice(Plus, b_vec);
  695. let c = BigInt::from_slice(Plus, c_vec);
  696. if !a.is_zero() {
  697. check(&c, &a, &b, &Zero::zero());
  698. }
  699. if !b.is_zero() {
  700. check(&c, &b, &a, &Zero::zero());
  701. }
  702. }
  703. for elm in DIV_REM_QUADRUPLES.iter() {
  704. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  705. let a = BigInt::from_slice(Plus, a_vec);
  706. let b = BigInt::from_slice(Plus, b_vec);
  707. let c = BigInt::from_slice(Plus, c_vec);
  708. let d = BigInt::from_slice(Plus, d_vec);
  709. if !b.is_zero() {
  710. check(&a, &b, &c, &d);
  711. }
  712. }
  713. }
  714. #[test]
  715. fn test_div_rem() {
  716. fn check_sub(a: &BigInt, b: &BigInt, ans_q: &BigInt, ans_r: &BigInt) {
  717. let (q, r) = a.div_rem(b);
  718. if !r.is_zero() {
  719. assert_eq!(r.sign, a.sign);
  720. }
  721. assert!(r.abs() <= b.abs());
  722. assert!(*a == b * &q + &r);
  723. assert!(q == *ans_q);
  724. assert!(r == *ans_r);
  725. let (a, b, ans_q, ans_r) = (a.clone(), b.clone(), ans_q.clone(), ans_r.clone());
  726. assert_op!(a / b == ans_q);
  727. assert_op!(a % b == ans_r);
  728. }
  729. fn check(a: &BigInt, b: &BigInt, q: &BigInt, r: &BigInt) {
  730. check_sub(a, b, q, r);
  731. check_sub(a, &b.neg(), &q.neg(), r);
  732. check_sub(&a.neg(), b, &q.neg(), &r.neg());
  733. check_sub(&a.neg(), &b.neg(), q, &r.neg());
  734. }
  735. for elm in MUL_TRIPLES.iter() {
  736. let (a_vec, b_vec, c_vec) = *elm;
  737. let a = BigInt::from_slice(Plus, a_vec);
  738. let b = BigInt::from_slice(Plus, b_vec);
  739. let c = BigInt::from_slice(Plus, c_vec);
  740. if !a.is_zero() {
  741. check(&c, &a, &b, &Zero::zero());
  742. }
  743. if !b.is_zero() {
  744. check(&c, &b, &a, &Zero::zero());
  745. }
  746. }
  747. for elm in DIV_REM_QUADRUPLES.iter() {
  748. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  749. let a = BigInt::from_slice(Plus, a_vec);
  750. let b = BigInt::from_slice(Plus, b_vec);
  751. let c = BigInt::from_slice(Plus, c_vec);
  752. let d = BigInt::from_slice(Plus, d_vec);
  753. if !b.is_zero() {
  754. check(&a, &b, &c, &d);
  755. }
  756. }
  757. }
  758. #[test]
  759. fn test_scalar_div_rem() {
  760. fn check_sub(a: &BigInt, b: BigDigit, ans_q: &BigInt, ans_r: &BigInt) {
  761. let (q, r) = (a / b, a % b);
  762. if !r.is_zero() {
  763. assert_eq!(r.sign, a.sign);
  764. }
  765. assert!(r.abs() <= From::from(b));
  766. assert!(*a == b * &q + &r);
  767. assert!(q == *ans_q);
  768. assert!(r == *ans_r);
  769. let (a, b, ans_q, ans_r) = (a.clone(), b.clone(), ans_q.clone(), ans_r.clone());
  770. assert_op!(a / b == ans_q);
  771. assert_op!(a % b == ans_r);
  772. if b <= i32::max_value() as u32 {
  773. let nb = -(b as i32);
  774. assert_op!(a / nb == -ans_q.clone());
  775. assert_op!(a % nb == ans_r);
  776. }
  777. }
  778. fn check(a: &BigInt, b: BigDigit, q: &BigInt, r: &BigInt) {
  779. check_sub(a, b, q, r);
  780. check_sub(&a.neg(), b, &q.neg(), &r.neg());
  781. }
  782. for elm in MUL_TRIPLES.iter() {
  783. let (a_vec, b_vec, c_vec) = *elm;
  784. let a = BigInt::from_slice(Plus, a_vec);
  785. let b = BigInt::from_slice(Plus, b_vec);
  786. let c = BigInt::from_slice(Plus, c_vec);
  787. if a_vec.len() == 1 && a_vec[0] != 0 {
  788. let a = a_vec[0];
  789. check(&c, a, &b, &Zero::zero());
  790. }
  791. if b_vec.len() == 1 && b_vec[0] != 0 {
  792. let b = b_vec[0];
  793. check(&c, b, &a, &Zero::zero());
  794. }
  795. }
  796. for elm in DIV_REM_QUADRUPLES.iter() {
  797. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  798. let a = BigInt::from_slice(Plus, a_vec);
  799. let c = BigInt::from_slice(Plus, c_vec);
  800. let d = BigInt::from_slice(Plus, d_vec);
  801. if b_vec.len() == 1 && b_vec[0] != 0 {
  802. let b = b_vec[0];
  803. check(&a, b, &c, &d);
  804. }
  805. }
  806. }
  807. #[test]
  808. fn test_checked_add() {
  809. for elm in SUM_TRIPLES.iter() {
  810. let (a_vec, b_vec, c_vec) = *elm;
  811. let a = BigInt::from_slice(Plus, a_vec);
  812. let b = BigInt::from_slice(Plus, b_vec);
  813. let c = BigInt::from_slice(Plus, c_vec);
  814. assert!(a.checked_add(&b).unwrap() == c);
  815. assert!(b.checked_add(&a).unwrap() == c);
  816. assert!(c.checked_add(&(-&a)).unwrap() == b);
  817. assert!(c.checked_add(&(-&b)).unwrap() == a);
  818. assert!(a.checked_add(&(-&c)).unwrap() == (-&b));
  819. assert!(b.checked_add(&(-&c)).unwrap() == (-&a));
  820. assert!((-&a).checked_add(&(-&b)).unwrap() == (-&c));
  821. assert!(a.checked_add(&(-&a)).unwrap() == Zero::zero());
  822. }
  823. }
  824. #[test]
  825. fn test_checked_sub() {
  826. for elm in SUM_TRIPLES.iter() {
  827. let (a_vec, b_vec, c_vec) = *elm;
  828. let a = BigInt::from_slice(Plus, a_vec);
  829. let b = BigInt::from_slice(Plus, b_vec);
  830. let c = BigInt::from_slice(Plus, c_vec);
  831. assert!(c.checked_sub(&a).unwrap() == b);
  832. assert!(c.checked_sub(&b).unwrap() == a);
  833. assert!((-&b).checked_sub(&a).unwrap() == (-&c));
  834. assert!((-&a).checked_sub(&b).unwrap() == (-&c));
  835. assert!(b.checked_sub(&(-&a)).unwrap() == c);
  836. assert!(a.checked_sub(&(-&b)).unwrap() == c);
  837. assert!((-&c).checked_sub(&(-&a)).unwrap() == (-&b));
  838. assert!(a.checked_sub(&a).unwrap() == Zero::zero());
  839. }
  840. }
  841. #[test]
  842. fn test_checked_mul() {
  843. for elm in MUL_TRIPLES.iter() {
  844. let (a_vec, b_vec, c_vec) = *elm;
  845. let a = BigInt::from_slice(Plus, a_vec);
  846. let b = BigInt::from_slice(Plus, b_vec);
  847. let c = BigInt::from_slice(Plus, c_vec);
  848. assert!(a.checked_mul(&b).unwrap() == c);
  849. assert!(b.checked_mul(&a).unwrap() == c);
  850. assert!((-&a).checked_mul(&b).unwrap() == -&c);
  851. assert!((-&b).checked_mul(&a).unwrap() == -&c);
  852. }
  853. for elm in DIV_REM_QUADRUPLES.iter() {
  854. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  855. let a = BigInt::from_slice(Plus, a_vec);
  856. let b = BigInt::from_slice(Plus, b_vec);
  857. let c = BigInt::from_slice(Plus, c_vec);
  858. let d = BigInt::from_slice(Plus, d_vec);
  859. assert!(a == b.checked_mul(&c).unwrap() + &d);
  860. assert!(a == c.checked_mul(&b).unwrap() + &d);
  861. }
  862. }
  863. #[test]
  864. fn test_checked_div() {
  865. for elm in MUL_TRIPLES.iter() {
  866. let (a_vec, b_vec, c_vec) = *elm;
  867. let a = BigInt::from_slice(Plus, a_vec);
  868. let b = BigInt::from_slice(Plus, b_vec);
  869. let c = BigInt::from_slice(Plus, c_vec);
  870. if !a.is_zero() {
  871. assert!(c.checked_div(&a).unwrap() == b);
  872. assert!((-&c).checked_div(&(-&a)).unwrap() == b);
  873. assert!((-&c).checked_div(&a).unwrap() == -&b);
  874. }
  875. if !b.is_zero() {
  876. assert!(c.checked_div(&b).unwrap() == a);
  877. assert!((-&c).checked_div(&(-&b)).unwrap() == a);
  878. assert!((-&c).checked_div(&b).unwrap() == -&a);
  879. }
  880. assert!(c.checked_div(&Zero::zero()).is_none());
  881. assert!((-&c).checked_div(&Zero::zero()).is_none());
  882. }
  883. }
  884. #[test]
  885. fn test_gcd() {
  886. fn check(a: isize, b: isize, c: isize) {
  887. let big_a: BigInt = FromPrimitive::from_isize(a).unwrap();
  888. let big_b: BigInt = FromPrimitive::from_isize(b).unwrap();
  889. let big_c: BigInt = FromPrimitive::from_isize(c).unwrap();
  890. assert_eq!(big_a.gcd(&big_b), big_c);
  891. }
  892. check(10, 2, 2);
  893. check(10, 3, 1);
  894. check(0, 3, 3);
  895. check(3, 3, 3);
  896. check(56, 42, 14);
  897. check(3, -3, 3);
  898. check(-6, 3, 3);
  899. check(-4, -2, 2);
  900. }
  901. #[test]
  902. fn test_lcm() {
  903. fn check(a: isize, b: isize, c: isize) {
  904. let big_a: BigInt = FromPrimitive::from_isize(a).unwrap();
  905. let big_b: BigInt = FromPrimitive::from_isize(b).unwrap();
  906. let big_c: BigInt = FromPrimitive::from_isize(c).unwrap();
  907. assert_eq!(big_a.lcm(&big_b), big_c);
  908. }
  909. check(1, 0, 0);
  910. check(0, 1, 0);
  911. check(1, 1, 1);
  912. check(-1, 1, 1);
  913. check(1, -1, 1);
  914. check(-1, -1, 1);
  915. check(8, 9, 72);
  916. check(11, 5, 55);
  917. }
  918. #[test]
  919. fn test_abs_sub() {
  920. let zero: BigInt = Zero::zero();
  921. let one: BigInt = One::one();
  922. assert_eq!((-&one).abs_sub(&one), zero);
  923. let one: BigInt = One::one();
  924. let zero: BigInt = Zero::zero();
  925. assert_eq!(one.abs_sub(&one), zero);
  926. let one: BigInt = One::one();
  927. let zero: BigInt = Zero::zero();
  928. assert_eq!(one.abs_sub(&zero), one);
  929. let one: BigInt = One::one();
  930. let two: BigInt = FromPrimitive::from_isize(2).unwrap();
  931. assert_eq!(one.abs_sub(&-&one), two);
  932. }
  933. #[test]
  934. fn test_from_str_radix() {
  935. fn check(s: &str, ans: Option<isize>) {
  936. let ans = ans.map(|n| {
  937. let x: BigInt = FromPrimitive::from_isize(n).unwrap();
  938. x
  939. });
  940. assert_eq!(BigInt::from_str_radix(s, 10).ok(), ans);
  941. }
  942. check("10", Some(10));
  943. check("1", Some(1));
  944. check("0", Some(0));
  945. check("-1", Some(-1));
  946. check("-10", Some(-10));
  947. check("+10", Some(10));
  948. check("--7", None);
  949. check("++5", None);
  950. check("+-9", None);
  951. check("-+3", None);
  952. check("Z", None);
  953. check("_", None);
  954. // issue 10522, this hit an edge case that caused it to
  955. // attempt to allocate a vector of size (-1u) == huge.
  956. let x: BigInt = format!("1{}", repeat("0").take(36).collect::<String>()).parse().unwrap();
  957. let _y = x.to_string();
  958. }
  959. #[test]
  960. fn test_lower_hex() {
  961. let a = BigInt::parse_bytes(b"A", 16).unwrap();
  962. let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap();
  963. assert_eq!(format!("{:x}", a), "a");
  964. assert_eq!(format!("{:x}", hello), "-48656c6c6f20776f726c6421");
  965. assert_eq!(format!("{:♥>+#8x}", a), "♥♥♥♥+0xa");
  966. }
  967. #[test]
  968. fn test_upper_hex() {
  969. let a = BigInt::parse_bytes(b"A", 16).unwrap();
  970. let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap();
  971. assert_eq!(format!("{:X}", a), "A");
  972. assert_eq!(format!("{:X}", hello), "-48656C6C6F20776F726C6421");
  973. assert_eq!(format!("{:♥>+#8X}", a), "♥♥♥♥+0xA");
  974. }
  975. #[test]
  976. fn test_binary() {
  977. let a = BigInt::parse_bytes(b"A", 16).unwrap();
  978. let hello = BigInt::parse_bytes("-224055342307539".as_bytes(), 10).unwrap();
  979. assert_eq!(format!("{:b}", a), "1010");
  980. assert_eq!(format!("{:b}", hello),
  981. "-110010111100011011110011000101101001100011010011");
  982. assert_eq!(format!("{:♥>+#8b}", a), "♥+0b1010");
  983. }
  984. #[test]
  985. fn test_octal() {
  986. let a = BigInt::parse_bytes(b"A", 16).unwrap();
  987. let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap();
  988. assert_eq!(format!("{:o}", a), "12");
  989. assert_eq!(format!("{:o}", hello), "-22062554330674403566756233062041");
  990. assert_eq!(format!("{:♥>+#8o}", a), "♥♥♥+0o12");
  991. }
  992. #[test]
  993. fn test_display() {
  994. let a = BigInt::parse_bytes(b"A", 16).unwrap();
  995. let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap();
  996. assert_eq!(format!("{}", a), "10");
  997. assert_eq!(format!("{}", hello), "-22405534230753963835153736737");
  998. assert_eq!(format!("{:♥>+#8}", a), "♥♥♥♥♥+10");
  999. }
  1000. #[test]
  1001. fn test_neg() {
  1002. assert!(-BigInt::new(Plus, vec![1, 1, 1]) == BigInt::new(Minus, vec![1, 1, 1]));
  1003. assert!(-BigInt::new(Minus, vec![1, 1, 1]) == BigInt::new(Plus, vec![1, 1, 1]));
  1004. let zero: BigInt = Zero::zero();
  1005. assert_eq!(-&zero, zero);
  1006. }
  1007. #[test]
  1008. fn test_rand() {
  1009. let mut rng = thread_rng();
  1010. let _n: BigInt = rng.gen_bigint(137);
  1011. assert!(rng.gen_bigint(0).is_zero());
  1012. }
  1013. #[test]
  1014. fn test_rand_range() {
  1015. let mut rng = thread_rng();
  1016. for _ in 0..10 {
  1017. assert_eq!(rng.gen_bigint_range(&FromPrimitive::from_usize(236).unwrap(),
  1018. &FromPrimitive::from_usize(237).unwrap()),
  1019. FromPrimitive::from_usize(236).unwrap());
  1020. }
  1021. fn check(l: BigInt, u: BigInt) {
  1022. let mut rng = thread_rng();
  1023. for _ in 0..1000 {
  1024. let n: BigInt = rng.gen_bigint_range(&l, &u);
  1025. assert!(n >= l);
  1026. assert!(n < u);
  1027. }
  1028. }
  1029. let l: BigInt = FromPrimitive::from_usize(403469000 + 2352).unwrap();
  1030. let u: BigInt = FromPrimitive::from_usize(403469000 + 3513).unwrap();
  1031. check(l.clone(), u.clone());
  1032. check(-l.clone(), u.clone());
  1033. check(-u.clone(), -l.clone());
  1034. }
  1035. #[test]
  1036. #[should_panic]
  1037. fn test_zero_rand_range() {
  1038. thread_rng().gen_bigint_range(&FromPrimitive::from_isize(54).unwrap(),
  1039. &FromPrimitive::from_isize(54).unwrap());
  1040. }
  1041. #[test]
  1042. #[should_panic]
  1043. fn test_negative_rand_range() {
  1044. let mut rng = thread_rng();
  1045. let l = FromPrimitive::from_usize(2352).unwrap();
  1046. let u = FromPrimitive::from_usize(3513).unwrap();
  1047. // Switching u and l should fail:
  1048. let _n: BigInt = rng.gen_bigint_range(&u, &l);
  1049. }