BigIntegerTest.cs 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734
  1. // Based in huge part on:
  2. //
  3. // https://github.com/mono/mono/blob/master/mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs
  4. //
  5. // Authors:
  6. // Rodrigo Kumpera <rkumpera@novell.com>
  7. //
  8. // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
  9. //
  10. //#define FEATURE_NUMERICS_BIGINTEGER
  11. using System;
  12. using System.Diagnostics;
  13. using System.Globalization;
  14. using System.Threading;
  15. using Microsoft.VisualStudio.TestTools.UnitTesting;
  16. using Renci.SshNet.Common;
  17. #if FEATURE_NUMERICS_BIGINTEGER
  18. using BigInteger = System.Numerics.BigInteger;
  19. #else
  20. using BigInteger = Renci.SshNet.Common.BigInteger;
  21. #endif
  22. namespace Renci.SshNet.Tests.Classes.Common
  23. {
  24. [TestClass]
  25. public class BigIntegerTest
  26. {
  27. private static readonly byte[] huge_a =
  28. {
  29. 0x1D, 0x33, 0xFB, 0xFE, 0xB1, 0x2, 0x85, 0x44, 0xCA, 0xDC, 0xFB, 0x70, 0xD, 0x39,
  30. 0xB1, 0x47, 0xB6, 0xE6, 0xA2, 0xD1, 0x19, 0x1E, 0x9F, 0xE4, 0x3C, 0x1E, 0x16, 0x56, 0x13, 0x9C, 0x4D, 0xD3,
  31. 0x5C, 0x74, 0xC9, 0xBD, 0xFA, 0x56, 0x40, 0x58, 0xAC, 0x20, 0x6B, 0x55, 0xA2, 0xD5, 0x41, 0x38, 0xA4, 0x6D,
  32. 0xF6, 0x8C
  33. };
  34. private static readonly byte[] huge_b =
  35. {
  36. 0x96, 0x5, 0xDA, 0xFE, 0x93, 0x17, 0xC1, 0x93, 0xEC, 0x2F, 0x30, 0x2D, 0x8F,
  37. 0x28, 0x13, 0x99, 0x70, 0xF4, 0x4C, 0x60, 0xA6, 0x49, 0x24, 0xF9, 0xB3, 0x4A, 0x41, 0x67, 0xDC, 0xDD, 0xB1,
  38. 0xA5, 0xA6, 0xC0, 0x3D, 0x57, 0x9A, 0xCB, 0x29, 0xE2, 0x94, 0xAC, 0x6C, 0x7D, 0xEF, 0x3E, 0xC6, 0x7A, 0xC1,
  39. 0xA8, 0xC8, 0xB0, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7
  40. };
  41. private static readonly byte[] huge_add =
  42. {
  43. 0xB3, 0x38, 0xD5, 0xFD, 0x45, 0x1A, 0x46, 0xD8, 0xB6, 0xC, 0x2C, 0x9E, 0x9C,
  44. 0x61, 0xC4, 0xE0, 0x26, 0xDB, 0xEF, 0x31, 0xC0, 0x67, 0xC3, 0xDD, 0xF0, 0x68, 0x57, 0xBD, 0xEF, 0x79, 0xFF,
  45. 0x78, 0x3, 0x35, 0x7, 0x15, 0x95, 0x22, 0x6A, 0x3A, 0x41, 0xCD, 0xD7, 0xD2, 0x91, 0x14, 0x8, 0xB3, 0x65,
  46. 0x16, 0xBF, 0x3D, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7
  47. };
  48. private static readonly byte[] a_m_b =
  49. {
  50. 0x87, 0x2D, 0x21, 0x0, 0x1E, 0xEB, 0xC3, 0xB0, 0xDD, 0xAC, 0xCB, 0x43, 0x7E, 0x10,
  51. 0x9E, 0xAE, 0x45, 0xF2, 0x55, 0x71, 0x73, 0xD4, 0x7A, 0xEB, 0x88, 0xD3, 0xD4, 0xEE, 0x36, 0xBE, 0x9B, 0x2D,
  52. 0xB6, 0xB3, 0x8B, 0x66, 0x60, 0x8B, 0x16, 0x76, 0x17, 0x74, 0xFE, 0xD7, 0xB2, 0x96, 0x7B, 0xBD, 0xE2, 0xC4,
  53. 0x2D, 0xDC, 0xDE, 0x6A, 0x19, 0xB3, 0x1E, 0x1F, 0xB4, 0xB6, 0x2A, 0xA5, 0x48
  54. };
  55. private static readonly byte[] b_m_a =
  56. {
  57. 0x79, 0xD2, 0xDE, 0xFF, 0xE1, 0x14, 0x3C, 0x4F, 0x22, 0x53, 0x34, 0xBC, 0x81,
  58. 0xEF, 0x61, 0x51, 0xBA, 0xD, 0xAA, 0x8E, 0x8C, 0x2B, 0x85, 0x14, 0x77, 0x2C, 0x2B, 0x11, 0xC9, 0x41, 0x64,
  59. 0xD2, 0x49, 0x4C, 0x74, 0x99, 0x9F, 0x74, 0xE9, 0x89, 0xE8, 0x8B, 0x1, 0x28, 0x4D, 0x69, 0x84, 0x42, 0x1D,
  60. 0x3B, 0xD2, 0x23, 0x21, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7
  61. };
  62. private static readonly byte[] huge_mul =
  63. {
  64. 0xFE, 0x83, 0xE1, 0x9B, 0x8D, 0x61, 0x40, 0xD1, 0x60, 0x19, 0xBD, 0x38, 0xF0,
  65. 0xFF, 0x90, 0xAE, 0xDD, 0xAE, 0x73, 0x2C, 0x20, 0x23, 0xCF, 0x6, 0x7A, 0xB4, 0x1C, 0xE7, 0xD9, 0x64, 0x96,
  66. 0x2C, 0x87, 0x7E, 0x1D, 0xB3, 0x8F, 0xD4, 0x33, 0xBA, 0xF4, 0x22, 0xB4, 0xDB, 0xC0, 0x5B, 0xA5, 0x64, 0xA0,
  67. 0xBC, 0xCA, 0x3E, 0x94, 0x95, 0xDA, 0x49, 0xE2, 0xA8, 0x33, 0xA2, 0x6A, 0x33, 0xB1, 0xF2, 0xEA, 0x99, 0x32,
  68. 0xD0, 0xB2, 0xAE, 0x55, 0x75, 0xBD, 0x19, 0xFC, 0x9A, 0xEC, 0x54, 0x87, 0x2A, 0x6, 0xCC, 0x78, 0xDA, 0x88,
  69. 0xBB, 0xAB, 0xA5, 0x47, 0xEF, 0xC7, 0x2B, 0xC7, 0x5B, 0x32, 0x31, 0xCD, 0xD9, 0x53, 0x96, 0x1A, 0x9D, 0x9A,
  70. 0x57, 0x40, 0x51, 0xB6, 0x5D, 0xC, 0x17, 0xD1, 0x86, 0xE9, 0xA4, 0x20
  71. };
  72. private static readonly byte[] huge_div = {0x0};
  73. private static readonly byte[] huge_rem =
  74. {
  75. 0x1D, 0x33, 0xFB, 0xFE, 0xB1, 0x2, 0x85, 0x44, 0xCA, 0xDC, 0xFB, 0x70, 0xD,
  76. 0x39, 0xB1, 0x47, 0xB6, 0xE6, 0xA2, 0xD1, 0x19, 0x1E, 0x9F, 0xE4, 0x3C, 0x1E, 0x16, 0x56, 0x13, 0x9C, 0x4D,
  77. 0xD3, 0x5C, 0x74, 0xC9, 0xBD, 0xFA, 0x56, 0x40, 0x58, 0xAC, 0x20, 0x6B, 0x55, 0xA2, 0xD5, 0x41, 0x38, 0xA4,
  78. 0x6D, 0xF6, 0x8C
  79. };
  80. private static readonly byte[][] add_a = {new byte[] {1}, new byte[] {0xFF}, huge_a};
  81. private static readonly byte[][] add_b = {new byte[] {1}, new byte[] {1}, huge_b};
  82. private static readonly byte[][] add_c = {new byte[] {2}, new byte[] {0}, huge_add};
  83. private readonly NumberFormatInfo _nfi = NumberFormatInfo.InvariantInfo;
  84. private NumberFormatInfo _nfiUser;
  85. [TestInitialize]
  86. public void SetUpFixture()
  87. {
  88. _nfiUser = new NumberFormatInfo();
  89. _nfiUser.CurrencyDecimalDigits = 3;
  90. _nfiUser.CurrencyDecimalSeparator = ":";
  91. _nfiUser.CurrencyGroupSeparator = "/";
  92. _nfiUser.CurrencyGroupSizes = new[] { 2, 1, 0 };
  93. _nfiUser.CurrencyNegativePattern = 10; // n $-
  94. _nfiUser.CurrencyPositivePattern = 3; // n $
  95. _nfiUser.CurrencySymbol = "XYZ";
  96. _nfiUser.PercentDecimalDigits = 1;
  97. _nfiUser.PercentDecimalSeparator = ";";
  98. _nfiUser.PercentGroupSeparator = "~";
  99. _nfiUser.PercentGroupSizes = new[] { 1 };
  100. _nfiUser.PercentNegativePattern = 2;
  101. _nfiUser.PercentPositivePattern = 2;
  102. _nfiUser.PercentSymbol = "%%%";
  103. _nfiUser.NumberDecimalSeparator = ".";
  104. }
  105. [TestMethod]
  106. public void Mul()
  107. {
  108. long[] values = { -1000000000L, -1000, -1, 0, 1, 1000, 100000000L };
  109. for (var i = 0; i < values.Length; ++i)
  110. {
  111. for (var j = 0; j < values.Length; ++j)
  112. {
  113. var a = new BigInteger(values[i]);
  114. var b = new BigInteger(values[j]);
  115. var c = a * b;
  116. Assert.AreEqual(values[i] * values[j], (long)c, "#_" + i + "_" + j);
  117. }
  118. }
  119. }
  120. [TestMethod]
  121. public void TestHugeMul()
  122. {
  123. var a = new BigInteger(huge_a);
  124. var b = new BigInteger(huge_b);
  125. Assert.IsTrue(huge_mul.IsEqualTo((a * b).ToByteArray()));
  126. }
  127. [TestMethod]
  128. public void DivRem()
  129. {
  130. long[] values = { -10000000330L, -5000, -1, 0, 1, 1000, 333, 10234544400L };
  131. for (var i = 0; i < values.Length; ++i)
  132. {
  133. for (var j = 0; j < values.Length; ++j)
  134. {
  135. if (values[j] == 0)
  136. continue;
  137. var a = new BigInteger(values[i]);
  138. var b = new BigInteger(values[j]);
  139. BigInteger d;
  140. var c = BigInteger.DivRem(a, b, out d);
  141. Assert.AreEqual(values[i] / values[j], (long)c, "#a_" + i + "_" + j);
  142. Assert.AreEqual(values[i] % values[j], (long)d, "#b_" + i + "_" + j);
  143. }
  144. }
  145. }
  146. [TestMethod]
  147. public void TestHugeDivRem()
  148. {
  149. var a = new BigInteger(huge_a);
  150. var b = new BigInteger(huge_b);
  151. BigInteger d;
  152. var c = BigInteger.DivRem(a, b, out d);
  153. AssertEqual(huge_div, c.ToByteArray());
  154. AssertEqual(huge_rem, d.ToByteArray());
  155. }
  156. [TestMethod]
  157. public void Pow()
  158. {
  159. try
  160. {
  161. BigInteger.Pow(1, -1);
  162. Assert.Fail("#1");
  163. }
  164. catch (ArgumentOutOfRangeException) { }
  165. Assert.AreEqual(1, (int)BigInteger.Pow(99999, 0), "#2");
  166. Assert.AreEqual(99999, (int)BigInteger.Pow(99999, 1), "#5");
  167. Assert.AreEqual(59049, (int)BigInteger.Pow(3, 10), "#4");
  168. Assert.AreEqual(177147, (int)BigInteger.Pow(3, 11), "#5");
  169. Assert.AreEqual(-177147, (int)BigInteger.Pow(-3, 11), "#6");
  170. }
  171. [TestMethod]
  172. public void ModPow()
  173. {
  174. try
  175. {
  176. BigInteger.ModPow(1, -1, 5);
  177. Assert.Fail("#1");
  178. }
  179. catch (ArgumentOutOfRangeException) { }
  180. try
  181. {
  182. BigInteger.ModPow(1, 5, 0);
  183. Assert.Fail("#2");
  184. }
  185. catch (DivideByZeroException) { }
  186. Assert.AreEqual(4L, (long)BigInteger.ModPow(3, 2, 5), "#2");
  187. Assert.AreEqual(20L, (long)BigInteger.ModPow(555, 10, 71), "#3");
  188. Assert.AreEqual(20L, (long)BigInteger.ModPow(-555, 10, 71), "#3");
  189. Assert.AreEqual(-24L, (long)BigInteger.ModPow(-555, 11, 71), "#3");
  190. }
  191. [TestMethod]
  192. public void GreatestCommonDivisor()
  193. {
  194. Assert.AreEqual(999999, (int)BigInteger.GreatestCommonDivisor(999999, 0), "#1");
  195. Assert.AreEqual(999999, (int)BigInteger.GreatestCommonDivisor(0, 999999), "#2");
  196. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(999999, 1), "#3");
  197. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(1, 999999), "#4");
  198. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(1, 0), "#5");
  199. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(0, 1), "#6");
  200. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(999999, -1), "#7");
  201. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(-1, 999999), "#8");
  202. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(-1, 0), "#9");
  203. Assert.AreEqual(1, (int)BigInteger.GreatestCommonDivisor(0, -1), "#10");
  204. Assert.AreEqual(2, (int)BigInteger.GreatestCommonDivisor(12345678, 8765432), "#11");
  205. Assert.AreEqual(2, (int)BigInteger.GreatestCommonDivisor(-12345678, 8765432), "#12");
  206. Assert.AreEqual(2, (int)BigInteger.GreatestCommonDivisor(12345678, -8765432), "#13");
  207. Assert.AreEqual(2, (int)BigInteger.GreatestCommonDivisor(-12345678, -8765432), "#14");
  208. Assert.AreEqual(40, (int)BigInteger.GreatestCommonDivisor(5581 * 40, 6671 * 40), "#15");
  209. Assert.AreEqual(5, (int)BigInteger.GreatestCommonDivisor(-5, 0), "#16");
  210. Assert.AreEqual(5, (int)BigInteger.GreatestCommonDivisor(0, -5), "#17");
  211. }
  212. [TestMethod]
  213. public void Log()
  214. {
  215. const double delta = 0.000000000000001d;
  216. Assert.AreEqual(double.NegativeInfinity, BigInteger.Log(0));
  217. Assert.AreEqual(0d, BigInteger.Log(1));
  218. Assert.AreEqual(double.NaN, BigInteger.Log(-1));
  219. Assert.AreEqual(2.3025850929940459d, BigInteger.Log(10), delta);
  220. Assert.AreEqual(6.9077552789821368d, BigInteger.Log(1000), delta);
  221. Assert.AreEqual(double.NaN, BigInteger.Log(-234));
  222. }
  223. [TestMethod]
  224. public void LogN()
  225. {
  226. const double delta = 0.000000000000001d;
  227. Assert.AreEqual(double.NaN, BigInteger.Log(10, 1), "#1");
  228. Assert.AreEqual(double.NaN, BigInteger.Log(10, 0), "#2");
  229. Assert.AreEqual(double.NaN, BigInteger.Log(10, -1), "#3");
  230. Assert.AreEqual(double.NaN, BigInteger.Log(10, double.NaN), "#4");
  231. Assert.AreEqual(double.NaN, BigInteger.Log(10, double.NegativeInfinity), "#5");
  232. Assert.AreEqual(double.NaN, BigInteger.Log(10, double.PositiveInfinity), "#6");
  233. Assert.AreEqual(0d, BigInteger.Log(1, 0), "#7");
  234. Assert.AreEqual(double.NaN, BigInteger.Log(1, double.NegativeInfinity), "#8");
  235. Assert.AreEqual(0, BigInteger.Log(1, double.PositiveInfinity), "#9");
  236. Assert.AreEqual(double.NaN, BigInteger.Log(1, double.NaN), "#10");
  237. Assert.AreEqual(-2.5129415947320606d, BigInteger.Log(10, 0.4), delta, "#11");
  238. }
  239. [TestMethod]
  240. public void DivRemByZero()
  241. {
  242. try
  243. {
  244. BigInteger d;
  245. BigInteger.DivRem(100, 0, out d);
  246. Assert.Fail("#1");
  247. }
  248. catch (DivideByZeroException)
  249. {
  250. }
  251. }
  252. [TestMethod]
  253. public void TestAdd()
  254. {
  255. for (var i = 0; i < add_a.Length; ++i)
  256. {
  257. var a = new BigInteger(add_a[i]);
  258. var b = new BigInteger(add_b[i]);
  259. var c = new BigInteger(add_c[i]);
  260. Assert.AreEqual(c, a + b, "#" + i + "a");
  261. Assert.AreEqual(c, b + a, "#" + i + "b");
  262. Assert.AreEqual(c, BigInteger.Add(a, b), "#" + i + "c");
  263. AssertEqual(add_c[i], (a + b).ToByteArray());
  264. }
  265. }
  266. [TestMethod]
  267. public void TestAdd2()
  268. {
  269. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  270. for (var i = 0; i < values.Length; ++i)
  271. {
  272. for (var j = 0; j < values.Length; ++j)
  273. {
  274. var a = new BigInteger(values[i]);
  275. var b = new BigInteger(values[j]);
  276. var c = a + b;
  277. Assert.AreEqual(values[i] + values[j], (long)c, "#_" + i + "_" + j);
  278. }
  279. }
  280. }
  281. [TestMethod]
  282. public void TestHugeSub()
  283. {
  284. var a = new BigInteger(huge_a);
  285. var b = new BigInteger(huge_b);
  286. AssertEqual(a_m_b, (a - b).ToByteArray());
  287. AssertEqual(b_m_a, (b - a).ToByteArray());
  288. }
  289. [TestMethod]
  290. public void TestSub()
  291. {
  292. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  293. for (var i = 0; i < values.Length; ++i)
  294. {
  295. for (var j = 0; j < values.Length; ++j)
  296. {
  297. var a = new BigInteger(values[i]);
  298. var b = new BigInteger(values[j]);
  299. var c = a - b;
  300. var d = BigInteger.Subtract(a, b);
  301. Assert.AreEqual(values[i] - values[j], (long)c, "#_" + i + "_" + j);
  302. Assert.AreEqual(values[i] - values[j], (long)d, "#_" + i + "_" + j);
  303. }
  304. }
  305. }
  306. [TestMethod]
  307. public void TestMin()
  308. {
  309. long[] values = { -100000000000L, -1000L, -1L, 0L, 1L, 1000L, 100000000000L };
  310. for (var i = 0; i < values.Length; ++i)
  311. {
  312. for (var j = 0; j < values.Length; ++j)
  313. {
  314. var a = new BigInteger(values[i]);
  315. var b = new BigInteger(values[j]);
  316. var c = BigInteger.Min(a, b);
  317. Assert.AreEqual(Math.Min(values[i], values[j]), (long) c, "#_" + i + "_" + j);
  318. }
  319. }
  320. }
  321. [TestMethod]
  322. public void TestMax()
  323. {
  324. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  325. for (var i = 0; i < values.Length; ++i)
  326. {
  327. for (var j = 0; j < values.Length; ++j)
  328. {
  329. var a = new BigInteger(values[i]);
  330. var b = new BigInteger(values[j]);
  331. var c = BigInteger.Max(a, b);
  332. Assert.AreEqual(Math.Max(values[i], values[j]), (long) c, "#_" + i + "_" + j);
  333. }
  334. }
  335. }
  336. [TestMethod]
  337. public void TestAbs()
  338. {
  339. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  340. for (var i = 0; i < values.Length; ++i)
  341. {
  342. var a = new BigInteger(values[i]);
  343. var c = BigInteger.Abs(a);
  344. Assert.AreEqual(Math.Abs(values[i]), (long) c, "#_" + i);
  345. }
  346. }
  347. [TestMethod]
  348. public void TestNegate()
  349. {
  350. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  351. for (var i = 0; i < values.Length; ++i)
  352. {
  353. var a = new BigInteger(values[i]);
  354. var c = -a;
  355. var d = BigInteger.Negate(a);
  356. Assert.AreEqual(-values[i], (long) c, "#_" + i);
  357. Assert.AreEqual(-values[i], (long) d, "#_" + i);
  358. }
  359. }
  360. [TestMethod]
  361. public void TestInc()
  362. {
  363. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  364. for (var i = 0; i < values.Length; ++i)
  365. {
  366. var a = new BigInteger(values[i]);
  367. var b = ++a;
  368. Assert.AreEqual(++values[i], (long)b, "#_" + i);
  369. }
  370. }
  371. [TestMethod]
  372. public void TestDec()
  373. {
  374. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  375. for (var i = 0; i < values.Length; ++i)
  376. {
  377. var a = new BigInteger(values[i]);
  378. var b = --a;
  379. Assert.AreEqual(--values[i], (long) b, "#_" + i);
  380. }
  381. }
  382. [TestMethod]
  383. public void TestBitwiseOps()
  384. {
  385. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xFFFF00000000L };
  386. for (var i = 0; i < values.Length; ++i)
  387. {
  388. for (var j = 0; j < values.Length; ++j)
  389. {
  390. var a = new BigInteger(values[i]);
  391. var b = new BigInteger(values[j]);
  392. Assert.AreEqual(values[i] | values[j], (long) (a | b), "#b_" + i + "_" + j);
  393. Assert.AreEqual(values[i] & values[j], (long) (a & b), "#a_" + i + "_" + j);
  394. Assert.AreEqual(values[i] ^ values[j], (long) (a ^ b), "#c_" + i + "_" + j);
  395. Assert.AreEqual(~values[i], (long) ~a, "#d_" + i + "_" + j);
  396. }
  397. }
  398. }
  399. [TestMethod]
  400. public void TestLeftShift()
  401. {
  402. AssertEqual(new byte[] { 0x00, 0x28 }, (new BigInteger(0x0A) << 10).ToByteArray());
  403. AssertEqual(new byte[] { 0x00, 0xD8 }, (new BigInteger(-10) << 10).ToByteArray());
  404. AssertEqual(new byte[] { 0x00, 0x00, 0xFF }, (new BigInteger(-1) << 16).ToByteArray());
  405. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A }, (new BigInteger(0x0A) << 80).ToByteArray());
  406. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6 }, (new BigInteger(-10) << 80).ToByteArray());
  407. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF }, (new BigInteger(-1) << 80).ToByteArray());
  408. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xD9 }, (new BigInteger(-1234) << 75).ToByteArray());
  409. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x91, 0x00 }, (new BigInteger(0x1234) << 75).ToByteArray());
  410. AssertEqual(new byte[] { 0xFF, 0x00 }, (new BigInteger(0xFF00) << -8).ToByteArray());
  411. }
  412. [TestMethod]
  413. public void TestRightShift()
  414. {
  415. AssertEqual(new byte[] { 0x16, 0xB0, 0x4C, 0x02 }, (new BigInteger(1234567899L) >> 5).ToByteArray());
  416. AssertEqual(new byte[] { 0x2C, 0x93, 0x00 }, (new BigInteger(1234567899L) >> 15).ToByteArray());
  417. AssertEqual(new byte[] { 0xFF, 0xFF, 0x7F }, (new BigInteger(long.MaxValue - 100) >> 40).ToByteArray());
  418. AssertEqual(new byte[] { 0xE9, 0x4F, 0xB3, 0xFD }, (new BigInteger(-1234567899L) >> 5).ToByteArray());
  419. AssertEqual(new byte[] { 0xD3, 0x6C, 0xFF }, (new BigInteger(-1234567899L) >> 15).ToByteArray());
  420. AssertEqual(new byte[] { 0x00, 0x00, 0x80 }, (new BigInteger(long.MinValue + 100) >> 40).ToByteArray());
  421. AssertEqual(new byte[] { 0xFF }, (new BigInteger(-1234567899L) >> 90).ToByteArray());
  422. AssertEqual(new byte[] { 0x00 }, (new BigInteger(999999) >> 90).ToByteArray());
  423. AssertEqual(new byte[] { 0x00, 0x00, 0xFF, 0x00 }, (new BigInteger(0xFF00) >> -8).ToByteArray());
  424. }
  425. [TestMethod]
  426. public void CompareOps()
  427. {
  428. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
  429. for (var i = 0; i < values.Length; ++i)
  430. {
  431. for (var j = 0; j < values.Length; ++j)
  432. {
  433. var a = new BigInteger(values[i]);
  434. var b = new BigInteger(values[j]);
  435. Assert.AreEqual(values[i].CompareTo(values[j]), a.CompareTo(b), "#a_" + i + "_" + j);
  436. Assert.AreEqual(values[i].CompareTo(values[j]), BigInteger.Compare(a, b), "#b_" + i + "_" + j);
  437. Assert.AreEqual(values[i] < values[j], a < b, "#c_" + i + "_" + j);
  438. Assert.AreEqual(values[i] <= values[j], a <= b, "#d_" + i + "_" + j);
  439. Assert.AreEqual(values[i] == values[j], a == b, "#e_" + i + "_" + j);
  440. Assert.AreEqual(values[i] != values[j], a != b, "#f_" + i + "_" + j);
  441. Assert.AreEqual(values[i] >= values[j], a >= b, "#g_" + i + "_" + j);
  442. Assert.AreEqual(values[i] > values[j], a > b, "#h_" + i + "_" + j);
  443. }
  444. }
  445. }
  446. [TestMethod]
  447. public void CompareOps2()
  448. {
  449. var a = new BigInteger(100000000000L);
  450. var b = new BigInteger(28282828282UL);
  451. Assert.IsTrue(a >= b, "#1");
  452. Assert.IsTrue(a >= b, "#2");
  453. Assert.IsFalse(a < b, "#3");
  454. Assert.IsFalse(a <= b, "#4");
  455. Assert.AreEqual(1, a.CompareTo(b), "#5");
  456. }
  457. [TestMethod]
  458. public void CompareULong()
  459. {
  460. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xAA00000000L };
  461. ulong[] uvalues = { 0, 1, 1000, 100000000000L, 999999, 28282828282, 0xAA00000000, ulong.MaxValue };
  462. for (var i = 0; i < values.Length; ++i)
  463. {
  464. for (var j = 0; j < uvalues.Length; ++j)
  465. {
  466. var a = new BigInteger(values[i]);
  467. var b = uvalues[j];
  468. var c = new BigInteger(b);
  469. Assert.AreEqual(a.CompareTo(c), a.CompareTo(b), "#a_" + i + "_" + j);
  470. Assert.AreEqual(a > c, a > b, "#b_" + i + "_" + j);
  471. Assert.AreEqual(a < c, a < b, "#c_" + i + "_" + j);
  472. Assert.AreEqual(a <= c, a <= b, "#d_" + i + "_" + j);
  473. Assert.AreEqual(a == c, a == b, "#e_" + i + "_" + j);
  474. Assert.AreEqual(a != c, a != b, "#f_" + i + "_" + j);
  475. Assert.AreEqual(a >= c, a >= b, "#g_" + i + "_" + j);
  476. Assert.AreEqual(c > a, b > a, "#ib_" + i + "_" + j);
  477. Assert.AreEqual(c < a, b < a, "#ic_" + i + "_" + j);
  478. Assert.AreEqual(c <= a, b <= a, "#id_" + i + "_" + j);
  479. Assert.AreEqual(c == a, b == a, "#ie_" + i + "_" + j);
  480. Assert.AreEqual(c != a, b != a, "#if_" + i + "_" + j);
  481. Assert.AreEqual(c >= a, b >= a, "#ig_" + i + "_" + j);
  482. }
  483. }
  484. }
  485. [TestMethod]
  486. public void CompareLong()
  487. {
  488. long[] values = { -100000000000L, -1000, -1, 0, 1, 1000, 9999999, 100000000000L, 0xAA00000000, long.MaxValue, long.MinValue };
  489. for (var i = 0; i < values.Length; ++i)
  490. {
  491. for (var j = 0; j < values.Length; ++j)
  492. {
  493. var a = new BigInteger(values[i]);
  494. var b = values[j];
  495. var c = new BigInteger(b);
  496. Assert.AreEqual(a.CompareTo(c), a.CompareTo(b), "#a_" + i + "_" + j);
  497. Assert.AreEqual(a > c, a > b, "#b_" + i + "_" + j);
  498. Assert.AreEqual(a < c, a < b, "#c_" + i + "_" + j);
  499. Assert.AreEqual(a <= c, a <= b, "#d_" + i + "_" + j);
  500. Assert.AreEqual(a == c, a == b, "#e_" + i + "_" + j);
  501. Assert.AreEqual(a != c, a != b, "#f_" + i + "_" + j);
  502. Assert.AreEqual(a >= c, a >= b, "#g_" + i + "_" + j);
  503. Assert.AreEqual(c > a, b > a, "#ib_" + i + "_" + j);
  504. Assert.AreEqual(c < a, b < a, "#ic_" + i + "_" + j);
  505. Assert.AreEqual(c <= a, b <= a, "#id_" + i + "_" + j);
  506. Assert.AreEqual(c == a, b == a, "#ie_" + i + "_" + j);
  507. Assert.AreEqual(c != a, b != a, "#if_" + i + "_" + j);
  508. Assert.AreEqual(c >= a, b >= a, "#ig_" + i + "_" + j);
  509. }
  510. }
  511. }
  512. [TestMethod]
  513. public void TestEquals()
  514. {
  515. var a = new BigInteger(10);
  516. var b = new BigInteger(10);
  517. var c = new BigInteger(-10);
  518. Assert.AreEqual(a, b, "#1");
  519. Assert.AreNotEqual(a, c, "#2");
  520. Assert.AreEqual(a, 10, "#3");
  521. }
  522. [TestMethod]
  523. public void Ctor_ByteArray_ShouldThrowArgumentNullExceptionWhenValueIsNull()
  524. {
  525. const byte[] value = null;
  526. try
  527. {
  528. var actual = new BigInteger(value);
  529. Assert.Fail("#1:" + actual);
  530. }
  531. catch (ArgumentNullException ex)
  532. {
  533. Assert.IsNull(ex.InnerException);
  534. Assert.AreEqual("value", ex.ParamName);
  535. }
  536. }
  537. [TestMethod]
  538. public void ByteArrayCtor()
  539. {
  540. Assert.AreEqual(0, (int) new BigInteger(new byte[0]));
  541. Assert.AreEqual(0, (int) new BigInteger(new byte[1]));
  542. Assert.AreEqual(0, (int) new BigInteger(new byte[2]));
  543. }
  544. [TestMethod]
  545. public void IntCtorRoundTrip()
  546. {
  547. int[] values =
  548. {
  549. int.MinValue, -0x2F33BB, -0x1F33, -0x33, 0, 0x33,
  550. 0x80, 0x8190, 0xFF0011, 0x1234, 0x11BB99, 0x44BB22CC,
  551. int.MaxValue
  552. };
  553. foreach (var val in values)
  554. {
  555. var a = new BigInteger(val);
  556. var b = new BigInteger(a.ToByteArray());
  557. Assert.AreEqual(val, (int)a, "#a_" + val);
  558. Assert.AreEqual(val, (int)b, "#b_" + val);
  559. }
  560. }
  561. [TestMethod]
  562. public void LongCtorRoundTrip()
  563. {
  564. long[] values =
  565. {
  566. 0L, long.MinValue, long.MaxValue, -1, 1L + int.MaxValue, -1L + int.MinValue, 0x1234, 0xFFFFFFFFL,
  567. 0x1FFFFFFFFL, -0xFFFFFFFFL, -0x1FFFFFFFFL, 0x100000000L, -0x100000000L, 0x100000001L, -0x100000001L,
  568. 4294967295L, -4294967295L, 4294967296L, -4294967296L
  569. };
  570. foreach (var val in values)
  571. {
  572. try
  573. {
  574. var a = new BigInteger(val);
  575. var b = new BigInteger(a.ToByteArray());
  576. Assert.AreEqual(val, (long) a, "#a_" + val);
  577. Assert.AreEqual(val, (long) b, "#b_" + val);
  578. Assert.AreEqual(a, b, "#a == #b (" + val + ")");
  579. }
  580. catch (Exception e)
  581. {
  582. Assert.Fail("Failed to roundtrip {0}: {1}", val, e);
  583. }
  584. }
  585. }
  586. [TestMethod]
  587. public void ByteArrayCtorRoundTrip()
  588. {
  589. var arr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  590. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  591. arr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 0xFF, 0x0 };
  592. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  593. arr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xF0 };
  594. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  595. arr = new byte[] { 1 };
  596. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  597. arr = new byte[] { 1, 2 };
  598. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  599. arr = new byte[] { 1, 2, 3 };
  600. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  601. arr = new byte[] { 1, 2, 3, 4 };
  602. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  603. arr = new byte[] { 1, 2, 3, 4, 5 };
  604. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  605. arr = new byte[] { 1, 2, 3, 4, 5, 6 };
  606. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  607. arr = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
  608. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  609. arr = new byte[] { 1, 2, 3, 4, 5 };
  610. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  611. arr = new byte[] { 0 };
  612. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  613. arr = new byte[] { 0xFF, 00 };
  614. AssertEqual(arr, new BigInteger(arr).ToByteArray());
  615. arr = new byte[] { 1, 0, 0, 0, 0, 0 };
  616. AssertEqual(new byte[] { 1 }, new BigInteger(arr).ToByteArray());
  617. }
  618. [TestMethod]
  619. public void TestIntCtorProperties()
  620. {
  621. BigInteger a = new BigInteger(10);
  622. Assert.IsTrue(a.IsEven, "#1");
  623. Assert.IsFalse(a.IsOne, "#2");
  624. Assert.IsFalse(a.IsPowerOfTwo, "#3");
  625. Assert.IsFalse(a.IsZero, "#4");
  626. Assert.AreEqual(1, a.Sign, "#5");
  627. Assert.IsFalse(new BigInteger(11).IsEven, "#6");
  628. Assert.IsTrue(new BigInteger(1).IsOne, "#7");
  629. Assert.IsTrue(new BigInteger(32).IsPowerOfTwo, "#8");
  630. Assert.IsTrue(new BigInteger(0).IsZero, "#9");
  631. Assert.IsTrue(new BigInteger().IsZero, "#9b");
  632. Assert.AreEqual(0, new BigInteger(0).Sign, "#10");
  633. Assert.AreEqual(-1, new BigInteger(-99999).Sign, "#11");
  634. Assert.IsFalse(new BigInteger(0).IsPowerOfTwo, "#12");
  635. Assert.IsFalse(new BigInteger().IsPowerOfTwo, "#12b");
  636. Assert.IsFalse(new BigInteger(-16).IsPowerOfTwo, "#13");
  637. Assert.IsTrue(new BigInteger(1).IsPowerOfTwo, "#14");
  638. }
  639. [TestMethod]
  640. public void TestIntCtorToString()
  641. {
  642. Assert.AreEqual("5555", new BigInteger(5555).ToString(), "#1");
  643. Assert.AreEqual("-99999", new BigInteger(-99999).ToString(), "#2");
  644. }
  645. [TestMethod]
  646. public void TestToStringFmt()
  647. {
  648. Assert.AreEqual("123456789123456", new BigInteger(123456789123456).ToString("D2"), "#1");
  649. Assert.AreEqual("0000000005", new BigInteger(5).ToString("d10"), "#2");
  650. Assert.AreEqual("0A8", new BigInteger(168).ToString("X"), "#3");
  651. Assert.AreEqual("0", new BigInteger(0).ToString("X"), "#4");
  652. Assert.AreEqual("0", new BigInteger().ToString("X"), "#4b");
  653. Assert.AreEqual("1", new BigInteger(1).ToString("X"), "#5");
  654. Assert.AreEqual("0A", new BigInteger(10).ToString("X"), "#6");
  655. Assert.AreEqual("F6", new BigInteger(-10).ToString("X"), "#7");
  656. Assert.AreEqual("10000000000000000000000000000000000000000000000000000000", BigInteger.Pow(10, 55).ToString("G"), "#8");
  657. Assert.AreEqual("10000000000000000000000000000000000000000000000000000000", BigInteger.Pow(10, 55).ToString("R"), "#9");
  658. Assert.AreEqual("000000000A", new BigInteger(10).ToString("X10"), "#10");
  659. Assert.AreEqual("0000000010", new BigInteger(10).ToString("G10"), "#11");
  660. }
  661. [TestMethod]
  662. public void TestToStringFmtProvider()
  663. {
  664. NumberFormatInfo info = new NumberFormatInfo
  665. {
  666. NegativeSign = ">",
  667. PositiveSign = "%"
  668. };
  669. Assert.AreEqual("10", new BigInteger(10).ToString(info), "#1");
  670. Assert.AreEqual(">10", new BigInteger(-10).ToString(info), "#2");
  671. Assert.AreEqual("0A", new BigInteger(10).ToString("X", info), "#3");
  672. Assert.AreEqual("F6", new BigInteger(-10).ToString("X", info), "#4");
  673. Assert.AreEqual("10", new BigInteger(10).ToString("G", info), "#5");
  674. Assert.AreEqual(">10", new BigInteger(-10).ToString("G", info), "#6");
  675. Assert.AreEqual("10", new BigInteger(10).ToString("D", info), "#7");
  676. Assert.AreEqual(">10", new BigInteger(-10).ToString("D", info), "#8");
  677. Assert.AreEqual("10", new BigInteger(10).ToString("R", info), "#9");
  678. Assert.AreEqual(">10", new BigInteger(-10).ToString("R", info), "#10");
  679. info = new NumberFormatInfo();
  680. info.NegativeSign = "#$%";
  681. Assert.AreEqual("#$%10", new BigInteger(-10).ToString(info), "#2");
  682. Assert.AreEqual("#$%10", new BigInteger(-10).ToString(null, info), "#2");
  683. info = new NumberFormatInfo();
  684. Assert.AreEqual("-10", new BigInteger(-10).ToString(info), "#2");
  685. }
  686. [TestMethod]
  687. public void TestToIntOperator()
  688. {
  689. try
  690. {
  691. int v = (int)new BigInteger(huge_a);
  692. Assert.Fail("#1");
  693. }
  694. catch (OverflowException) { }
  695. try
  696. {
  697. int v = (int)new BigInteger(1L + int.MaxValue);
  698. Assert.Fail("#2");
  699. }
  700. catch (OverflowException) { }
  701. try
  702. {
  703. int v = (int)new BigInteger(-1L + int.MinValue);
  704. Assert.Fail("#3");
  705. }
  706. catch (OverflowException) { }
  707. Assert.AreEqual(int.MaxValue, (int)new BigInteger(int.MaxValue), "#4");
  708. Assert.AreEqual(int.MinValue, (int)new BigInteger(int.MinValue), "#5");
  709. }
  710. [TestMethod]
  711. public void TestToLongOperator()
  712. {
  713. try
  714. {
  715. long v = (long)new BigInteger(huge_a);
  716. Assert.Fail("#1");
  717. }
  718. catch (OverflowException) { }
  719. //long.MaxValue + 1
  720. try
  721. {
  722. long v = (long)new BigInteger(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 });
  723. Assert.Fail("#2");
  724. }
  725. catch (OverflowException) { }
  726. //TODO long.MinValue - 1
  727. try
  728. {
  729. long v = (long)new BigInteger(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF });
  730. Assert.Fail("#3");
  731. }
  732. catch (OverflowException) { }
  733. Assert.AreEqual(long.MaxValue, (long)new BigInteger(long.MaxValue), "#4");
  734. Assert.AreEqual(long.MinValue, (long)new BigInteger(long.MinValue), "#5");
  735. }
  736. [TestMethod]
  737. public void TestIntCtorToByteArray()
  738. {
  739. AssertEqual(new byte[] { 0xFF }, new BigInteger(-1).ToByteArray());
  740. AssertEqual(new byte[] { 0xD4, 0xFE }, new BigInteger(-300).ToByteArray());
  741. AssertEqual(new byte[] { 0x80, 0x00 }, new BigInteger(128).ToByteArray());
  742. AssertEqual(new byte[] { 0x00, 0x60 }, new BigInteger(0x6000).ToByteArray());
  743. AssertEqual(new byte[] { 0x00, 0x80, 0x00 }, new BigInteger(0x8000).ToByteArray());
  744. AssertEqual(new byte[] { 0xDD, 0xBC, 0x00, 0x7A }, new BigInteger(0x7A00BCDD).ToByteArray());
  745. AssertEqual(new byte[] { 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger(int.MaxValue).ToByteArray());
  746. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x80 }, new BigInteger(int.MinValue).ToByteArray());
  747. AssertEqual(new byte[] { 0x01, 0x00, 0x00, 0x80 }, new BigInteger(int.MinValue + 1).ToByteArray());
  748. AssertEqual(new byte[] { 0x7F }, new BigInteger(0x7F).ToByteArray());
  749. AssertEqual(new byte[] { 0x45, 0xCC, 0xD0 }, new BigInteger(-0x2F33BB).ToByteArray());
  750. AssertEqual(new byte[] { 0 }, new BigInteger(0).ToByteArray());
  751. AssertEqual(new byte[] { 0 }, new BigInteger().ToByteArray());
  752. }
  753. [TestMethod]
  754. public void TestLongCtorToByteArray()
  755. {
  756. AssertEqual(new byte[] { 0x01 }, new BigInteger(0x01L).ToByteArray());
  757. AssertEqual(new byte[] { 0x02, 0x01 }, new BigInteger(0x0102L).ToByteArray());
  758. AssertEqual(new byte[] { 0x03, 0x02, 0x01 }, new BigInteger(0x010203L).ToByteArray());
  759. AssertEqual(new byte[] { 0x04, 0x03, 0x2, 0x01 }, new BigInteger(0x01020304L).ToByteArray());
  760. AssertEqual(new byte[] { 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger(0x0102030405L).ToByteArray());
  761. AssertEqual(new byte[] { 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger(0x010203040506L).ToByteArray());
  762. AssertEqual(new byte[] { 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger(0x01020304050607L).ToByteArray());
  763. AssertEqual(new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger(0x0102030405060708L).ToByteArray());
  764. AssertEqual(new byte[] { 0xFF }, new BigInteger(-0x01L).ToByteArray());
  765. AssertEqual(new byte[] { 0xFE, 0xFE }, new BigInteger(-0x0102L).ToByteArray());
  766. AssertEqual(new byte[] { 0xFD, 0xFD, 0xFE }, new BigInteger(-0x010203L).ToByteArray());
  767. AssertEqual(new byte[] { 0xFC, 0xFC, 0xFD, 0xFE }, new BigInteger(-0x01020304L).ToByteArray());
  768. AssertEqual(new byte[] { 0xFB, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger(-0x0102030405L).ToByteArray());
  769. AssertEqual(new byte[] { 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger(-0x010203040506L).ToByteArray());
  770. AssertEqual(new byte[] { 0xF9, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger(-0x01020304050607L).ToByteArray());
  771. AssertEqual(new byte[] { 0xF8, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger(-0x0102030405060708L).ToByteArray());
  772. AssertEqual(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger(long.MaxValue).ToByteArray());
  773. AssertEqual(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }, new BigInteger(long.MinValue).ToByteArray());
  774. AssertEqual(new byte[] { 0xFF, 0xFF, 0xFF, 0x7F, 0xFF }, new BigInteger(-2147483649L).ToByteArray());
  775. }
  776. [TestMethod]
  777. public void CompareTo()
  778. {
  779. var a = new BigInteger(99);
  780. Assert.AreEqual(-1, a.CompareTo(100), "#1");
  781. Assert.AreEqual(1, a.CompareTo(null), "#2");
  782. }
  783. [TestMethod]
  784. public void ShortOperators()
  785. {
  786. Assert.AreEqual(22, (int)new BigInteger(22), "#1");
  787. Assert.AreEqual(-22, (int)new BigInteger(-22), "#2");
  788. try
  789. {
  790. short x = (short)new BigInteger(10000000);
  791. Assert.Fail("#3");
  792. }
  793. catch (OverflowException) { }
  794. try
  795. {
  796. short x = (short)new BigInteger(-10000000);
  797. Assert.Fail("#4");
  798. }
  799. catch (OverflowException) { }
  800. }
  801. [TestMethod]
  802. public void Ctor_Double_NaN()
  803. {
  804. try
  805. {
  806. new BigInteger(double.NaN);
  807. Assert.Fail();
  808. }
  809. catch (OverflowException)
  810. {
  811. }
  812. }
  813. [TestMethod]
  814. public void Ctor_Double_NegativeInfinity()
  815. {
  816. try
  817. {
  818. new BigInteger(double.NegativeInfinity);
  819. Assert.Fail();
  820. }
  821. catch (OverflowException)
  822. {
  823. }
  824. }
  825. [TestMethod]
  826. public void Ctor_Double_PositiveInfinity()
  827. {
  828. try
  829. {
  830. new BigInteger(double.PositiveInfinity);
  831. Assert.Fail();
  832. }
  833. catch (OverflowException)
  834. {
  835. }
  836. }
  837. [TestMethod]
  838. public void Ctor_Double()
  839. {
  840. Assert.AreEqual(10000, (int)new BigInteger(10000.2));
  841. Assert.AreEqual(10000, (int)new BigInteger(10000.9));
  842. Assert.AreEqual(10000, (int)new BigInteger(10000.2));
  843. Assert.AreEqual(0, (int)new BigInteger(0.9));
  844. Assert.AreEqual(12345678999L, (long)new BigInteger(12345678999.33));
  845. }
  846. [TestMethod]
  847. public void DoubleConversion()
  848. {
  849. Assert.AreEqual(999d, (double)new BigInteger(999), "#1");
  850. Assert.AreEqual(double.PositiveInfinity, (double)BigInteger.Pow(2, 1024), "#2");
  851. Assert.AreEqual(double.NegativeInfinity, (double)BigInteger.Pow(-2, 1025), "#3");
  852. Assert.AreEqual(0d, (double)BigInteger.Zero, "#4");
  853. Assert.AreEqual(1d, (double)BigInteger.One, "#5");
  854. Assert.AreEqual(-1d, (double)BigInteger.MinusOne, "#6");
  855. var result1 = BitConverter.Int64BitsToDouble(-4337852273739220173);
  856. Assert.AreEqual(result1, (double)new BigInteger(new byte[] { 53, 152, 137, 177, 240, 81, 75, 198 }), "#7");
  857. var result2 = BitConverter.Int64BitsToDouble(4893382453283402035);
  858. Assert.AreEqual(result2, (double)new BigInteger(new byte[] { 53, 152, 137, 177, 240, 81, 75, 198, 0 }), "#8");
  859. var result3 = BitConverter.Int64BitsToDouble(5010775143622804480);
  860. var result4 = BitConverter.Int64BitsToDouble(5010775143622804481);
  861. var result5 = BitConverter.Int64BitsToDouble(5010775143622804482);
  862. Assert.AreEqual(result3, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 16, 128, 208, 159, 60, 46, 59, 3 }), "#9");
  863. Assert.AreEqual(result3, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 17, 128, 208, 159, 60, 46, 59, 3 }), "#10");
  864. Assert.AreEqual(result3, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 24, 128, 208, 159, 60, 46, 59, 3 }), "#11");
  865. Assert.AreEqual(result4, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 32, 128, 208, 159, 60, 46, 59, 3 }), "#12");
  866. Assert.AreEqual(result4, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 48, 128, 208, 159, 60, 46, 59, 3 }), "#13");
  867. Assert.AreEqual(result5, (double)new BigInteger(new byte[] { 0, 0, 0, 0, 64, 128, 208, 159, 60, 46, 59, 3 }), "#14");
  868. Assert.AreEqual(BitConverter.Int64BitsToDouble(-2748107935317889142), (double)new BigInteger(huge_a), "#15");
  869. Assert.AreEqual(BitConverter.Int64BitsToDouble(-2354774254443231289), (double)new BigInteger(huge_b), "#16");
  870. Assert.AreEqual(BitConverter.Int64BitsToDouble(8737073938546854790), (double)new BigInteger(huge_mul), "#17");
  871. Assert.AreEqual(BitConverter.Int64BitsToDouble(6912920136897069886), (double)(2278888483353476799 * BigInteger.Pow(2, 451)), "#18");
  872. Assert.AreEqual(double.PositiveInfinity, (double)(843942696292817306 * BigInteger.Pow(2, 965)), "#19");
  873. }
  874. [TestMethod]
  875. public void DecimalCtor()
  876. {
  877. Assert.AreEqual(999, (int)new BigInteger(999.99m), "#1");
  878. Assert.AreEqual(-10000, (int)new BigInteger(-10000m), "#2");
  879. Assert.AreEqual(0, (int)new BigInteger(0m), "#3");
  880. }
  881. [TestMethod]
  882. public void DecimalConversion()
  883. {
  884. Assert.AreEqual(999m, (decimal)new BigInteger(999), "#1");
  885. try
  886. {
  887. var x = (decimal) BigInteger.Pow(2, 1024);
  888. Assert.Fail("#2: " + x);
  889. }
  890. catch (OverflowException)
  891. {
  892. }
  893. try
  894. {
  895. var x = (decimal) BigInteger.Pow(-2, 1025);
  896. Assert.Fail("#3: " + x);
  897. }
  898. catch (OverflowException)
  899. {
  900. }
  901. Assert.AreEqual(0m, (decimal)new BigInteger(0), "#4");
  902. Assert.AreEqual(1m, (decimal)new BigInteger(1), "#5");
  903. Assert.AreEqual(-1m, (decimal)new BigInteger(-1), "#6");
  904. Assert.AreEqual(9999999999999999999999999999m, (decimal)new BigInteger(9999999999999999999999999999m), "#7");
  905. Assert.AreEqual(0m, (decimal)new BigInteger(), "#8");
  906. }
  907. [TestMethod]
  908. public void Parse()
  909. {
  910. try
  911. {
  912. BigInteger.Parse(null);
  913. Assert.Fail("#1");
  914. }
  915. catch (ArgumentNullException) { }
  916. try
  917. {
  918. BigInteger.Parse("");
  919. Assert.Fail("#2");
  920. }
  921. catch (FormatException) { }
  922. try
  923. {
  924. BigInteger.Parse(" ");
  925. Assert.Fail("#3");
  926. }
  927. catch (FormatException) { }
  928. try
  929. {
  930. BigInteger.Parse("hh");
  931. Assert.Fail("#4");
  932. }
  933. catch (FormatException) { }
  934. try
  935. {
  936. BigInteger.Parse("-");
  937. Assert.Fail("#5");
  938. }
  939. catch (FormatException) { }
  940. try
  941. {
  942. BigInteger.Parse("-+");
  943. Assert.Fail("#6");
  944. }
  945. catch (FormatException) { }
  946. Assert.AreEqual(10, (int)BigInteger.Parse("+10"), "#7");
  947. Assert.AreEqual(10, (int)BigInteger.Parse("10 "), "#8");
  948. Assert.AreEqual(-10, (int)BigInteger.Parse("-10 "), "#9");
  949. Assert.AreEqual(10, (int)BigInteger.Parse(" 10 "), "#10");
  950. Assert.AreEqual(-10, (int)BigInteger.Parse(" -10 "), "#11");
  951. Assert.AreEqual(-1, (int)BigInteger.Parse("F", NumberStyles.AllowHexSpecifier), "#12");
  952. Assert.AreEqual(-8, (int)BigInteger.Parse("8", NumberStyles.AllowHexSpecifier), "#13");
  953. Assert.AreEqual(8, (int)BigInteger.Parse("08", NumberStyles.AllowHexSpecifier), "#14");
  954. Assert.AreEqual(15, (int)BigInteger.Parse("0F", NumberStyles.AllowHexSpecifier), "#15");
  955. Assert.AreEqual(-1, (int)BigInteger.Parse("FF", NumberStyles.AllowHexSpecifier), "#16");
  956. Assert.AreEqual(255, (int)BigInteger.Parse("0FF", NumberStyles.AllowHexSpecifier), "#17");
  957. Assert.AreEqual(-17, (int)BigInteger.Parse(" (17) ", NumberStyles.AllowParentheses | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite), "#18");
  958. Assert.AreEqual(-23, (int)BigInteger.Parse(" -23 ", NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite), "#19");
  959. Assert.AreEqual(300000, (int)BigInteger.Parse("3E5", NumberStyles.AllowExponent), "#20");
  960. var dsep = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
  961. Assert.AreEqual(250, (int)BigInteger.Parse("2" + dsep + "5E2", NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint), "#21");//2.5E2 = 250
  962. Assert.AreEqual(25, (int)BigInteger.Parse("2500E-2", NumberStyles.AllowExponent), "#22");
  963. Assert.AreEqual("136236974127783066520110477975349088954559032721408", BigInteger.Parse("136236974127783066520110477975349088954559032721408", NumberStyles.None).ToString(), "#23");
  964. Assert.AreEqual("136236974127783066520110477975349088954559032721408", BigInteger.Parse("136236974127783066520110477975349088954559032721408").ToString(), "#24");
  965. try
  966. {
  967. BigInteger.Parse("2E3.0", NumberStyles.AllowExponent); // decimal notation for the exponent
  968. Assert.Fail("#25");
  969. }
  970. catch (FormatException)
  971. {
  972. }
  973. try
  974. {
  975. Int32.Parse("2" + dsep + "09E1", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
  976. Assert.Fail("#26");
  977. }
  978. catch (OverflowException)
  979. {
  980. }
  981. }
  982. [TestMethod]
  983. public void TryParse_Value_ShouldReturnFalseWhenValueIsNull()
  984. {
  985. BigInteger x;
  986. var actual = BigInteger.TryParse(null, out x);
  987. Assert.IsFalse(actual);
  988. Assert.AreEqual(BigInteger.Zero, x);
  989. }
  990. [TestMethod]
  991. public void TryParse_Value()
  992. {
  993. BigInteger x;
  994. Assert.IsFalse(BigInteger.TryParse("", out x));
  995. Assert.AreEqual(BigInteger.Zero, x);
  996. Assert.IsFalse(BigInteger.TryParse(" ", out x));
  997. Assert.AreEqual(BigInteger.Zero, x);
  998. Assert.IsFalse(BigInteger.TryParse(" -", out x));
  999. Assert.AreEqual(BigInteger.Zero, x);
  1000. Assert.IsFalse(BigInteger.TryParse(" +", out x));
  1001. Assert.AreEqual(BigInteger.Zero, x);
  1002. Assert.IsFalse(BigInteger.TryParse(" FF", out x));
  1003. Assert.AreEqual(BigInteger.Zero, x);
  1004. Assert.IsTrue(BigInteger.TryParse(" 99", out x));
  1005. Assert.AreEqual(99, (int) x);
  1006. Assert.IsTrue(BigInteger.TryParse("+133", out x));
  1007. Assert.AreEqual(133, (int) x);
  1008. Assert.IsTrue(BigInteger.TryParse("-010", out x));
  1009. Assert.AreEqual(-10, (int) x);
  1010. }
  1011. [TestMethod]
  1012. public void TryParse_ValueAndStyleAndProvider()
  1013. {
  1014. BigInteger x;
  1015. Assert.IsFalse(BigInteger.TryParse("null", NumberStyles.None, null, out x));
  1016. Assert.AreEqual(BigInteger.Zero, x);
  1017. Assert.IsFalse(BigInteger.TryParse("-10", NumberStyles.None, null, out x));
  1018. Assert.AreEqual(BigInteger.Zero, x);
  1019. Assert.IsFalse(BigInteger.TryParse("(10)", NumberStyles.None, null, out x));
  1020. Assert.AreEqual(BigInteger.Zero, x);
  1021. Assert.IsFalse(BigInteger.TryParse(" 10", NumberStyles.None, null, out x));
  1022. Assert.AreEqual(BigInteger.Zero, x);
  1023. Assert.IsFalse(BigInteger.TryParse("10 ", NumberStyles.None, null, out x));
  1024. Assert.AreEqual(BigInteger.Zero, x);
  1025. Assert.IsTrue(BigInteger.TryParse("-10", NumberStyles.AllowLeadingSign, null, out x));
  1026. Assert.AreEqual(-10, (int) x);
  1027. Assert.IsTrue(BigInteger.TryParse("(10)", NumberStyles.AllowParentheses, null, out x));
  1028. Assert.AreEqual(-10, (int) x);
  1029. Assert.IsTrue(BigInteger.TryParse(" 10", NumberStyles.AllowLeadingWhite, null, out x));
  1030. Assert.AreEqual(10, (int) x);
  1031. Assert.IsTrue(BigInteger.TryParse("10 ", NumberStyles.AllowTrailingWhite, null, out x));
  1032. Assert.AreEqual(10, (int) x);
  1033. Assert.IsFalse(BigInteger.TryParse("$10", NumberStyles.None, null, out x));
  1034. Assert.AreEqual(BigInteger.Zero, x);
  1035. Assert.IsFalse(BigInteger.TryParse("$10", NumberStyles.None, _nfi, out x));
  1036. Assert.AreEqual(BigInteger.Zero, x);
  1037. Assert.IsFalse(BigInteger.TryParse("%10", NumberStyles.None, _nfi, out x));
  1038. Assert.AreEqual(BigInteger.Zero, x);
  1039. Assert.IsFalse(BigInteger.TryParse("10 ", NumberStyles.None, null, out x));
  1040. Assert.AreEqual(BigInteger.Zero, x);
  1041. Assert.IsTrue(BigInteger.TryParse("10", NumberStyles.None, null, out x));
  1042. Assert.AreEqual(10, (int) x);
  1043. Assert.IsTrue(BigInteger.TryParse(_nfi.CurrencySymbol + "10", NumberStyles.AllowCurrencySymbol, _nfi, out x));
  1044. Assert.AreEqual(10, (int) x);
  1045. Assert.IsFalse(BigInteger.TryParse("%10", NumberStyles.AllowCurrencySymbol, _nfi, out x));
  1046. Assert.AreEqual(BigInteger.Zero, x);
  1047. }
  1048. [TestMethod]
  1049. public void TryParse_ValueAndStyleAndProvider_ShouldReturnFalseWhenValueIsNull()
  1050. {
  1051. BigInteger x;
  1052. var actual = BigInteger.TryParse(null, NumberStyles.Any, CultureInfo.InvariantCulture, out x);
  1053. Assert.IsFalse(actual);
  1054. Assert.AreEqual(BigInteger.Zero, x);
  1055. }
  1056. [TestMethod]
  1057. public void TestUserCurrency()
  1058. {
  1059. const int val1 = -1234567;
  1060. const int val2 = 1234567;
  1061. var s = val1.ToString("c", _nfiUser);
  1062. Assert.AreEqual("1234/5/67:000 XYZ-", s, "Currency value type 1 is not what we want to try to parse");
  1063. var v = BigInteger.Parse("1234/5/67:000 XYZ-", NumberStyles.Currency, _nfiUser);
  1064. Assert.AreEqual(val1, (int) v);
  1065. s = val2.ToString("c", _nfiUser);
  1066. Assert.AreEqual("1234/5/67:000 XYZ", s, "Currency value type 2 is not what we want to try to parse");
  1067. v = BigInteger.Parse(s, NumberStyles.Currency, _nfiUser);
  1068. Assert.AreEqual(val2, (int)v);
  1069. }
  1070. [TestMethod]
  1071. public void TryParseWeirdCulture()
  1072. {
  1073. var old = Thread.CurrentThread.CurrentCulture;
  1074. var cur = (CultureInfo)old.Clone();
  1075. var ninfo = new NumberFormatInfo
  1076. {
  1077. NegativeSign = ">",
  1078. PositiveSign = "%"
  1079. };
  1080. cur.NumberFormat = ninfo;
  1081. Thread.CurrentThread.CurrentCulture = cur;
  1082. try
  1083. {
  1084. BigInteger x;
  1085. Assert.IsTrue(BigInteger.TryParse("%11", out x));
  1086. Assert.AreEqual(11, (int) x);
  1087. Assert.IsTrue(BigInteger.TryParse(">11", out x));
  1088. Assert.AreEqual(-11, (int) x);
  1089. }
  1090. finally
  1091. {
  1092. Thread.CurrentThread.CurrentCulture = old;
  1093. }
  1094. }
  1095. [TestMethod]
  1096. public void CompareToLongToWithBigNumber()
  1097. {
  1098. var a = BigInteger.Parse("123456789123456789");
  1099. Assert.AreEqual(1, a.CompareTo(2000));
  1100. Assert.AreEqual(1, a.CompareTo(-2000));
  1101. var b = BigInteger.Parse("-123456789123456789");
  1102. Assert.AreEqual(-1, b.CompareTo(2000));
  1103. Assert.AreEqual(-1, b.CompareTo(-2000));
  1104. }
  1105. [TestMethod]
  1106. public void LeftShiftByInt()
  1107. {
  1108. var v = BigInteger.Parse("230794411440927908251127453634");
  1109. Assert.AreEqual("230794411440927908251127453634", (v << 0).ToString(), "#0");
  1110. Assert.AreEqual("461588822881855816502254907268", (v << 1).ToString(), "#1");
  1111. Assert.AreEqual("923177645763711633004509814536", (v << 2).ToString(), "#2");
  1112. Assert.AreEqual("1846355291527423266009019629072", (v << 3).ToString(), "#3");
  1113. Assert.AreEqual("3692710583054846532018039258144", (v << 4).ToString(), "#4");
  1114. Assert.AreEqual("7385421166109693064036078516288", (v << 5).ToString(), "#5");
  1115. Assert.AreEqual("14770842332219386128072157032576", (v << 6).ToString(), "#6");
  1116. Assert.AreEqual("29541684664438772256144314065152", (v << 7).ToString(), "#7");
  1117. Assert.AreEqual("59083369328877544512288628130304", (v << 8).ToString(), "#8");
  1118. Assert.AreEqual("118166738657755089024577256260608", (v << 9).ToString(), "#9");
  1119. Assert.AreEqual("236333477315510178049154512521216", (v << 10).ToString(), "#10");
  1120. Assert.AreEqual("472666954631020356098309025042432", (v << 11).ToString(), "#11");
  1121. Assert.AreEqual("945333909262040712196618050084864", (v << 12).ToString(), "#12");
  1122. Assert.AreEqual("1890667818524081424393236100169728", (v << 13).ToString(), "#13");
  1123. Assert.AreEqual("3781335637048162848786472200339456", (v << 14).ToString(), "#14");
  1124. Assert.AreEqual("7562671274096325697572944400678912", (v << 15).ToString(), "#15");
  1125. Assert.AreEqual("15125342548192651395145888801357824", (v << 16).ToString(), "#16");
  1126. Assert.AreEqual("30250685096385302790291777602715648", (v << 17).ToString(), "#17");
  1127. Assert.AreEqual("60501370192770605580583555205431296", (v << 18).ToString(), "#18");
  1128. Assert.AreEqual("121002740385541211161167110410862592", (v << 19).ToString(), "#19");
  1129. Assert.AreEqual("242005480771082422322334220821725184", (v << 20).ToString(), "#20");
  1130. Assert.AreEqual("484010961542164844644668441643450368", (v << 21).ToString(), "#21");
  1131. Assert.AreEqual("968021923084329689289336883286900736", (v << 22).ToString(), "#22");
  1132. Assert.AreEqual("1936043846168659378578673766573801472", (v << 23).ToString(), "#23");
  1133. Assert.AreEqual("3872087692337318757157347533147602944", (v << 24).ToString(), "#24");
  1134. Assert.AreEqual("7744175384674637514314695066295205888", (v << 25).ToString(), "#25");
  1135. Assert.AreEqual("15488350769349275028629390132590411776", (v << 26).ToString(), "#26");
  1136. Assert.AreEqual("30976701538698550057258780265180823552", (v << 27).ToString(), "#27");
  1137. Assert.AreEqual("61953403077397100114517560530361647104", (v << 28).ToString(), "#28");
  1138. Assert.AreEqual("123906806154794200229035121060723294208", (v << 29).ToString(), "#29");
  1139. Assert.AreEqual("247813612309588400458070242121446588416", (v << 30).ToString(), "#30");
  1140. Assert.AreEqual("495627224619176800916140484242893176832", (v << 31).ToString(), "#31");
  1141. Assert.AreEqual("991254449238353601832280968485786353664", (v << 32).ToString(), "#32");
  1142. Assert.AreEqual("1982508898476707203664561936971572707328", (v << 33).ToString(), "#33");
  1143. Assert.AreEqual("3965017796953414407329123873943145414656", (v << 34).ToString(), "#34");
  1144. Assert.AreEqual("7930035593906828814658247747886290829312", (v << 35).ToString(), "#35");
  1145. Assert.AreEqual("15860071187813657629316495495772581658624", (v << 36).ToString(), "#36");
  1146. Assert.AreEqual("31720142375627315258632990991545163317248", (v << 37).ToString(), "#37");
  1147. Assert.AreEqual("63440284751254630517265981983090326634496", (v << 38).ToString(), "#38");
  1148. Assert.AreEqual("126880569502509261034531963966180653268992", (v << 39).ToString(), "#39");
  1149. Assert.AreEqual("253761139005018522069063927932361306537984", (v << 40).ToString(), "#40");
  1150. Assert.AreEqual("507522278010037044138127855864722613075968", (v << 41).ToString(), "#41");
  1151. Assert.AreEqual("1015044556020074088276255711729445226151936", (v << 42).ToString(), "#42");
  1152. Assert.AreEqual("2030089112040148176552511423458890452303872", (v << 43).ToString(), "#43");
  1153. Assert.AreEqual("4060178224080296353105022846917780904607744", (v << 44).ToString(), "#44");
  1154. Assert.AreEqual("8120356448160592706210045693835561809215488", (v << 45).ToString(), "#45");
  1155. Assert.AreEqual("16240712896321185412420091387671123618430976", (v << 46).ToString(), "#46");
  1156. Assert.AreEqual("32481425792642370824840182775342247236861952", (v << 47).ToString(), "#47");
  1157. Assert.AreEqual("64962851585284741649680365550684494473723904", (v << 48).ToString(), "#48");
  1158. Assert.AreEqual("129925703170569483299360731101368988947447808", (v << 49).ToString(), "#49");
  1159. Assert.AreEqual("259851406341138966598721462202737977894895616", (v << 50).ToString(), "#50");
  1160. Assert.AreEqual("519702812682277933197442924405475955789791232", (v << 51).ToString(), "#51");
  1161. Assert.AreEqual("1039405625364555866394885848810951911579582464", (v << 52).ToString(), "#52");
  1162. Assert.AreEqual("2078811250729111732789771697621903823159164928", (v << 53).ToString(), "#53");
  1163. Assert.AreEqual("4157622501458223465579543395243807646318329856", (v << 54).ToString(), "#54");
  1164. Assert.AreEqual("8315245002916446931159086790487615292636659712", (v << 55).ToString(), "#55");
  1165. Assert.AreEqual("16630490005832893862318173580975230585273319424", (v << 56).ToString(), "#56");
  1166. Assert.AreEqual("33260980011665787724636347161950461170546638848", (v << 57).ToString(), "#57");
  1167. Assert.AreEqual("66521960023331575449272694323900922341093277696", (v << 58).ToString(), "#58");
  1168. Assert.AreEqual("133043920046663150898545388647801844682186555392", (v << 59).ToString(), "#59");
  1169. Assert.AreEqual("266087840093326301797090777295603689364373110784", (v << 60).ToString(), "#60");
  1170. Assert.AreEqual("532175680186652603594181554591207378728746221568", (v << 61).ToString(), "#61");
  1171. Assert.AreEqual("1064351360373305207188363109182414757457492443136", (v << 62).ToString(), "#62");
  1172. Assert.AreEqual("2128702720746610414376726218364829514914984886272", (v << 63).ToString(), "#63");
  1173. Assert.AreEqual("4257405441493220828753452436729659029829969772544", (v << 64).ToString(), "#64");
  1174. Assert.AreEqual("8514810882986441657506904873459318059659939545088", (v << 65).ToString(), "#65");
  1175. Assert.AreEqual("17029621765972883315013809746918636119319879090176", (v << 66).ToString(), "#66");
  1176. Assert.AreEqual("34059243531945766630027619493837272238639758180352", (v << 67).ToString(), "#67");
  1177. Assert.AreEqual("68118487063891533260055238987674544477279516360704", (v << 68).ToString(), "#68");
  1178. Assert.AreEqual("136236974127783066520110477975349088954559032721408", (v << 69).ToString(), "#69");
  1179. }
  1180. [TestMethod]
  1181. public void RightShiftByInt()
  1182. {
  1183. var v = BigInteger.Parse("230794411440927908251127453634");
  1184. v = v * BigInteger.Pow(2, 70);
  1185. Assert.AreEqual("272473948255566133040220955950698177909118065442816", (v >> 0).ToString(), "#0");
  1186. Assert.AreEqual("136236974127783066520110477975349088954559032721408", (v >> 1).ToString(), "#1");
  1187. Assert.AreEqual("68118487063891533260055238987674544477279516360704", (v >> 2).ToString(), "#2");
  1188. Assert.AreEqual("34059243531945766630027619493837272238639758180352", (v >> 3).ToString(), "#3");
  1189. Assert.AreEqual("17029621765972883315013809746918636119319879090176", (v >> 4).ToString(), "#4");
  1190. Assert.AreEqual("8514810882986441657506904873459318059659939545088", (v >> 5).ToString(), "#5");
  1191. Assert.AreEqual("4257405441493220828753452436729659029829969772544", (v >> 6).ToString(), "#6");
  1192. Assert.AreEqual("2128702720746610414376726218364829514914984886272", (v >> 7).ToString(), "#7");
  1193. Assert.AreEqual("1064351360373305207188363109182414757457492443136", (v >> 8).ToString(), "#8");
  1194. Assert.AreEqual("532175680186652603594181554591207378728746221568", (v >> 9).ToString(), "#9");
  1195. Assert.AreEqual("266087840093326301797090777295603689364373110784", (v >> 10).ToString(), "#10");
  1196. Assert.AreEqual("133043920046663150898545388647801844682186555392", (v >> 11).ToString(), "#11");
  1197. Assert.AreEqual("66521960023331575449272694323900922341093277696", (v >> 12).ToString(), "#12");
  1198. Assert.AreEqual("33260980011665787724636347161950461170546638848", (v >> 13).ToString(), "#13");
  1199. Assert.AreEqual("16630490005832893862318173580975230585273319424", (v >> 14).ToString(), "#14");
  1200. Assert.AreEqual("8315245002916446931159086790487615292636659712", (v >> 15).ToString(), "#15");
  1201. Assert.AreEqual("4157622501458223465579543395243807646318329856", (v >> 16).ToString(), "#16");
  1202. Assert.AreEqual("2078811250729111732789771697621903823159164928", (v >> 17).ToString(), "#17");
  1203. Assert.AreEqual("1039405625364555866394885848810951911579582464", (v >> 18).ToString(), "#18");
  1204. Assert.AreEqual("519702812682277933197442924405475955789791232", (v >> 19).ToString(), "#19");
  1205. Assert.AreEqual("259851406341138966598721462202737977894895616", (v >> 20).ToString(), "#20");
  1206. Assert.AreEqual("129925703170569483299360731101368988947447808", (v >> 21).ToString(), "#21");
  1207. Assert.AreEqual("64962851585284741649680365550684494473723904", (v >> 22).ToString(), "#22");
  1208. Assert.AreEqual("32481425792642370824840182775342247236861952", (v >> 23).ToString(), "#23");
  1209. Assert.AreEqual("16240712896321185412420091387671123618430976", (v >> 24).ToString(), "#24");
  1210. Assert.AreEqual("8120356448160592706210045693835561809215488", (v >> 25).ToString(), "#25");
  1211. Assert.AreEqual("4060178224080296353105022846917780904607744", (v >> 26).ToString(), "#26");
  1212. Assert.AreEqual("2030089112040148176552511423458890452303872", (v >> 27).ToString(), "#27");
  1213. Assert.AreEqual("1015044556020074088276255711729445226151936", (v >> 28).ToString(), "#28");
  1214. Assert.AreEqual("507522278010037044138127855864722613075968", (v >> 29).ToString(), "#29");
  1215. Assert.AreEqual("253761139005018522069063927932361306537984", (v >> 30).ToString(), "#30");
  1216. Assert.AreEqual("126880569502509261034531963966180653268992", (v >> 31).ToString(), "#31");
  1217. Assert.AreEqual("63440284751254630517265981983090326634496", (v >> 32).ToString(), "#32");
  1218. Assert.AreEqual("31720142375627315258632990991545163317248", (v >> 33).ToString(), "#33");
  1219. Assert.AreEqual("15860071187813657629316495495772581658624", (v >> 34).ToString(), "#34");
  1220. Assert.AreEqual("7930035593906828814658247747886290829312", (v >> 35).ToString(), "#35");
  1221. Assert.AreEqual("3965017796953414407329123873943145414656", (v >> 36).ToString(), "#36");
  1222. Assert.AreEqual("1982508898476707203664561936971572707328", (v >> 37).ToString(), "#37");
  1223. Assert.AreEqual("991254449238353601832280968485786353664", (v >> 38).ToString(), "#38");
  1224. Assert.AreEqual("495627224619176800916140484242893176832", (v >> 39).ToString(), "#39");
  1225. Assert.AreEqual("247813612309588400458070242121446588416", (v >> 40).ToString(), "#40");
  1226. Assert.AreEqual("123906806154794200229035121060723294208", (v >> 41).ToString(), "#41");
  1227. Assert.AreEqual("61953403077397100114517560530361647104", (v >> 42).ToString(), "#42");
  1228. Assert.AreEqual("30976701538698550057258780265180823552", (v >> 43).ToString(), "#43");
  1229. Assert.AreEqual("15488350769349275028629390132590411776", (v >> 44).ToString(), "#44");
  1230. Assert.AreEqual("7744175384674637514314695066295205888", (v >> 45).ToString(), "#45");
  1231. Assert.AreEqual("3872087692337318757157347533147602944", (v >> 46).ToString(), "#46");
  1232. Assert.AreEqual("1936043846168659378578673766573801472", (v >> 47).ToString(), "#47");
  1233. Assert.AreEqual("968021923084329689289336883286900736", (v >> 48).ToString(), "#48");
  1234. Assert.AreEqual("484010961542164844644668441643450368", (v >> 49).ToString(), "#49");
  1235. Assert.AreEqual("242005480771082422322334220821725184", (v >> 50).ToString(), "#50");
  1236. Assert.AreEqual("121002740385541211161167110410862592", (v >> 51).ToString(), "#51");
  1237. Assert.AreEqual("60501370192770605580583555205431296", (v >> 52).ToString(), "#52");
  1238. Assert.AreEqual("30250685096385302790291777602715648", (v >> 53).ToString(), "#53");
  1239. Assert.AreEqual("15125342548192651395145888801357824", (v >> 54).ToString(), "#54");
  1240. Assert.AreEqual("7562671274096325697572944400678912", (v >> 55).ToString(), "#55");
  1241. Assert.AreEqual("3781335637048162848786472200339456", (v >> 56).ToString(), "#56");
  1242. Assert.AreEqual("1890667818524081424393236100169728", (v >> 57).ToString(), "#57");
  1243. Assert.AreEqual("945333909262040712196618050084864", (v >> 58).ToString(), "#58");
  1244. Assert.AreEqual("472666954631020356098309025042432", (v >> 59).ToString(), "#59");
  1245. Assert.AreEqual("236333477315510178049154512521216", (v >> 60).ToString(), "#60");
  1246. Assert.AreEqual("118166738657755089024577256260608", (v >> 61).ToString(), "#61");
  1247. Assert.AreEqual("59083369328877544512288628130304", (v >> 62).ToString(), "#62");
  1248. Assert.AreEqual("29541684664438772256144314065152", (v >> 63).ToString(), "#63");
  1249. Assert.AreEqual("14770842332219386128072157032576", (v >> 64).ToString(), "#64");
  1250. Assert.AreEqual("7385421166109693064036078516288", (v >> 65).ToString(), "#65");
  1251. Assert.AreEqual("3692710583054846532018039258144", (v >> 66).ToString(), "#66");
  1252. Assert.AreEqual("1846355291527423266009019629072", (v >> 67).ToString(), "#67");
  1253. Assert.AreEqual("923177645763711633004509814536", (v >> 68).ToString(), "#68");
  1254. Assert.AreEqual("461588822881855816502254907268", (v >> 69).ToString(), "#69");
  1255. }
  1256. [TestMethod]
  1257. public void Bug10887()
  1258. {
  1259. BigInteger b = 0;
  1260. for (var i = 1; i <= 16; i++)
  1261. b = b * 256 + i;
  1262. var p = BigInteger.Pow(2, 32);
  1263. Assert.AreEqual("1339673755198158349044581307228491536", b.ToString());
  1264. Assert.AreEqual("1339673755198158349044581307228491536", ((b << 32) / p).ToString());
  1265. Assert.AreEqual("1339673755198158349044581307228491536", (b * p >> 32).ToString());
  1266. }
  1267. [TestMethod]
  1268. public void DefaultCtorWorks()
  1269. {
  1270. var a = new BigInteger();
  1271. Assert.AreEqual(BigInteger.One, ++a, "#1");
  1272. a = new BigInteger();
  1273. Assert.AreEqual(BigInteger.MinusOne, --a, "#2");
  1274. a = new BigInteger();
  1275. Assert.AreEqual(BigInteger.MinusOne, ~a, "#3");
  1276. a = new BigInteger();
  1277. Assert.AreEqual("0", a.ToString(), "#4");
  1278. a = new BigInteger();
  1279. #pragma warning disable CS1718 // Comparison made to same variable
  1280. Assert.AreEqual(true, a == a, "#5");
  1281. a = new BigInteger();
  1282. Assert.AreEqual(false, a < a, "#6");
  1283. #pragma warning restore CS1718 // Comparison made to same variable
  1284. a = new BigInteger();
  1285. Assert.AreEqual(true, a < 10L, "#7");
  1286. a = new BigInteger();
  1287. Assert.AreEqual(true, a.IsEven, "#8");
  1288. a = new BigInteger();
  1289. Assert.AreEqual(0, (int)a, "#9");
  1290. a = new BigInteger();
  1291. Assert.AreEqual((uint) 0, (uint)a, "#10");
  1292. a = new BigInteger();
  1293. Assert.AreEqual((ulong) 0, (ulong)a, "#11");
  1294. a = new BigInteger();
  1295. Assert.AreEqual(true, a.Equals(a), "#12");
  1296. a = new BigInteger();
  1297. Assert.AreEqual(a, BigInteger.Min(a, a), "#13");
  1298. a = new BigInteger();
  1299. Assert.AreEqual(a, BigInteger.GreatestCommonDivisor(a, a), "#14");
  1300. a = new BigInteger();
  1301. Assert.AreEqual(BigInteger.Zero.GetHashCode(), a.GetHashCode(), "#15");
  1302. a = new BigInteger();
  1303. Assert.AreEqual(BigInteger.Zero, a, "#16");
  1304. }
  1305. [TestMethod]
  1306. public void Bug16526()
  1307. {
  1308. var x = BigInteger.Pow(2, 63);
  1309. x *= -1;
  1310. x -= 1;
  1311. Assert.AreEqual("-9223372036854775809", x.ToString(), "#1");
  1312. try
  1313. {
  1314. x = (long)x;
  1315. Assert.Fail("#2 Must OVF: " + x);
  1316. }
  1317. catch (OverflowException)
  1318. {
  1319. }
  1320. }
  1321. [TestMethod]
  1322. [TestCategory("LongRunning")]
  1323. [TestCategory("Performance")]
  1324. public void ToArray_Performance()
  1325. {
  1326. const int loopCount = 100000000;
  1327. var bigInteger = new BigInteger(huge_a);
  1328. var stopWatch = new Stopwatch();
  1329. GC.Collect();
  1330. GC.WaitForFullGCComplete();
  1331. stopWatch.Start();
  1332. for (var i = 0; i < loopCount; i++)
  1333. {
  1334. bigInteger.ToByteArray();
  1335. }
  1336. GC.Collect();
  1337. GC.WaitForFullGCComplete();
  1338. stopWatch.Stop();
  1339. Console.WriteLine(stopWatch.ElapsedMilliseconds);
  1340. }
  1341. [TestMethod]
  1342. [TestCategory("LongRunning")]
  1343. [TestCategory("Performance")]
  1344. public void Ctor_ByteArray_Performance()
  1345. {
  1346. const int loopCount = 100000000;
  1347. var stopWatch = new Stopwatch();
  1348. GC.Collect();
  1349. GC.WaitForFullGCComplete();
  1350. stopWatch.Start();
  1351. for (var i = 0; i < loopCount; i++)
  1352. {
  1353. new BigInteger(huge_a);
  1354. }
  1355. GC.Collect();
  1356. GC.WaitForFullGCComplete();
  1357. stopWatch.Stop();
  1358. Console.WriteLine(stopWatch.ElapsedMilliseconds);
  1359. }
  1360. [TestMethod]
  1361. public void MinusOne()
  1362. {
  1363. var minusOne = BigInteger.MinusOne;
  1364. Assert.IsFalse(minusOne.IsEven);
  1365. Assert.IsFalse(minusOne.IsOne);
  1366. Assert.IsFalse(minusOne.IsPowerOfTwo);
  1367. Assert.IsFalse(minusOne.IsZero);
  1368. Assert.AreEqual(-1, minusOne.Sign);
  1369. }
  1370. [TestMethod]
  1371. public void One()
  1372. {
  1373. var one = BigInteger.One;
  1374. Assert.IsFalse(one.IsEven);
  1375. Assert.IsTrue(one.IsOne);
  1376. Assert.IsTrue(one.IsPowerOfTwo);
  1377. Assert.IsFalse(one.IsZero);
  1378. Assert.AreEqual(1, one.Sign);
  1379. }
  1380. [TestMethod]
  1381. public void Zero()
  1382. {
  1383. var zero = BigInteger.Zero;
  1384. Assert.IsTrue(zero.IsEven);
  1385. Assert.IsFalse(zero.IsOne);
  1386. Assert.IsFalse(zero.IsPowerOfTwo);
  1387. Assert.IsTrue(zero.IsZero);
  1388. Assert.AreEqual(0, zero.Sign);
  1389. }
  1390. [TestMethod]
  1391. public void Random()
  1392. {
  1393. var max = "26432534714839143538998938508341375449389492936207135611931371046236385860280414659368073862189301615603000443463893527273703804361856647266218472759410964268979057798543462774631912259980510080575520846081682603934587649566608158932346151315049355432937004801361578344502537300865702429436253728164365180058583916866804254965536833106467354901266304654706123552932560896874808786957654734387252964281680963136344135750381838556467139236094522411774117748615141352874979928570068255439327082539676660277104989857941859821396157749462154431239343148671646397611770487668571604363151098131876313773395912355145689712506";
  1394. BigInteger maxBigInt;
  1395. Assert.IsTrue(BigInteger.TryParse(max, NumberStyles.Number, NumberFormatInfo.CurrentInfo, out maxBigInt));
  1396. var random = BigInteger.One;
  1397. while (random <= BigInteger.One || random >= maxBigInt)
  1398. {
  1399. random = BigInteger.Random(2048);
  1400. }
  1401. }
  1402. [TestMethod]
  1403. public void TestClientExhcangeGenerationItem130()
  1404. {
  1405. var test = "1090748135619415929450294929359784500348155124953172211774101106966150168922785639028532473848836817769712164169076432969224698752674677662739994265785437233596157045970922338040698100507861033047312331823982435279475700199860971612732540528796554502867919746776983759391475987142521315878719577519148811830879919426939958487087540965716419167467499326156226529675209172277001377591248147563782880558861083327174154014975134893125116015776318890295960698011614157721282527539468816519319333337503114777192360412281721018955834377615480468479252748867320362385355596601795122806756217713579819870634321561907813255153703950795271232652404894983869492174481652303803498881366210508647263668376514131031102336837488999775744046733651827239395353540348414872854639719294694323450186884189822544540647226987292160693184734654941906936646576130260972193280317171696418971553954161446191759093719524951116705577362073481319296041201283516154269044389257727700289684119460283480452306204130024913879981135908026983868205969318167819680850998649694416907952712904962404937775789698917207356355227455066183815847669135530549755439819480321732925869069136146085326382334628745456398071603058051634209386708703306545903199608523824513729625136659128221100967735450519952404248198262813831097374261650380017277916975324134846574681307337017380830353680623216336949471306191686438249305686413380231046096450953594089375540285037292470929395114028305547452584962074309438151825437902976012891749355198678420603722034900311364893046495761404333938686140037848030916292543273684533640032637639100774502371542479302473698388692892420946478947733800387782741417786484770190108867879778991633218628640533982619322466154883011452291890252336487236086654396093853898628805813177559162076363154436494477507871294119841637867701722166609831201845484078070518041336869808398454625586921201308185638888082699408686536045192649569198110353659943111802300636106509865023943661829436426563007917282050894429388841748885398290707743052973605359277515749619730823773215894755121761467887865327707115573804264519206349215850195195364813387526811742474131549802130246506341207020335797706780705406945275438806265978516209706795702579244075380490231741030862614968783306207869687868108423639971983209077624758080499988275591392787267627182442892809646874228263172435642368588260139161962836121481966092745325488641054238839295138992979335446110090325230955276870524611359124918392740353154294858383359";
  1406. BigInteger prime;
  1407. BigInteger.TryParse(test, NumberStyles.Number, NumberFormatInfo.CurrentInfo, out prime);
  1408. BigInteger group = 2;
  1409. var bitLength = prime.BitLength;
  1410. BigInteger clientExchangeValue;
  1411. do
  1412. {
  1413. var randomValue = BigInteger.Random(bitLength);
  1414. //clientExchangeValue = BigInteger.ModPow(group, randomValue, prime);
  1415. clientExchangeValue = (group ^ randomValue) % prime;
  1416. } while (clientExchangeValue < 1 || clientExchangeValue > (prime - 1));
  1417. }
  1418. [TestMethod]
  1419. public void TestClientExhcangeGenerationGroup1()
  1420. {
  1421. var test = "00FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF";
  1422. BigInteger prime;
  1423. BigInteger.TryParse(test, NumberStyles.AllowHexSpecifier, NumberFormatInfo.CurrentInfo, out prime);
  1424. BigInteger group = 2;
  1425. var bitLength = prime.BitLength;
  1426. BigInteger clientExchangeValue;
  1427. do
  1428. {
  1429. var randomValue = BigInteger.Random(bitLength);
  1430. //clientExchangeValue = BigInteger.ModPow(group, randomValue, prime);
  1431. clientExchangeValue = (group ^ randomValue) % prime;
  1432. } while (clientExchangeValue < 1 || clientExchangeValue > (prime - 1));
  1433. }
  1434. [TestMethod]
  1435. public void TestClientExhcangeGenerationGroup14()
  1436. {
  1437. var test = "00FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF";
  1438. BigInteger prime;
  1439. BigInteger.TryParse(test, NumberStyles.AllowHexSpecifier, NumberFormatInfo.CurrentInfo, out prime);
  1440. BigInteger group = 2;
  1441. var bitLength = prime.BitLength;
  1442. BigInteger clientExchangeValue;
  1443. do
  1444. {
  1445. var randomValue = BigInteger.Random(bitLength);
  1446. //clientExchangeValue = BigInteger.ModPow(group, randomValue, prime);
  1447. clientExchangeValue = (group ^ randomValue) % prime;
  1448. } while (clientExchangeValue < 1 || clientExchangeValue > (prime - 1));
  1449. }
  1450. private static void AssertEqual(byte[] a, byte[] b)
  1451. {
  1452. Assert.IsTrue(a.IsEqualTo(b));
  1453. }
  1454. }
  1455. }