4 // Rodrigo Kumpera <rkumpera@novell.com>
6 // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
10 using System.Numerics;
11 using System.Globalization;
12 using System.Threading;
13 using NUnit.Framework;
16 namespace MonoTests.System.Numerics
19 public class BigIntegerTest
21 static byte[] huge_a = new byte[] {0x1D, 0x33, 0xFB, 0xFE, 0xB1, 0x2, 0x85, 0x44, 0xCA, 0xDC, 0xFB, 0x70, 0xD, 0x39, 0xB1, 0x47, 0xB6, 0xE6, 0xA2, 0xD1, 0x19, 0x1E, 0x9F, 0xE4, 0x3C, 0x1E, 0x16, 0x56, 0x13, 0x9C, 0x4D, 0xD3, 0x5C, 0x74, 0xC9, 0xBD, 0xFA, 0x56, 0x40, 0x58, 0xAC, 0x20, 0x6B, 0x55, 0xA2, 0xD5, 0x41, 0x38, 0xA4, 0x6D, 0xF6, 0x8C, };
23 static byte[] huge_b = new byte[] {0x96, 0x5, 0xDA, 0xFE, 0x93, 0x17, 0xC1, 0x93, 0xEC, 0x2F, 0x30, 0x2D, 0x8F, 0x28, 0x13, 0x99, 0x70, 0xF4, 0x4C, 0x60, 0xA6, 0x49, 0x24, 0xF9, 0xB3, 0x4A, 0x41, 0x67, 0xDC, 0xDD, 0xB1, 0xA5, 0xA6, 0xC0, 0x3D, 0x57, 0x9A, 0xCB, 0x29, 0xE2, 0x94, 0xAC, 0x6C, 0x7D, 0xEF, 0x3E, 0xC6, 0x7A, 0xC1, 0xA8, 0xC8, 0xB0, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };
25 static byte[] huge_add = new byte[] {0xB3, 0x38, 0xD5, 0xFD, 0x45, 0x1A, 0x46, 0xD8, 0xB6, 0xC, 0x2C, 0x9E, 0x9C, 0x61, 0xC4, 0xE0, 0x26, 0xDB, 0xEF, 0x31, 0xC0, 0x67, 0xC3, 0xDD, 0xF0, 0x68, 0x57, 0xBD, 0xEF, 0x79, 0xFF, 0x78, 0x3, 0x35, 0x7, 0x15, 0x95, 0x22, 0x6A, 0x3A, 0x41, 0xCD, 0xD7, 0xD2, 0x91, 0x14, 0x8, 0xB3, 0x65, 0x16, 0xBF, 0x3D, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };
27 static byte[] a_m_b = new byte[] { 0x87, 0x2D, 0x21, 0x0, 0x1E, 0xEB, 0xC3, 0xB0, 0xDD, 0xAC, 0xCB, 0x43, 0x7E, 0x10, 0x9E, 0xAE, 0x45, 0xF2, 0x55, 0x71, 0x73, 0xD4, 0x7A, 0xEB, 0x88, 0xD3, 0xD4, 0xEE, 0x36, 0xBE, 0x9B, 0x2D, 0xB6, 0xB3, 0x8B, 0x66, 0x60, 0x8B, 0x16, 0x76, 0x17, 0x74, 0xFE, 0xD7, 0xB2, 0x96, 0x7B, 0xBD, 0xE2, 0xC4, 0x2D, 0xDC, 0xDE, 0x6A, 0x19, 0xB3, 0x1E, 0x1F, 0xB4, 0xB6, 0x2A, 0xA5, 0x48, };
28 static byte[] b_m_a = new byte[] { 0x79, 0xD2, 0xDE, 0xFF, 0xE1, 0x14, 0x3C, 0x4F, 0x22, 0x53, 0x34, 0xBC, 0x81, 0xEF, 0x61, 0x51, 0xBA, 0xD, 0xAA, 0x8E, 0x8C, 0x2B, 0x85, 0x14, 0x77, 0x2C, 0x2B, 0x11, 0xC9, 0x41, 0x64, 0xD2, 0x49, 0x4C, 0x74, 0x99, 0x9F, 0x74, 0xE9, 0x89, 0xE8, 0x8B, 0x1, 0x28, 0x4D, 0x69, 0x84, 0x42, 0x1D, 0x3B, 0xD2, 0x23, 0x21, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };
30 static byte[] huge_mul = new byte[] { 0xFE, 0x83, 0xE1, 0x9B, 0x8D, 0x61, 0x40, 0xD1, 0x60, 0x19, 0xBD, 0x38, 0xF0, 0xFF, 0x90, 0xAE, 0xDD, 0xAE, 0x73, 0x2C, 0x20, 0x23, 0xCF, 0x6, 0x7A, 0xB4, 0x1C, 0xE7, 0xD9, 0x64, 0x96, 0x2C, 0x87, 0x7E, 0x1D, 0xB3, 0x8F, 0xD4, 0x33, 0xBA, 0xF4, 0x22, 0xB4, 0xDB, 0xC0, 0x5B, 0xA5, 0x64, 0xA0, 0xBC, 0xCA, 0x3E, 0x94, 0x95, 0xDA, 0x49, 0xE2, 0xA8, 0x33, 0xA2, 0x6A, 0x33, 0xB1, 0xF2, 0xEA, 0x99, 0x32, 0xD0, 0xB2, 0xAE, 0x55, 0x75, 0xBD, 0x19, 0xFC, 0x9A, 0xEC, 0x54, 0x87, 0x2A, 0x6, 0xCC, 0x78, 0xDA, 0x88, 0xBB, 0xAB, 0xA5, 0x47, 0xEF, 0xC7, 0x2B, 0xC7, 0x5B, 0x32, 0x31, 0xCD, 0xD9, 0x53, 0x96, 0x1A, 0x9D, 0x9A, 0x57, 0x40, 0x51, 0xB6, 0x5D, 0xC, 0x17, 0xD1, 0x86, 0xE9, 0xA4, 0x20, };
32 static byte[] huge_div = new byte[] { 0x0, };
33 static byte[] huge_rem = new byte[] { 0x1D, 0x33, 0xFB, 0xFE, 0xB1, 0x2, 0x85, 0x44, 0xCA, 0xDC, 0xFB, 0x70, 0xD, 0x39, 0xB1, 0x47, 0xB6, 0xE6, 0xA2, 0xD1, 0x19, 0x1E, 0x9F, 0xE4, 0x3C, 0x1E, 0x16, 0x56, 0x13, 0x9C, 0x4D, 0xD3, 0x5C, 0x74, 0xC9, 0xBD, 0xFA, 0x56, 0x40, 0x58, 0xAC, 0x20, 0x6B, 0x55, 0xA2, 0xD5, 0x41, 0x38, 0xA4, 0x6D, 0xF6, 0x8C, };
34 static byte[][] add_a = new byte[][] {
40 static byte[][] add_b = new byte[][] {
46 static byte[][] add_c = new byte[][] {
54 long[] values = new long [] { -1000000000L, -1000, -1, 0, 1, 1000, 100000000L };
55 for (int i = 0; i < values.Length; ++i) {
56 for (int j = 0; j < values.Length; ++j) {
57 var a = new BigInteger (values [i]);
58 var b = new BigInteger (values [j]);
60 Assert.AreEqual (values [i] * values [j], (long)c, "#_" + i + "_" + j);
66 public void TestHugeMul () {
67 var a = new BigInteger (huge_a);
68 var b = new BigInteger (huge_b);
69 Assert.AreEqual (huge_mul, (a * b).ToByteArray (), "#1");
74 public void DivRem () {
75 long[] values = new long [] { -10000000330L, -5000, -1, 0, 1, 1000, 333, 10234544400L };
76 for (int i = 0; i < values.Length; ++i) {
77 for (int j = 0; j < values.Length; ++j) {
80 var a = new BigInteger (values [i]);
81 var b = new BigInteger (values [j]);
83 c = BigInteger.DivRem (a, b, out d);
85 Assert.AreEqual (values [i] / values [j], (long)c, "#a_" + i + "_" + j);
86 Assert.AreEqual (values [i] % values [j], (long)d, "#b_" + i + "_" + j);
92 public void TestHugeDivRem () {
93 var a = new BigInteger (huge_a);
94 var b = new BigInteger (huge_b);
96 c = BigInteger.DivRem (a, b, out d);
98 Assert.AreEqual (huge_div, c.ToByteArray (), "#1");
99 Assert.AreEqual (huge_rem, d.ToByteArray (), "#2");
105 BigInteger.Pow (1, -1);
107 } catch (ArgumentOutOfRangeException) {}
109 Assert.AreEqual (1, (int)BigInteger.Pow (99999, 0), "#2");
110 Assert.AreEqual (99999, (int)BigInteger.Pow (99999, 1), "#5");
111 Assert.AreEqual (59049, (int)BigInteger.Pow (3, 10), "#4");
112 Assert.AreEqual (177147, (int)BigInteger.Pow (3, 11), "#5");
113 Assert.AreEqual (-177147, (int)BigInteger.Pow (-3, 11), "#6");
117 public void ModPow () {
119 BigInteger.ModPow (1, -1, 5);
121 } catch (ArgumentOutOfRangeException) {}
123 BigInteger.ModPow (1, 5, 0);
125 } catch (DivideByZeroException) {}
127 Assert.AreEqual (4L, (long)BigInteger.ModPow (3, 2, 5), "#2");
128 Assert.AreEqual (20L, (long)BigInteger.ModPow (555, 10, 71), "#3");
129 Assert.AreEqual (20L, (long)BigInteger.ModPow (-555, 10, 71), "#3");
130 Assert.AreEqual (-24L, (long)BigInteger.ModPow (-555, 11, 71), "#3");
135 Assert.AreEqual (999999, (int)BigInteger.GreatestCommonDivisor (999999, 0), "#1");
136 Assert.AreEqual (999999, (int)BigInteger.GreatestCommonDivisor (0, 999999), "#2");
137 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (999999, 1), "#3");
138 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (1, 999999), "#4");
139 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (1, 0), "#5");
140 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (0, 1), "#6");
142 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (999999, -1), "#7");
143 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (-1, 999999), "#8");
144 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (-1, 0), "#9");
145 Assert.AreEqual (1, (int)BigInteger.GreatestCommonDivisor (0, -1), "#10");
147 Assert.AreEqual (2, (int)BigInteger.GreatestCommonDivisor (12345678, 8765432), "#11");
148 Assert.AreEqual (2, (int)BigInteger.GreatestCommonDivisor (-12345678, 8765432), "#12");
149 Assert.AreEqual (2, (int)BigInteger.GreatestCommonDivisor (12345678, -8765432), "#13");
150 Assert.AreEqual (2, (int)BigInteger.GreatestCommonDivisor (-12345678, -8765432), "#14");
152 Assert.AreEqual (40, (int)BigInteger.GreatestCommonDivisor (5581 * 40, 6671 * 40), "#15");
157 double delta = 0.000000000000001d;
159 Assert.AreEqual (double.NegativeInfinity, BigInteger.Log (0), "#1");
160 Assert.AreEqual (0d, BigInteger.Log (1), "#2");
161 Assert.AreEqual (double.NaN, BigInteger.Log (-1), "#3");
162 Assert.AreEqual (2.3025850929940459d, BigInteger.Log (10), delta, "#4");
163 Assert.AreEqual (6.9077552789821368d, BigInteger.Log (1000), delta, "#5");
164 Assert.AreEqual (double.NaN, BigInteger.Log (-234), "#6");
168 public void LogN () {
169 double delta = 0.000000000000001d;
171 Assert.AreEqual (double.NaN, BigInteger.Log (10, 1), "#1");
172 Assert.AreEqual (double.NaN, BigInteger.Log (10, 0), "#2");
173 Assert.AreEqual (double.NaN, BigInteger.Log (10, -1), "#3");
175 Assert.AreEqual (double.NaN, BigInteger.Log (10, double.NaN), "#4");
176 Assert.AreEqual (double.NaN, BigInteger.Log (10, double.NegativeInfinity), "#5");
177 Assert.AreEqual (double.NaN, BigInteger.Log (10, double.PositiveInfinity), "#6");
179 Assert.AreEqual (0d, BigInteger.Log (1, 0), "#7");
180 Assert.AreEqual (double.NaN, BigInteger.Log (1, double.NegativeInfinity), "#8");
181 Assert.AreEqual (0, BigInteger.Log (1, double.PositiveInfinity), "#9");
182 Assert.AreEqual (double.NaN, BigInteger.Log (1, double.NaN), "#10");
184 Assert.AreEqual (-2.5129415947320606d, BigInteger.Log (10, 0.4), delta, "#11");
188 public void DivRemByZero () {
191 c = BigInteger.DivRem (100, 0, out d);
193 } catch (DivideByZeroException) {}
197 public void TestAdd () {
198 for (int i = 0; i < add_a.Length; ++i) {
199 var a = new BigInteger (add_a [i]);
200 var b = new BigInteger (add_b [i]);
201 var c = new BigInteger (add_c [i]);
203 Assert.AreEqual (c, a + b, "#" + i + "a");
204 Assert.AreEqual (c, b + a, "#" + i + "b");
205 Assert.AreEqual (c, BigInteger.Add (a, b), "#" + i + "c");
206 Assert.AreEqual (add_c [i], (a + b).ToByteArray (), "#" + i + "d");
211 public void TestAdd2 () {
212 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
213 for (int i = 0; i < values.Length; ++i) {
214 for (int j = 0; j < values.Length; ++j) {
215 var a = new BigInteger (values [i]);
216 var b = new BigInteger (values [j]);
218 Assert.AreEqual (values [i] + values [j], (long)c, "#_" + i + "_" + j);
224 public void TestHugeSub () {
225 var a = new BigInteger (huge_a);
226 var b = new BigInteger (huge_b);
227 Assert.AreEqual (a_m_b, (a - b).ToByteArray (), "#1");
228 Assert.AreEqual (b_m_a, (b - a).ToByteArray (), "#2");
232 public void TestSub () {
233 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
234 for (int i = 0; i < values.Length; ++i) {
235 for (int j = 0; j < values.Length; ++j) {
236 var a = new BigInteger (values [i]);
237 var b = new BigInteger (values [j]);
239 var d = BigInteger.Subtract (a, b);
241 Assert.AreEqual (values [i] - values [j], (long)c, "#_" + i + "_" + j);
242 Assert.AreEqual (values [i] - values [j], (long)d, "#_" + i + "_" + j);
248 public void TestMin () {
249 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
250 for (int i = 0; i < values.Length; ++i) {
251 for (int j = 0; j < values.Length; ++j) {
252 var a = new BigInteger (values [i]);
253 var b = new BigInteger (values [j]);
254 var c = BigInteger.Min (a, b);
256 Assert.AreEqual (Math.Min (values [i], values [j]), (long)c, "#_" + i + "_" + j);
262 public void TestMax () {
263 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
264 for (int i = 0; i < values.Length; ++i) {
265 for (int j = 0; j < values.Length; ++j) {
266 var a = new BigInteger (values [i]);
267 var b = new BigInteger (values [j]);
268 var c = BigInteger.Max (a, b);
270 Assert.AreEqual (Math.Max (values [i], values [j]), (long)c, "#_" + i + "_" + j);
276 public void TestAbs () {
277 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
278 for (int i = 0; i < values.Length; ++i) {
279 var a = new BigInteger (values [i]);
280 var c = BigInteger.Abs (a);
282 Assert.AreEqual (Math.Abs (values [i]), (long)c, "#_" + i);
287 public void TestNegate () {
288 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
289 for (int i = 0; i < values.Length; ++i) {
290 var a = new BigInteger (values [i]);
292 var d = BigInteger.Negate (a);
294 Assert.AreEqual (-values [i], (long)c, "#_" + i);
295 Assert.AreEqual (-values [i], (long)d, "#_" + i);
300 public void TestInc () {
301 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
302 for (int i = 0; i < values.Length; ++i) {
303 var a = new BigInteger (values [i]);
306 Assert.AreEqual (++values [i], (long)b, "#_" + i);
311 public void TestDec () {
312 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
313 for (int i = 0; i < values.Length; ++i) {
314 var a = new BigInteger (values [i]);
317 Assert.AreEqual (--values [i], (long)b, "#_" + i);
322 public void TestBitwiseOps () {
323 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xFFFF00000000L };
324 for (int i = 0; i < values.Length; ++i) {
325 for (int j = 0; j < values.Length; ++j) {
326 var a = new BigInteger (values [i]);
327 var b = new BigInteger (values [j]);
330 Assert.AreEqual (values [i] | values [j], (long)(a | b) , "#b_" + i + "_" + j);
331 Assert.AreEqual (values [i] & values [j], (long)(a & b) , "#a_" + i + "_" + j);
332 Assert.AreEqual (values [i] ^ values [j], (long)(a ^ b) , "#c_" + i + "_" + j);
333 Assert.AreEqual (~values [i], (long)~a , "#d_" + i + "_" + j);
339 public void TestLeftShift () {
340 Assert.AreEqual (new byte[] {0x00, 0x28},
341 (new BigInteger(0x0A) << 10).ToByteArray (), "#1");
342 Assert.AreEqual (new byte[] {0x00, 0xD8},
343 (new BigInteger(-10) << 10).ToByteArray (), "#2");
344 Assert.AreEqual (new byte[] {0x00, 0x00, 0xFF},
345 (new BigInteger(-1) << 16).ToByteArray (), "#3");
346 Assert.AreEqual (new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A},
347 (new BigInteger(0x0A) << 80).ToByteArray (), "#4");
348 Assert.AreEqual (new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6},
349 (new BigInteger(-10) << 80).ToByteArray (), "#5");
350 Assert.AreEqual (new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},
351 (new BigInteger(-1) << 80).ToByteArray (), "#6");
352 Assert.AreEqual (new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xD9},
353 (new BigInteger(-1234) << 75).ToByteArray (), "#7");
354 Assert.AreEqual (new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x91, 0x00},
355 (new BigInteger(0x1234) << 75).ToByteArray (), "#8");
357 Assert.AreEqual (new byte[] {0xFF, 0x00}, (new BigInteger(0xFF00) << -8).ToByteArray (), "#9");
361 public void TestRightShift () {
362 Assert.AreEqual (new byte[] {0x16, 0xB0, 0x4C, 0x02},
363 (new BigInteger(1234567899L) >> 5).ToByteArray (), "#1");
365 Assert.AreEqual (new byte[] {0x2C, 0x93, 0x00},
366 (new BigInteger(1234567899L) >> 15).ToByteArray (), "#2");
368 Assert.AreEqual (new byte[] {0xFF, 0xFF, 0x7F},
369 (new BigInteger(long.MaxValue - 100) >> 40).ToByteArray (), "#3");
371 Assert.AreEqual (new byte[] {0xE9, 0x4F, 0xB3, 0xFD},
372 (new BigInteger(-1234567899L) >> 5).ToByteArray (), "#4");
374 Assert.AreEqual (new byte[] {0xD3, 0x6C, 0xFF},
375 (new BigInteger(-1234567899L) >> 15).ToByteArray (), "#5");
377 Assert.AreEqual (new byte[] {0x00, 0x00, 0x80},
378 (new BigInteger(long.MinValue + 100) >> 40).ToByteArray (), "#6");
380 Assert.AreEqual (new byte[] { 0xFF },
381 (new BigInteger(-1234567899L) >> 90).ToByteArray (), "#7");
383 Assert.AreEqual (new byte[] {0x00},
384 (new BigInteger(999999) >> 90).ToByteArray (), "#8");
386 Assert.AreEqual (new byte[] {0x00, 0x00, 0xFF, 0x00}, (new BigInteger(0xFF00) >> -8).ToByteArray (), "#9");
390 public void CompareOps () {
391 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
392 for (int i = 0; i < values.Length; ++i) {
393 for (int j = 0; j < values.Length; ++j) {
394 var a = new BigInteger (values [i]);
395 var b = new BigInteger (values [j]);
397 Assert.AreEqual (values [i].CompareTo (values [j]), a.CompareTo (b), "#a_" + i + "_" + j);
398 Assert.AreEqual (values [i].CompareTo (values [j]), BigInteger.Compare (a, b), "#b_" + i + "_" + j);
400 Assert.AreEqual (values [i] < values [j], a < b, "#c_" + i + "_" + j);
401 Assert.AreEqual (values [i] <= values [j], a <= b, "#d_" + i + "_" + j);
402 Assert.AreEqual (values [i] == values [j], a == b, "#e_" + i + "_" + j);
403 Assert.AreEqual (values [i] != values [j], a != b, "#f_" + i + "_" + j);
404 Assert.AreEqual (values [i] >= values [j], a >= b, "#g_" + i + "_" + j);
405 Assert.AreEqual (values [i] > values [j], a > b, "#h_" + i + "_" + j);
411 public void CompareOps2 () {
412 BigInteger a = new BigInteger (100000000000L);
413 BigInteger b = new BigInteger (28282828282UL);
415 Assert.IsTrue (a >= b, "#1");
416 Assert.IsTrue (a >= b, "#2");
417 Assert.IsFalse (a < b, "#3");
418 Assert.IsFalse (a <= b, "#4");
419 Assert.AreEqual (1, a.CompareTo (b), "#5");
423 public void CompareULong () {
424 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xAA00000000L };
425 ulong[] uvalues = new ulong [] {0, 1, 1000, 100000000000L, 999999, 28282828282, 0xAA00000000, ulong.MaxValue };
426 for (int i = 0; i < values.Length; ++i) {
427 for (int j = 0; j < uvalues.Length; ++j) {
428 var a = new BigInteger (values [i]);
430 var c = new BigInteger (b);
432 Assert.AreEqual (a.CompareTo (c), a.CompareTo (b), "#a_" + i + "_" + j);
434 Assert.AreEqual (a > c, a > b, "#b_" + i + "_" + j);
435 Assert.AreEqual (a < c, a < b, "#c_" + i + "_" + j);
436 Assert.AreEqual (a <= c, a <= b, "#d_" + i + "_" + j);
437 Assert.AreEqual (a == c, a == b, "#e_" + i + "_" + j);
438 Assert.AreEqual (a != c, a != b, "#f_" + i + "_" + j);
439 Assert.AreEqual (a >= c, a >= b, "#g_" + i + "_" + j);
441 Assert.AreEqual (c > a, b > a, "#ib_" + i + "_" + j);
442 Assert.AreEqual (c < a, b < a, "#ic_" + i + "_" + j);
443 Assert.AreEqual (c <= a, b <= a, "#id_" + i + "_" + j);
444 Assert.AreEqual (c == a, b == a, "#ie_" + i + "_" + j);
445 Assert.AreEqual (c != a, b != a, "#if_" + i + "_" + j);
446 Assert.AreEqual (c >= a, b >= a, "#ig_" + i + "_" + j);
452 public void CompareLong () {
453 long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 9999999, 100000000000L, 0xAA00000000, long.MaxValue, long.MinValue };
455 for (int i = 0; i < values.Length; ++i) {
456 for (int j = 0; j < values.Length; ++j) {
457 var a = new BigInteger (values [i]);
459 var c = new BigInteger (b);
461 Assert.AreEqual (a.CompareTo (c), a.CompareTo (b), "#a_" + i + "_" + j);
463 Assert.AreEqual (a > c, a > b, "#b_" + i + "_" + j);
464 Assert.AreEqual (a < c, a < b, "#c_" + i + "_" + j);
465 Assert.AreEqual (a <= c, a <= b, "#d_" + i + "_" + j);
466 Assert.AreEqual (a == c, a == b, "#e_" + i + "_" + j);
467 Assert.AreEqual (a != c, a != b, "#f_" + i + "_" + j);
468 Assert.AreEqual (a >= c, a >= b, "#g_" + i + "_" + j);
470 Assert.AreEqual (c > a, b > a, "#ib_" + i + "_" + j);
471 Assert.AreEqual (c < a, b < a, "#ic_" + i + "_" + j);
472 Assert.AreEqual (c <= a, b <= a, "#id_" + i + "_" + j);
473 Assert.AreEqual (c == a, b == a, "#ie_" + i + "_" + j);
474 Assert.AreEqual (c != a, b != a, "#if_" + i + "_" + j);
475 Assert.AreEqual (c >= a, b >= a, "#ig_" + i + "_" + j);
481 public void TestEquals () {
482 var a = new BigInteger (10);
483 var b = new BigInteger (10);
484 var c = new BigInteger (-10);
486 Assert.AreEqual (a, b, "#1");
487 Assert.AreNotEqual (a, c, "#2");
488 Assert.AreNotEqual (a, 10, "#3");
492 public void ByteArrayCtor ()
495 new BigInteger (null);
497 } catch (ArgumentNullException) {}
499 Assert.AreEqual (0, (int)new BigInteger (new byte [0]), "#2");
501 Assert.AreEqual (0, (int)new BigInteger (new byte [1]), "#3");
503 Assert.AreEqual (0, (int)new BigInteger (new byte [2]), "#4");
507 public void IntCtorRoundTrip ()
509 int[] values = new int [] {
510 int.MinValue, -0x2F33BB, -0x1F33, -0x33, 0, 0x33,
511 0x80, 0x8190, 0xFF0011, 0x1234, 0x11BB99, 0x44BB22CC,
513 foreach (var val in values) {
514 var a = new BigInteger (val);
515 var b = new BigInteger (a.ToByteArray ());
517 Assert.AreEqual (val, (int)a, "#a_" + val);
518 Assert.AreEqual (val, (int)b, "#b_" + val);
523 public void LongCtorRoundTrip ()
525 long[] values = new long [] {
526 0, long.MinValue, long.MaxValue, -1, 1L + int.MaxValue, -1L + int.MinValue, 0x1234, 0xFFFFFFFFL, 0x1FFFFFFFFL, -0xFFFFFFFFL, -0x1FFFFFFFFL,
527 0x100000000L, -0x100000000L, 0x100000001L, -0x100000001L };
528 foreach (var val in values) {
529 var a = new BigInteger (val);
530 var b = new BigInteger (a.ToByteArray ());
532 Assert.AreEqual (val, (long)a, "#a_" + val);
533 Assert.AreEqual (val, (long)b, "#b_" + val);
538 public void ByteArrayCtorRoundTrip ()
540 var arr = new byte [] { 1,2,3,4,5,6,7,8,9 };
541 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#1");
543 arr = new byte [] { 1,2,3,4,5,6,7,8,0xFF, 0x0};
544 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#2");
546 arr = new byte [] { 1,2,3,4,5,6,7,8,9, 0xF0 };
547 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#3");
549 arr = new byte [] { 1};
550 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#4");
552 arr = new byte [] { 1,2 };
553 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#5");
555 arr = new byte [] { 1,2,3 };
556 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#6");
558 arr = new byte [] { 1,2,3,4 };
559 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#7");
561 arr = new byte [] { 1,2,3,4,5 };
562 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#8");
564 arr = new byte [] { 1,2,3,4,5,6 };
565 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#9");
567 arr = new byte [] { 1,2,3,4,5,6,7 };
568 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#10");
570 arr = new byte [] { 1,2,3,4,5 };
571 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#11");
573 arr = new byte [] { 0 };
574 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#12");
576 arr = new byte [] { 0xFF, 00 };
577 Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#13");
579 arr = new byte [] { 1, 0, 0, 0, 0, 0, };
580 Assert.AreEqual (new byte [1] {1}, new BigInteger (arr).ToByteArray (), "#14");
584 public void TestIntCtorProperties ()
586 BigInteger a = new BigInteger (10);
587 Assert.IsTrue (a.IsEven, "#1");
588 Assert.IsFalse (a.IsOne, "#2");
589 Assert.IsFalse (a.IsPowerOfTwo, "#3");
590 Assert.IsFalse (a.IsZero, "#4");
591 Assert.AreEqual (1, a.Sign, "#5");
593 Assert.IsFalse (new BigInteger (11).IsEven, "#6");
594 Assert.IsTrue (new BigInteger (1).IsOne, "#7");
595 Assert.IsTrue (new BigInteger (32).IsPowerOfTwo, "#8");
596 Assert.IsTrue (new BigInteger (0).IsZero, "#9");
597 Assert.AreEqual (0, new BigInteger (0).Sign, "#10");
598 Assert.AreEqual (-1, new BigInteger (-99999).Sign, "#11");
600 Assert.IsFalse (new BigInteger (0).IsPowerOfTwo, "#12");
601 Assert.IsFalse (new BigInteger (-16).IsPowerOfTwo, "#13");
602 Assert.IsTrue (new BigInteger (1).IsPowerOfTwo, "#14");
606 public void TestIntCtorToString ()
608 Assert.AreEqual ("5555", new BigInteger (5555).ToString (), "#1");
609 Assert.AreEqual ("-99999", new BigInteger (-99999).ToString (), "#2");
613 public void TestToStringFmt ()
615 Assert.AreEqual ("123456789123456", new BigInteger (123456789123456).ToString ("D2"), "#1");
616 Assert.AreEqual ("0000000005", new BigInteger (5).ToString ("d10"), "#2");
617 Assert.AreEqual ("0A8", new BigInteger (168).ToString ("X"), "#3");
618 Assert.AreEqual ("0", new BigInteger (0).ToString ("X"), "#4");
619 Assert.AreEqual ("1", new BigInteger (1).ToString ("X"), "#5");
620 Assert.AreEqual ("0A", new BigInteger (10).ToString ("X"), "#6");
621 Assert.AreEqual ("F6", new BigInteger (-10).ToString ("X"), "#7");
623 Assert.AreEqual ("10000000000000000000000000000000000000000000000000000000", BigInteger.Pow (10, 55).ToString ("G"), "#8");
625 Assert.AreEqual ("10000000000000000000000000000000000000000000000000000000", BigInteger.Pow (10, 55).ToString ("R"), "#9");
628 Assert.AreEqual ("000000000A", new BigInteger (10).ToString ("X10"), "#10");
629 Assert.AreEqual ("0000000010", new BigInteger (10).ToString ("G10"), "#11");
633 public void TestToStringFmtProvider ()
635 NumberFormatInfo info = new NumberFormatInfo ();
636 info.NegativeSign = ">";
637 info.PositiveSign = "%";
639 Assert.AreEqual ("10", new BigInteger (10).ToString (info), "#1");
640 Assert.AreEqual (">10", new BigInteger (-10).ToString (info), "#2");
641 Assert.AreEqual ("0A", new BigInteger (10).ToString ("X", info), "#3");
642 Assert.AreEqual ("F6", new BigInteger (-10).ToString ("X", info), "#4");
643 Assert.AreEqual ("10", new BigInteger (10).ToString ("G", info), "#5");
644 Assert.AreEqual (">10", new BigInteger (-10).ToString ("G", info), "#6");
645 Assert.AreEqual ("10", new BigInteger (10).ToString ("D", info), "#7");
646 Assert.AreEqual (">10", new BigInteger (-10).ToString ("D", info), "#8");
647 Assert.AreEqual ("10", new BigInteger (10).ToString ("R", info), "#9");
648 Assert.AreEqual (">10", new BigInteger (-10).ToString ("R", info), "#10");
650 info = new NumberFormatInfo ();
651 info.NegativeSign = "#$%";
652 Assert.AreEqual ("#$%10", new BigInteger (-10).ToString (info), "#2");
653 Assert.AreEqual ("#$%10", new BigInteger (-10).ToString (null, info), "#2");
655 info = new NumberFormatInfo ();
656 Assert.AreEqual ("-10", new BigInteger (-10).ToString (info), "#2");
661 public void TestToIntOperator ()
664 int v = (int)new BigInteger (huge_a);
666 } catch (OverflowException) {}
669 int v = (int)new BigInteger (1L + int.MaxValue);
671 } catch (OverflowException) {}
674 int v = (int)new BigInteger (-1L + int.MinValue);
676 } catch (OverflowException) {}
678 Assert.AreEqual (int.MaxValue, (int)new BigInteger (int.MaxValue), "#4");
679 Assert.AreEqual (int.MinValue, (int)new BigInteger (int.MinValue), "#5");
684 public void TestToLongOperator ()
687 long v = (long)new BigInteger (huge_a);
689 } catch (OverflowException) {}
693 long v = (long)new BigInteger (new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 });
695 } catch (OverflowException) {}
697 //TODO long.MinValue - 1
699 long v = (long)new BigInteger (new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF });
701 } catch (OverflowException) {}
703 Assert.AreEqual (long.MaxValue, (long)new BigInteger (long.MaxValue), "#4");
704 Assert.AreEqual (long.MinValue, (long)new BigInteger (long.MinValue), "#5");
708 public void TestIntCtorToByteArray ()
710 Assert.AreEqual (new byte[] { 0xFF }, new BigInteger (-1).ToByteArray (), "#1");
711 Assert.AreEqual (new byte[] { 0xD4, 0xFE }, new BigInteger (-300).ToByteArray (), "#2");
712 Assert.AreEqual (new byte[] { 0x80, 0x00 }, new BigInteger (128).ToByteArray (), "#3");
713 Assert.AreEqual (new byte[] { 0x00, 0x60 }, new BigInteger (0x6000).ToByteArray (), "#4");
714 Assert.AreEqual (new byte[] { 0x00, 0x80, 0x00 }, new BigInteger (0x8000).ToByteArray (), "#5");
715 Assert.AreEqual (new byte[] { 0xDD, 0xBC, 0x00, 0x7A }, new BigInteger (0x7A00BCDD).ToByteArray (), "#6");
716 Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger (int.MaxValue).ToByteArray (), "#7");
717 Assert.AreEqual (new byte[] { 0x00, 0x00, 0x00, 0x80 }, new BigInteger (int.MinValue).ToByteArray (), "#8");
718 Assert.AreEqual (new byte[] { 0x01, 0x00, 0x00, 0x80 }, new BigInteger (int.MinValue + 1).ToByteArray (), "#9");
719 Assert.AreEqual (new byte[] { 0x7F }, new BigInteger (0x7F).ToByteArray (), "#10");
720 Assert.AreEqual (new byte[] { 0x45, 0xCC, 0xD0 }, new BigInteger (-0x2F33BB).ToByteArray (), "#11");
721 Assert.AreEqual (new byte[] { 0 }, new BigInteger (0).ToByteArray (), "#12");
725 public void TestLongCtorToByteArray ()
727 Assert.AreEqual (new byte[] { 0x01 }, new BigInteger (0x01L).ToByteArray (), "#1");
728 Assert.AreEqual (new byte[] { 0x02, 0x01 }, new BigInteger (0x0102L).ToByteArray (), "#2");
729 Assert.AreEqual (new byte[] { 0x03, 0x02, 0x01 }, new BigInteger (0x010203L).ToByteArray (), "#3");
730 Assert.AreEqual (new byte[] { 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x01020304L).ToByteArray (), "#4");
731 Assert.AreEqual (new byte[] { 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x0102030405L).ToByteArray (), "#5");
732 Assert.AreEqual (new byte[] { 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x010203040506L).ToByteArray (), "#6");
733 Assert.AreEqual (new byte[] { 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x01020304050607L).ToByteArray (), "#7");
734 Assert.AreEqual (new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x0102030405060708L).ToByteArray (), "#8");
736 Assert.AreEqual (new byte[] { 0xFF }, new BigInteger (-0x01L).ToByteArray (), "#1m");
737 Assert.AreEqual (new byte[] { 0xFE, 0xFE}, new BigInteger (-0x0102L).ToByteArray (), "#2m");
738 Assert.AreEqual (new byte[] { 0xFD, 0xFD, 0xFE }, new BigInteger (-0x010203L).ToByteArray (), "#3m");
739 Assert.AreEqual (new byte[] { 0xFC, 0xFC, 0xFD, 0xFE}, new BigInteger (-0x01020304L).ToByteArray (), "#4m");
740 Assert.AreEqual (new byte[] { 0xFB, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x0102030405L).ToByteArray (), "#5m");
741 Assert.AreEqual (new byte[] { 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x010203040506L).ToByteArray (), "#6m");
742 Assert.AreEqual (new byte[] { 0xF9, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x01020304050607L).ToByteArray (), "#7m");
743 Assert.AreEqual (new byte[] { 0xF8, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x0102030405060708L).ToByteArray (), "#8m");
746 Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger (long.MaxValue).ToByteArray (), "#9");
747 Assert.AreEqual (new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }, new BigInteger (long.MinValue).ToByteArray (), "#10");
749 Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0x7F, 0xFF }, new BigInteger (-2147483649L).ToByteArray (), "11");
753 public void IComparable () {
754 var a = new BigInteger (99);
755 Assert.AreEqual (-1, a.CompareTo (100), "#1");
756 Assert.AreEqual (1, a.CompareTo (null), "#2");
760 public void ShortOperators () {
761 Assert.AreEqual (22, (int)new BigInteger ((short)22), "#1");
762 Assert.AreEqual (-22, (int)new BigInteger ((short)-22), "#2");
765 short x = (short)new BigInteger (10000000);
767 } catch (OverflowException) {}
770 short x = (short)new BigInteger (-10000000);
772 } catch (OverflowException) {}
776 public void DoubleCtor () {
778 new BigInteger (double.NaN);
780 } catch (OverflowException) {}
782 new BigInteger (double.NegativeInfinity);
784 } catch (OverflowException) {}
786 new BigInteger (double.PositiveInfinity);
788 } catch (OverflowException) {}
790 Assert.AreEqual (10000, (int)new BigInteger (10000.2), "#4");
791 Assert.AreEqual (10000, (int)new BigInteger (10000.9), "#5");
793 Assert.AreEqual (10000, (int)new BigInteger (10000.2), "#6");
794 Assert.AreEqual (0, (int)new BigInteger (0.9), "#7");
796 Assert.AreEqual (12345678999L, (long)new BigInteger (12345678999.33), "#8");
800 public void DoubleConversion () {
801 Assert.AreEqual (999d, (double)new BigInteger (999), "#1");
802 Assert.AreEqual (double.PositiveInfinity, (double)BigInteger.Pow (2, 1024), "#2");
803 Assert.AreEqual (double.NegativeInfinity, (double)BigInteger.Pow (-2, 1025), "#3");
808 public void DecimalCtor () {
809 Assert.AreEqual (999, (int)new BigInteger (999.99m), "#1");
810 Assert.AreEqual (-10000, (int)new BigInteger (-10000m), "#2");
811 Assert.AreEqual (0, (int)new BigInteger (0m), "#3");
815 public void DecimalConversion () {
816 Assert.AreEqual (999m, (decimal)new BigInteger (999), "#1");
819 var x = (decimal)BigInteger.Pow (2, 1024);
821 } catch (OverflowException) {}
824 var x = (decimal)BigInteger.Pow (-2, 1025);
826 } catch (OverflowException) {}
828 Assert.AreEqual (0m, (decimal)new BigInteger (0), "#4");
829 Assert.AreEqual (1m, (decimal)new BigInteger (1), "#5");
830 Assert.AreEqual (-1m, (decimal)new BigInteger (-1), "#6");
831 Assert.AreEqual (9999999999999999999999999999m,
832 (decimal)new BigInteger (9999999999999999999999999999m), "#7");
836 public void Parse () {
838 BigInteger.Parse (null);
840 } catch (ArgumentNullException) {}
843 BigInteger.Parse ("");
845 } catch (FormatException) {}
849 BigInteger.Parse (" ");
851 } catch (FormatException) {}
854 BigInteger.Parse ("hh");
856 } catch (FormatException) {}
859 BigInteger.Parse ("-");
861 } catch (FormatException) {}
864 BigInteger.Parse ("-+");
866 } catch (FormatException) {}
868 Assert.AreEqual (10, (int)BigInteger.Parse("+10"), "#7");
869 Assert.AreEqual (10, (int)BigInteger.Parse("10 "), "#8");
870 Assert.AreEqual (-10, (int)BigInteger.Parse("-10 "), "#9");
874 public void TryParse () {
875 BigInteger x = BigInteger.One;
876 Assert.IsFalse (BigInteger.TryParse (null, out x), "#1");
877 Assert.AreEqual (0, (int)x, "#1a");
878 Assert.IsFalse (BigInteger.TryParse ("", out x), "#2");
879 Assert.IsFalse (BigInteger.TryParse (" ", out x), "#3");
880 Assert.IsFalse (BigInteger.TryParse (" -", out x), "#4");
881 Assert.IsFalse (BigInteger.TryParse (" +", out x), "#5");
882 Assert.IsFalse (BigInteger.TryParse (" FF", out x), "#6");
884 Assert.IsTrue (BigInteger.TryParse (" 99", out x), "#7");
885 Assert.AreEqual (99, (int)x, "#8");
887 Assert.IsTrue (BigInteger.TryParse ("+133", out x), "#9");
888 Assert.AreEqual (133, (int)x, "#10");
890 Assert.IsTrue (BigInteger.TryParse ("-010", out x), "#11");
891 Assert.AreEqual (-10, (int)x, "#12");
895 public void TryParseWeirdCulture () {
896 var old = Thread.CurrentThread.CurrentCulture;
897 var cur = (CultureInfo)old.Clone ();
899 NumberFormatInfo ninfo = new NumberFormatInfo ();
900 ninfo.NegativeSign = ">";
901 ninfo.PositiveSign = "%";
902 cur.NumberFormat = ninfo;
904 Thread.CurrentThread.CurrentCulture = cur;
906 BigInteger x = BigInteger.Zero;
909 Assert.IsTrue (BigInteger.TryParse ("%11", out x), "#1");
910 Assert.AreEqual (11, (int)x, "#2");
912 Assert.IsTrue (BigInteger.TryParse (">11", out x), "#3");
913 Assert.AreEqual (-11, (int)x, "#4");
915 Thread.CurrentThread.CurrentCulture = old;
920 public void CompareToLongToWithBigNumber () {
921 var a = BigInteger.Parse ("123456789123456789");
922 var b = BigInteger.Parse ("-123456789123456789");
923 Assert.AreEqual (1, a.CompareTo (2000));
924 Assert.AreEqual (1, a.CompareTo (-2000));
925 Assert.AreEqual (-1, b.CompareTo (2000));
926 Assert.AreEqual (-1, b.CompareTo (-2000));
930 public void LeftShitByInt ()
932 var v = BigInteger.Parse("230794411440927908251127453634");
934 Assert.AreEqual ("230794411440927908251127453634", (v << 0).ToString (), "#0");
935 Assert.AreEqual ("461588822881855816502254907268", (v << 1).ToString (), "#1");
936 Assert.AreEqual ("923177645763711633004509814536", (v << 2).ToString (), "#2");
937 Assert.AreEqual ("1846355291527423266009019629072", (v << 3).ToString (), "#3");
938 Assert.AreEqual ("3692710583054846532018039258144", (v << 4).ToString (), "#4");
939 Assert.AreEqual ("7385421166109693064036078516288", (v << 5).ToString (), "#5");
940 Assert.AreEqual ("14770842332219386128072157032576", (v << 6).ToString (), "#6");
941 Assert.AreEqual ("29541684664438772256144314065152", (v << 7).ToString (), "#7");
942 Assert.AreEqual ("59083369328877544512288628130304", (v << 8).ToString (), "#8");
943 Assert.AreEqual ("118166738657755089024577256260608", (v << 9).ToString (), "#9");
944 Assert.AreEqual ("236333477315510178049154512521216", (v << 10).ToString (), "#10");
945 Assert.AreEqual ("472666954631020356098309025042432", (v << 11).ToString (), "#11");
946 Assert.AreEqual ("945333909262040712196618050084864", (v << 12).ToString (), "#12");
947 Assert.AreEqual ("1890667818524081424393236100169728", (v << 13).ToString (), "#13");
948 Assert.AreEqual ("3781335637048162848786472200339456", (v << 14).ToString (), "#14");
949 Assert.AreEqual ("7562671274096325697572944400678912", (v << 15).ToString (), "#15");
950 Assert.AreEqual ("15125342548192651395145888801357824", (v << 16).ToString (), "#16");
951 Assert.AreEqual ("30250685096385302790291777602715648", (v << 17).ToString (), "#17");
952 Assert.AreEqual ("60501370192770605580583555205431296", (v << 18).ToString (), "#18");
953 Assert.AreEqual ("121002740385541211161167110410862592", (v << 19).ToString (), "#19");
954 Assert.AreEqual ("242005480771082422322334220821725184", (v << 20).ToString (), "#20");
955 Assert.AreEqual ("484010961542164844644668441643450368", (v << 21).ToString (), "#21");
956 Assert.AreEqual ("968021923084329689289336883286900736", (v << 22).ToString (), "#22");
957 Assert.AreEqual ("1936043846168659378578673766573801472", (v << 23).ToString (), "#23");
958 Assert.AreEqual ("3872087692337318757157347533147602944", (v << 24).ToString (), "#24");
959 Assert.AreEqual ("7744175384674637514314695066295205888", (v << 25).ToString (), "#25");
960 Assert.AreEqual ("15488350769349275028629390132590411776", (v << 26).ToString (), "#26");
961 Assert.AreEqual ("30976701538698550057258780265180823552", (v << 27).ToString (), "#27");
962 Assert.AreEqual ("61953403077397100114517560530361647104", (v << 28).ToString (), "#28");
963 Assert.AreEqual ("123906806154794200229035121060723294208", (v << 29).ToString (), "#29");
964 Assert.AreEqual ("247813612309588400458070242121446588416", (v << 30).ToString (), "#30");
965 Assert.AreEqual ("495627224619176800916140484242893176832", (v << 31).ToString (), "#31");
966 Assert.AreEqual ("991254449238353601832280968485786353664", (v << 32).ToString (), "#32");
967 Assert.AreEqual ("1982508898476707203664561936971572707328", (v << 33).ToString (), "#33");
968 Assert.AreEqual ("3965017796953414407329123873943145414656", (v << 34).ToString (), "#34");
969 Assert.AreEqual ("7930035593906828814658247747886290829312", (v << 35).ToString (), "#35");
970 Assert.AreEqual ("15860071187813657629316495495772581658624", (v << 36).ToString (), "#36");
971 Assert.AreEqual ("31720142375627315258632990991545163317248", (v << 37).ToString (), "#37");
972 Assert.AreEqual ("63440284751254630517265981983090326634496", (v << 38).ToString (), "#38");
973 Assert.AreEqual ("126880569502509261034531963966180653268992", (v << 39).ToString (), "#39");
974 Assert.AreEqual ("253761139005018522069063927932361306537984", (v << 40).ToString (), "#40");
975 Assert.AreEqual ("507522278010037044138127855864722613075968", (v << 41).ToString (), "#41");
976 Assert.AreEqual ("1015044556020074088276255711729445226151936", (v << 42).ToString (), "#42");
977 Assert.AreEqual ("2030089112040148176552511423458890452303872", (v << 43).ToString (), "#43");
978 Assert.AreEqual ("4060178224080296353105022846917780904607744", (v << 44).ToString (), "#44");
979 Assert.AreEqual ("8120356448160592706210045693835561809215488", (v << 45).ToString (), "#45");
980 Assert.AreEqual ("16240712896321185412420091387671123618430976", (v << 46).ToString (), "#46");
981 Assert.AreEqual ("32481425792642370824840182775342247236861952", (v << 47).ToString (), "#47");
982 Assert.AreEqual ("64962851585284741649680365550684494473723904", (v << 48).ToString (), "#48");
983 Assert.AreEqual ("129925703170569483299360731101368988947447808", (v << 49).ToString (), "#49");
984 Assert.AreEqual ("259851406341138966598721462202737977894895616", (v << 50).ToString (), "#50");
985 Assert.AreEqual ("519702812682277933197442924405475955789791232", (v << 51).ToString (), "#51");
986 Assert.AreEqual ("1039405625364555866394885848810951911579582464", (v << 52).ToString (), "#52");
987 Assert.AreEqual ("2078811250729111732789771697621903823159164928", (v << 53).ToString (), "#53");
988 Assert.AreEqual ("4157622501458223465579543395243807646318329856", (v << 54).ToString (), "#54");
989 Assert.AreEqual ("8315245002916446931159086790487615292636659712", (v << 55).ToString (), "#55");
990 Assert.AreEqual ("16630490005832893862318173580975230585273319424", (v << 56).ToString (), "#56");
991 Assert.AreEqual ("33260980011665787724636347161950461170546638848", (v << 57).ToString (), "#57");
992 Assert.AreEqual ("66521960023331575449272694323900922341093277696", (v << 58).ToString (), "#58");
993 Assert.AreEqual ("133043920046663150898545388647801844682186555392", (v << 59).ToString (), "#59");
994 Assert.AreEqual ("266087840093326301797090777295603689364373110784", (v << 60).ToString (), "#60");
995 Assert.AreEqual ("532175680186652603594181554591207378728746221568", (v << 61).ToString (), "#61");
996 Assert.AreEqual ("1064351360373305207188363109182414757457492443136", (v << 62).ToString (), "#62");
997 Assert.AreEqual ("2128702720746610414376726218364829514914984886272", (v << 63).ToString (), "#63");
998 Assert.AreEqual ("4257405441493220828753452436729659029829969772544", (v << 64).ToString (), "#64");
999 Assert.AreEqual ("8514810882986441657506904873459318059659939545088", (v << 65).ToString (), "#65");
1000 Assert.AreEqual ("17029621765972883315013809746918636119319879090176", (v << 66).ToString (), "#66");
1001 Assert.AreEqual ("34059243531945766630027619493837272238639758180352", (v << 67).ToString (), "#67");
1002 Assert.AreEqual ("68118487063891533260055238987674544477279516360704", (v << 68).ToString (), "#68");
1003 Assert.AreEqual ("136236974127783066520110477975349088954559032721408", (v << 69).ToString (), "#69");
1008 public void RightShitByInt ()
1010 var v = BigInteger.Parse("230794411440927908251127453634");
1011 v = v * BigInteger.Pow (2, 70);
1013 Assert.AreEqual ("272473948255566133040220955950698177909118065442816", (v >> 0).ToString (), "#0");
1014 Assert.AreEqual ("136236974127783066520110477975349088954559032721408", (v >> 1).ToString (), "#1");
1015 Assert.AreEqual ("68118487063891533260055238987674544477279516360704", (v >> 2).ToString (), "#2");
1016 Assert.AreEqual ("34059243531945766630027619493837272238639758180352", (v >> 3).ToString (), "#3");
1017 Assert.AreEqual ("17029621765972883315013809746918636119319879090176", (v >> 4).ToString (), "#4");
1018 Assert.AreEqual ("8514810882986441657506904873459318059659939545088", (v >> 5).ToString (), "#5");
1019 Assert.AreEqual ("4257405441493220828753452436729659029829969772544", (v >> 6).ToString (), "#6");
1020 Assert.AreEqual ("2128702720746610414376726218364829514914984886272", (v >> 7).ToString (), "#7");
1021 Assert.AreEqual ("1064351360373305207188363109182414757457492443136", (v >> 8).ToString (), "#8");
1022 Assert.AreEqual ("532175680186652603594181554591207378728746221568", (v >> 9).ToString (), "#9");
1023 Assert.AreEqual ("266087840093326301797090777295603689364373110784", (v >> 10).ToString (), "#10");
1024 Assert.AreEqual ("133043920046663150898545388647801844682186555392", (v >> 11).ToString (), "#11");
1025 Assert.AreEqual ("66521960023331575449272694323900922341093277696", (v >> 12).ToString (), "#12");
1026 Assert.AreEqual ("33260980011665787724636347161950461170546638848", (v >> 13).ToString (), "#13");
1027 Assert.AreEqual ("16630490005832893862318173580975230585273319424", (v >> 14).ToString (), "#14");
1028 Assert.AreEqual ("8315245002916446931159086790487615292636659712", (v >> 15).ToString (), "#15");
1029 Assert.AreEqual ("4157622501458223465579543395243807646318329856", (v >> 16).ToString (), "#16");
1030 Assert.AreEqual ("2078811250729111732789771697621903823159164928", (v >> 17).ToString (), "#17");
1031 Assert.AreEqual ("1039405625364555866394885848810951911579582464", (v >> 18).ToString (), "#18");
1032 Assert.AreEqual ("519702812682277933197442924405475955789791232", (v >> 19).ToString (), "#19");
1033 Assert.AreEqual ("259851406341138966598721462202737977894895616", (v >> 20).ToString (), "#20");
1034 Assert.AreEqual ("129925703170569483299360731101368988947447808", (v >> 21).ToString (), "#21");
1035 Assert.AreEqual ("64962851585284741649680365550684494473723904", (v >> 22).ToString (), "#22");
1036 Assert.AreEqual ("32481425792642370824840182775342247236861952", (v >> 23).ToString (), "#23");
1037 Assert.AreEqual ("16240712896321185412420091387671123618430976", (v >> 24).ToString (), "#24");
1038 Assert.AreEqual ("8120356448160592706210045693835561809215488", (v >> 25).ToString (), "#25");
1039 Assert.AreEqual ("4060178224080296353105022846917780904607744", (v >> 26).ToString (), "#26");
1040 Assert.AreEqual ("2030089112040148176552511423458890452303872", (v >> 27).ToString (), "#27");
1041 Assert.AreEqual ("1015044556020074088276255711729445226151936", (v >> 28).ToString (), "#28");
1042 Assert.AreEqual ("507522278010037044138127855864722613075968", (v >> 29).ToString (), "#29");
1043 Assert.AreEqual ("253761139005018522069063927932361306537984", (v >> 30).ToString (), "#30");
1044 Assert.AreEqual ("126880569502509261034531963966180653268992", (v >> 31).ToString (), "#31");
1045 Assert.AreEqual ("63440284751254630517265981983090326634496", (v >> 32).ToString (), "#32");
1046 Assert.AreEqual ("31720142375627315258632990991545163317248", (v >> 33).ToString (), "#33");
1047 Assert.AreEqual ("15860071187813657629316495495772581658624", (v >> 34).ToString (), "#34");
1048 Assert.AreEqual ("7930035593906828814658247747886290829312", (v >> 35).ToString (), "#35");
1049 Assert.AreEqual ("3965017796953414407329123873943145414656", (v >> 36).ToString (), "#36");
1050 Assert.AreEqual ("1982508898476707203664561936971572707328", (v >> 37).ToString (), "#37");
1051 Assert.AreEqual ("991254449238353601832280968485786353664", (v >> 38).ToString (), "#38");
1052 Assert.AreEqual ("495627224619176800916140484242893176832", (v >> 39).ToString (), "#39");
1053 Assert.AreEqual ("247813612309588400458070242121446588416", (v >> 40).ToString (), "#40");
1054 Assert.AreEqual ("123906806154794200229035121060723294208", (v >> 41).ToString (), "#41");
1055 Assert.AreEqual ("61953403077397100114517560530361647104", (v >> 42).ToString (), "#42");
1056 Assert.AreEqual ("30976701538698550057258780265180823552", (v >> 43).ToString (), "#43");
1057 Assert.AreEqual ("15488350769349275028629390132590411776", (v >> 44).ToString (), "#44");
1058 Assert.AreEqual ("7744175384674637514314695066295205888", (v >> 45).ToString (), "#45");
1059 Assert.AreEqual ("3872087692337318757157347533147602944", (v >> 46).ToString (), "#46");
1060 Assert.AreEqual ("1936043846168659378578673766573801472", (v >> 47).ToString (), "#47");
1061 Assert.AreEqual ("968021923084329689289336883286900736", (v >> 48).ToString (), "#48");
1062 Assert.AreEqual ("484010961542164844644668441643450368", (v >> 49).ToString (), "#49");
1063 Assert.AreEqual ("242005480771082422322334220821725184", (v >> 50).ToString (), "#50");
1064 Assert.AreEqual ("121002740385541211161167110410862592", (v >> 51).ToString (), "#51");
1065 Assert.AreEqual ("60501370192770605580583555205431296", (v >> 52).ToString (), "#52");
1066 Assert.AreEqual ("30250685096385302790291777602715648", (v >> 53).ToString (), "#53");
1067 Assert.AreEqual ("15125342548192651395145888801357824", (v >> 54).ToString (), "#54");
1068 Assert.AreEqual ("7562671274096325697572944400678912", (v >> 55).ToString (), "#55");
1069 Assert.AreEqual ("3781335637048162848786472200339456", (v >> 56).ToString (), "#56");
1070 Assert.AreEqual ("1890667818524081424393236100169728", (v >> 57).ToString (), "#57");
1071 Assert.AreEqual ("945333909262040712196618050084864", (v >> 58).ToString (), "#58");
1072 Assert.AreEqual ("472666954631020356098309025042432", (v >> 59).ToString (), "#59");
1073 Assert.AreEqual ("236333477315510178049154512521216", (v >> 60).ToString (), "#60");
1074 Assert.AreEqual ("118166738657755089024577256260608", (v >> 61).ToString (), "#61");
1075 Assert.AreEqual ("59083369328877544512288628130304", (v >> 62).ToString (), "#62");
1076 Assert.AreEqual ("29541684664438772256144314065152", (v >> 63).ToString (), "#63");
1077 Assert.AreEqual ("14770842332219386128072157032576", (v >> 64).ToString (), "#64");
1078 Assert.AreEqual ("7385421166109693064036078516288", (v >> 65).ToString (), "#65");
1079 Assert.AreEqual ("3692710583054846532018039258144", (v >> 66).ToString (), "#66");
1080 Assert.AreEqual ("1846355291527423266009019629072", (v >> 67).ToString (), "#67");
1081 Assert.AreEqual ("923177645763711633004509814536", (v >> 68).ToString (), "#68");
1082 Assert.AreEqual ("461588822881855816502254907268", (v >> 69).ToString (), "#69");
1086 public void Bug10887 ()
1089 for(int i = 1; i <= 16; i++)
1091 BigInteger p = BigInteger.Pow (2, 32);
1092 Assert.AreEqual ("1339673755198158349044581307228491536", b.ToString (), "#1");
1093 Assert.AreEqual ("1339673755198158349044581307228491536", ((b << 32) / p).ToString (), "#2");
1094 Assert.AreEqual ("1339673755198158349044581307228491536", (b * p >> 32).ToString (), "#3");
1098 public void DefaultCtorWorks ()
1100 var a = new BigInteger ();
1101 Assert.AreEqual (BigInteger.One, ++a, "#1");
1103 a = new BigInteger ();
1104 Assert.AreEqual (BigInteger.MinusOne, --a, "#2");
1106 a = new BigInteger ();
1107 Assert.AreEqual (BigInteger.MinusOne, ~a, "#3");
1109 a = new BigInteger ();
1110 Assert.AreEqual ("0", a.ToString (), "#4");
1112 a = new BigInteger ();
1113 Assert.AreEqual (true, a == a, "#5");
1115 a = new BigInteger ();
1116 Assert.AreEqual (false, a < a, "#6");
1118 a = new BigInteger ();
1119 Assert.AreEqual (true, a < 10l, "#7");
1121 a = new BigInteger ();
1122 Assert.AreEqual (true, a.IsEven, "#8");
1124 a = new BigInteger ();
1125 Assert.AreEqual (0, (int)a, "#9");
1127 a = new BigInteger ();
1128 Assert.AreEqual (0, (uint)a, "#10");
1130 a = new BigInteger ();
1131 Assert.AreEqual (0, (ulong)a, "#11");
1133 a = new BigInteger ();
1134 Assert.AreEqual (true, a.Equals (a), "#12");
1136 a = new BigInteger ();
1137 Assert.AreEqual (a, BigInteger.Min (a, a), "#13");
1139 a = new BigInteger ();
1140 Assert.AreEqual (a, BigInteger.GreatestCommonDivisor (a, a), "#14");
1142 a = new BigInteger ();
1143 Assert.AreEqual (BigInteger.Zero.GetHashCode (), a.GetHashCode (), "#15");