test-bignum.cc 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502
  1. // Copyright 2010 the V8 project authors. All rights reserved.
  2. // Redistribution and use in source and binary forms, with or without
  3. // modification, are permitted provided that the following conditions are
  4. // met:
  5. //
  6. // * Redistributions of source code must retain the above copyright
  7. // notice, this list of conditions and the following disclaimer.
  8. // * Redistributions in binary form must reproduce the above
  9. // copyright notice, this list of conditions and the following
  10. // disclaimer in the documentation and/or other materials provided
  11. // with the distribution.
  12. // * Neither the name of Google Inc. nor the names of its
  13. // contributors may be used to endorse or promote products derived
  14. // from this software without specific prior written permission.
  15. //
  16. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  17. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  18. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  19. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  20. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  21. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  26. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include "bignum.h"
  30. #include "cctest.h"
  31. #include "utils.h"
  32. using namespace double_conversion;
  33. static const int kBufferSize = 1024;
  34. static void AssignHexString(Bignum* bignum, const char* str) {
  35. bignum->AssignHexString(Vector<const char>(str, strlen(str)));
  36. }
  37. static void AssignDecimalString(Bignum* bignum, const char* str) {
  38. bignum->AssignDecimalString(Vector<const char>(str, strlen(str)));
  39. }
  40. TEST(Assign) {
  41. char buffer[kBufferSize];
  42. Bignum bignum;
  43. Bignum bignum2;
  44. bignum.AssignUInt16(0);
  45. CHECK(bignum.ToHexString(buffer, kBufferSize));
  46. CHECK_EQ("0", buffer);
  47. bignum.AssignUInt16(0xA);
  48. CHECK(bignum.ToHexString(buffer, kBufferSize));
  49. CHECK_EQ("A", buffer);
  50. bignum.AssignUInt16(0x20);
  51. CHECK(bignum.ToHexString(buffer, kBufferSize));
  52. CHECK_EQ("20", buffer);
  53. bignum.AssignUInt64(0);
  54. CHECK(bignum.ToHexString(buffer, kBufferSize));
  55. CHECK_EQ("0", buffer);
  56. bignum.AssignUInt64(0xA);
  57. CHECK(bignum.ToHexString(buffer, kBufferSize));
  58. CHECK_EQ("A", buffer);
  59. bignum.AssignUInt64(0x20);
  60. CHECK(bignum.ToHexString(buffer, kBufferSize));
  61. CHECK_EQ("20", buffer);
  62. bignum.AssignUInt64(0x100);
  63. CHECK(bignum.ToHexString(buffer, kBufferSize));
  64. CHECK_EQ("100", buffer);
  65. // The first real test, since this will not fit into one bigit.
  66. bignum.AssignUInt64(0x12345678);
  67. CHECK(bignum.ToHexString(buffer, kBufferSize));
  68. CHECK_EQ("12345678", buffer);
  69. uint64_t big = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
  70. bignum.AssignUInt64(big);
  71. CHECK(bignum.ToHexString(buffer, kBufferSize));
  72. CHECK_EQ("FFFFFFFFFFFFFFFF", buffer);
  73. big = UINT64_2PART_C(0x12345678, 9ABCDEF0);
  74. bignum.AssignUInt64(big);
  75. CHECK(bignum.ToHexString(buffer, kBufferSize));
  76. CHECK_EQ("123456789ABCDEF0", buffer);
  77. bignum2.AssignBignum(bignum);
  78. CHECK(bignum2.ToHexString(buffer, kBufferSize));
  79. CHECK_EQ("123456789ABCDEF0", buffer);
  80. AssignDecimalString(&bignum, "0");
  81. CHECK(bignum.ToHexString(buffer, kBufferSize));
  82. CHECK_EQ("0", buffer);
  83. AssignDecimalString(&bignum, "1");
  84. CHECK(bignum.ToHexString(buffer, kBufferSize));
  85. CHECK_EQ("1", buffer);
  86. AssignDecimalString(&bignum, "1234567890");
  87. CHECK(bignum.ToHexString(buffer, kBufferSize));
  88. CHECK_EQ("499602D2", buffer);
  89. AssignHexString(&bignum, "0");
  90. CHECK(bignum.ToHexString(buffer, kBufferSize));
  91. CHECK_EQ("0", buffer);
  92. AssignHexString(&bignum, "123456789ABCDEF0");
  93. CHECK(bignum.ToHexString(buffer, kBufferSize));
  94. CHECK_EQ("123456789ABCDEF0", buffer);
  95. }
  96. TEST(ShiftLeft) {
  97. char buffer[kBufferSize];
  98. Bignum bignum;
  99. AssignHexString(&bignum, "0");
  100. bignum.ShiftLeft(100);
  101. CHECK(bignum.ToHexString(buffer, kBufferSize));
  102. CHECK_EQ("0", buffer);
  103. AssignHexString(&bignum, "1");
  104. bignum.ShiftLeft(1);
  105. CHECK(bignum.ToHexString(buffer, kBufferSize));
  106. CHECK_EQ("2", buffer);
  107. AssignHexString(&bignum, "1");
  108. bignum.ShiftLeft(4);
  109. CHECK(bignum.ToHexString(buffer, kBufferSize));
  110. CHECK_EQ("10", buffer);
  111. AssignHexString(&bignum, "1");
  112. bignum.ShiftLeft(32);
  113. CHECK(bignum.ToHexString(buffer, kBufferSize));
  114. CHECK_EQ("100000000", buffer);
  115. AssignHexString(&bignum, "1");
  116. bignum.ShiftLeft(64);
  117. CHECK(bignum.ToHexString(buffer, kBufferSize));
  118. CHECK_EQ("10000000000000000", buffer);
  119. AssignHexString(&bignum, "123456789ABCDEF");
  120. bignum.ShiftLeft(64);
  121. CHECK(bignum.ToHexString(buffer, kBufferSize));
  122. CHECK_EQ("123456789ABCDEF0000000000000000", buffer);
  123. bignum.ShiftLeft(1);
  124. CHECK(bignum.ToHexString(buffer, kBufferSize));
  125. CHECK_EQ("2468ACF13579BDE0000000000000000", buffer);
  126. }
  127. TEST(AddUInt64) {
  128. char buffer[kBufferSize];
  129. Bignum bignum;
  130. AssignHexString(&bignum, "0");
  131. bignum.AddUInt64(0xA);
  132. CHECK(bignum.ToHexString(buffer, kBufferSize));
  133. CHECK_EQ("A", buffer);
  134. AssignHexString(&bignum, "1");
  135. bignum.AddUInt64(0xA);
  136. CHECK(bignum.ToHexString(buffer, kBufferSize));
  137. CHECK_EQ("B", buffer);
  138. AssignHexString(&bignum, "1");
  139. bignum.AddUInt64(0x100);
  140. CHECK(bignum.ToHexString(buffer, kBufferSize));
  141. CHECK_EQ("101", buffer);
  142. AssignHexString(&bignum, "1");
  143. bignum.AddUInt64(0xFFFF);
  144. CHECK(bignum.ToHexString(buffer, kBufferSize));
  145. CHECK_EQ("10000", buffer);
  146. AssignHexString(&bignum, "FFFFFFF");
  147. bignum.AddUInt64(0x1);
  148. CHECK(bignum.ToHexString(buffer, kBufferSize));
  149. CHECK_EQ("10000000", buffer);
  150. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  151. bignum.AddUInt64(0xFFFF);
  152. CHECK(bignum.ToHexString(buffer, kBufferSize));
  153. CHECK_EQ("1000000000000000000000000000000000000000FFFF", buffer);
  154. AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  155. bignum.AddUInt64(0x1);
  156. CHECK(bignum.ToHexString(buffer, kBufferSize));
  157. CHECK_EQ("100000000000000000000000000000000000000000000", buffer);
  158. bignum.AssignUInt16(0x1);
  159. bignum.ShiftLeft(100);
  160. bignum.AddUInt64(1);
  161. CHECK(bignum.ToHexString(buffer, kBufferSize));
  162. CHECK_EQ("10000000000000000000000001", buffer);
  163. bignum.AssignUInt16(0x1);
  164. bignum.ShiftLeft(100);
  165. bignum.AddUInt64(0xFFFF);
  166. CHECK(bignum.ToHexString(buffer, kBufferSize));
  167. CHECK_EQ("1000000000000000000000FFFF", buffer);
  168. AssignHexString(&bignum, "0");
  169. bignum.AddUInt64(UINT64_2PART_C(0xA, 00000000));
  170. CHECK(bignum.ToHexString(buffer, kBufferSize));
  171. CHECK_EQ("A00000000", buffer);
  172. AssignHexString(&bignum, "1");
  173. bignum.AddUInt64(UINT64_2PART_C(0xA, 00000000));
  174. CHECK(bignum.ToHexString(buffer, kBufferSize));
  175. CHECK_EQ("A00000001", buffer);
  176. AssignHexString(&bignum, "1");
  177. bignum.AddUInt64(UINT64_2PART_C(0x100, 00000000));
  178. CHECK(bignum.ToHexString(buffer, kBufferSize));
  179. CHECK_EQ("10000000001", buffer);
  180. AssignHexString(&bignum, "1");
  181. bignum.AddUInt64(UINT64_2PART_C(0xFFFF, 00000000));
  182. CHECK(bignum.ToHexString(buffer, kBufferSize));
  183. CHECK_EQ("FFFF00000001", buffer);
  184. AssignHexString(&bignum, "FFFFFFF");
  185. bignum.AddUInt64(UINT64_2PART_C(0x1, 00000000));
  186. CHECK(bignum.ToHexString(buffer, kBufferSize));
  187. CHECK_EQ("10FFFFFFF", buffer);
  188. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  189. bignum.AddUInt64(UINT64_2PART_C(0xFFFF, 00000000));
  190. CHECK(bignum.ToHexString(buffer, kBufferSize));
  191. CHECK_EQ("10000000000000000000000000000000FFFF00000000", buffer);
  192. AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  193. bignum.AddUInt64(UINT64_2PART_C(0x1, 00000000));
  194. CHECK(bignum.ToHexString(buffer, kBufferSize));
  195. CHECK_EQ("1000000000000000000000000000000000000FFFFFFFF", buffer);
  196. bignum.AssignUInt16(0x1);
  197. bignum.ShiftLeft(100);
  198. bignum.AddUInt64(UINT64_2PART_C(0x1, 00000000));
  199. CHECK(bignum.ToHexString(buffer, kBufferSize));
  200. CHECK_EQ("10000000000000000100000000", buffer);
  201. bignum.AssignUInt16(0x1);
  202. bignum.ShiftLeft(100);
  203. bignum.AddUInt64(UINT64_2PART_C(0xFFFF, 00000000));
  204. CHECK(bignum.ToHexString(buffer, kBufferSize));
  205. CHECK_EQ("10000000000000FFFF00000000", buffer);
  206. }
  207. TEST(AddBignum) {
  208. char buffer[kBufferSize];
  209. Bignum bignum;
  210. Bignum other;
  211. AssignHexString(&other, "1");
  212. AssignHexString(&bignum, "0");
  213. bignum.AddBignum(other);
  214. CHECK(bignum.ToHexString(buffer, kBufferSize));
  215. CHECK_EQ("1", buffer);
  216. AssignHexString(&bignum, "1");
  217. bignum.AddBignum(other);
  218. CHECK(bignum.ToHexString(buffer, kBufferSize));
  219. CHECK_EQ("2", buffer);
  220. AssignHexString(&bignum, "FFFFFFF");
  221. bignum.AddBignum(other);
  222. CHECK(bignum.ToHexString(buffer, kBufferSize));
  223. CHECK_EQ("10000000", buffer);
  224. AssignHexString(&bignum, "FFFFFFFFFFFFFF");
  225. bignum.AddBignum(other);
  226. CHECK(bignum.ToHexString(buffer, kBufferSize));
  227. CHECK_EQ("100000000000000", buffer);
  228. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  229. bignum.AddBignum(other);
  230. CHECK(bignum.ToHexString(buffer, kBufferSize));
  231. CHECK_EQ("10000000000000000000000000000000000000000001", buffer);
  232. AssignHexString(&other, "1000000000000");
  233. AssignHexString(&bignum, "1");
  234. bignum.AddBignum(other);
  235. CHECK(bignum.ToHexString(buffer, kBufferSize));
  236. CHECK_EQ("1000000000001", buffer);
  237. AssignHexString(&bignum, "FFFFFFF");
  238. bignum.AddBignum(other);
  239. CHECK(bignum.ToHexString(buffer, kBufferSize));
  240. CHECK_EQ("100000FFFFFFF", buffer);
  241. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  242. bignum.AddBignum(other);
  243. CHECK(bignum.ToHexString(buffer, kBufferSize));
  244. CHECK_EQ("10000000000000000000000000000001000000000000", buffer);
  245. AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  246. bignum.AddBignum(other);
  247. CHECK(bignum.ToHexString(buffer, kBufferSize));
  248. CHECK_EQ("1000000000000000000000000000000FFFFFFFFFFFF", buffer);
  249. bignum.AssignUInt16(0x1);
  250. bignum.ShiftLeft(100);
  251. bignum.AddBignum(other);
  252. CHECK(bignum.ToHexString(buffer, kBufferSize));
  253. CHECK_EQ("10000000000001000000000000", buffer);
  254. other.ShiftLeft(64);
  255. // other == "10000000000000000000000000000"
  256. bignum.AssignUInt16(0x1);
  257. bignum.AddBignum(other);
  258. CHECK(bignum.ToHexString(buffer, kBufferSize));
  259. CHECK_EQ("10000000000000000000000000001", buffer);
  260. AssignHexString(&bignum, "FFFFFFF");
  261. bignum.AddBignum(other);
  262. CHECK(bignum.ToHexString(buffer, kBufferSize));
  263. CHECK_EQ("1000000000000000000000FFFFFFF", buffer);
  264. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  265. bignum.AddBignum(other);
  266. CHECK(bignum.ToHexString(buffer, kBufferSize));
  267. CHECK_EQ("10000000000000010000000000000000000000000000", buffer);
  268. AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  269. bignum.AddBignum(other);
  270. CHECK(bignum.ToHexString(buffer, kBufferSize));
  271. CHECK_EQ("100000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer);
  272. bignum.AssignUInt16(0x1);
  273. bignum.ShiftLeft(100);
  274. bignum.AddBignum(other);
  275. CHECK(bignum.ToHexString(buffer, kBufferSize));
  276. CHECK_EQ("10010000000000000000000000000", buffer);
  277. }
  278. TEST(SubtractBignum) {
  279. char buffer[kBufferSize];
  280. Bignum bignum;
  281. Bignum other;
  282. AssignHexString(&bignum, "1");
  283. AssignHexString(&other, "0");
  284. bignum.SubtractBignum(other);
  285. CHECK(bignum.ToHexString(buffer, kBufferSize));
  286. CHECK_EQ("1", buffer);
  287. AssignHexString(&bignum, "2");
  288. AssignHexString(&other, "0");
  289. bignum.SubtractBignum(other);
  290. CHECK(bignum.ToHexString(buffer, kBufferSize));
  291. CHECK_EQ("2", buffer);
  292. AssignHexString(&bignum, "10000000");
  293. AssignHexString(&other, "1");
  294. bignum.SubtractBignum(other);
  295. CHECK(bignum.ToHexString(buffer, kBufferSize));
  296. CHECK_EQ("FFFFFFF", buffer);
  297. AssignHexString(&bignum, "100000000000000");
  298. AssignHexString(&other, "1");
  299. bignum.SubtractBignum(other);
  300. CHECK(bignum.ToHexString(buffer, kBufferSize));
  301. CHECK_EQ("FFFFFFFFFFFFFF", buffer);
  302. AssignHexString(&bignum, "10000000000000000000000000000000000000000001");
  303. AssignHexString(&other, "1");
  304. bignum.SubtractBignum(other);
  305. CHECK(bignum.ToHexString(buffer, kBufferSize));
  306. CHECK_EQ("10000000000000000000000000000000000000000000", buffer);
  307. AssignHexString(&bignum, "1000000000001");
  308. AssignHexString(&other, "1000000000000");
  309. bignum.SubtractBignum(other);
  310. CHECK(bignum.ToHexString(buffer, kBufferSize));
  311. CHECK_EQ("1", buffer);
  312. AssignHexString(&bignum, "100000FFFFFFF");
  313. AssignHexString(&other, "1000000000000");
  314. bignum.SubtractBignum(other);
  315. CHECK(bignum.ToHexString(buffer, kBufferSize));
  316. CHECK_EQ("FFFFFFF", buffer);
  317. AssignHexString(&bignum, "10000000000000000000000000000001000000000000");
  318. AssignHexString(&other, "1000000000000");
  319. bignum.SubtractBignum(other);
  320. CHECK(bignum.ToHexString(buffer, kBufferSize));
  321. CHECK_EQ("10000000000000000000000000000000000000000000", buffer);
  322. AssignHexString(&bignum, "1000000000000000000000000000000FFFFFFFFFFFF");
  323. AssignHexString(&other, "1000000000000");
  324. bignum.SubtractBignum(other);
  325. CHECK(bignum.ToHexString(buffer, kBufferSize));
  326. CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer);
  327. bignum.AssignUInt16(0x1);
  328. bignum.ShiftLeft(100);
  329. // "10 0000 0000 0000 0000 0000 0000"
  330. AssignHexString(&other, "1000000000000");
  331. bignum.SubtractBignum(other);
  332. CHECK(bignum.ToHexString(buffer, kBufferSize));
  333. CHECK_EQ("FFFFFFFFFFFFF000000000000", buffer);
  334. AssignHexString(&other, "1000000000000");
  335. other.ShiftLeft(48);
  336. // other == "1000000000000000000000000"
  337. bignum.AssignUInt16(0x1);
  338. bignum.ShiftLeft(100);
  339. // bignum == "10000000000000000000000000"
  340. bignum.SubtractBignum(other);
  341. CHECK(bignum.ToHexString(buffer, kBufferSize));
  342. CHECK_EQ("F000000000000000000000000", buffer);
  343. other.AssignUInt16(0x1);
  344. other.ShiftLeft(35);
  345. // other == "800000000"
  346. AssignHexString(&bignum, "FFFFFFF");
  347. bignum.ShiftLeft(60);
  348. // bignum = FFFFFFF000000000000000
  349. bignum.SubtractBignum(other);
  350. CHECK(bignum.ToHexString(buffer, kBufferSize));
  351. CHECK_EQ("FFFFFFEFFFFFF800000000", buffer);
  352. AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
  353. bignum.SubtractBignum(other);
  354. CHECK(bignum.ToHexString(buffer, kBufferSize));
  355. CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000", buffer);
  356. AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
  357. bignum.SubtractBignum(other);
  358. CHECK(bignum.ToHexString(buffer, kBufferSize));
  359. CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFF", buffer);
  360. }
  361. TEST(MultiplyUInt32) {
  362. char buffer[kBufferSize];
  363. Bignum bignum;
  364. AssignHexString(&bignum, "0");
  365. bignum.MultiplyByUInt32(0x25);
  366. CHECK(bignum.ToHexString(buffer, kBufferSize));
  367. CHECK_EQ("0", buffer);
  368. AssignHexString(&bignum, "2");
  369. bignum.MultiplyByUInt32(0x5);
  370. CHECK(bignum.ToHexString(buffer, kBufferSize));
  371. CHECK_EQ("A", buffer);
  372. AssignHexString(&bignum, "10000000");
  373. bignum.MultiplyByUInt32(0x9);
  374. CHECK(bignum.ToHexString(buffer, kBufferSize));
  375. CHECK_EQ("90000000", buffer);
  376. AssignHexString(&bignum, "100000000000000");
  377. bignum.MultiplyByUInt32(0xFFFF);
  378. CHECK(bignum.ToHexString(buffer, kBufferSize));
  379. CHECK_EQ("FFFF00000000000000", buffer);
  380. AssignHexString(&bignum, "100000000000000");
  381. bignum.MultiplyByUInt32(0xFFFFFFFF);
  382. CHECK(bignum.ToHexString(buffer, kBufferSize));
  383. CHECK_EQ("FFFFFFFF00000000000000", buffer);
  384. AssignHexString(&bignum, "1234567ABCD");
  385. bignum.MultiplyByUInt32(0xFFF);
  386. CHECK(bignum.ToHexString(buffer, kBufferSize));
  387. CHECK_EQ("12333335552433", buffer);
  388. AssignHexString(&bignum, "1234567ABCD");
  389. bignum.MultiplyByUInt32(0xFFFFFFF);
  390. CHECK(bignum.ToHexString(buffer, kBufferSize));
  391. CHECK_EQ("12345679998A985433", buffer);
  392. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  393. bignum.MultiplyByUInt32(0x2);
  394. CHECK(bignum.ToHexString(buffer, kBufferSize));
  395. CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer);
  396. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  397. bignum.MultiplyByUInt32(0x4);
  398. CHECK(bignum.ToHexString(buffer, kBufferSize));
  399. CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer);
  400. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  401. bignum.MultiplyByUInt32(0xF);
  402. CHECK(bignum.ToHexString(buffer, kBufferSize));
  403. CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer);
  404. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  405. bignum.MultiplyByUInt32(0xFFFFFF);
  406. CHECK(bignum.ToHexString(buffer, kBufferSize));
  407. CHECK_EQ("FFFFFEFFFFFFFFFF000001", buffer);
  408. bignum.AssignUInt16(0x1);
  409. bignum.ShiftLeft(100);
  410. // "10 0000 0000 0000 0000 0000 0000"
  411. bignum.MultiplyByUInt32(2);
  412. CHECK(bignum.ToHexString(buffer, kBufferSize));
  413. CHECK_EQ("20000000000000000000000000", buffer);
  414. bignum.AssignUInt16(0x1);
  415. bignum.ShiftLeft(100);
  416. // "10 0000 0000 0000 0000 0000 0000"
  417. bignum.MultiplyByUInt32(0xF);
  418. CHECK(bignum.ToHexString(buffer, kBufferSize));
  419. CHECK_EQ("F0000000000000000000000000", buffer);
  420. bignum.AssignUInt16(0xFFFF);
  421. bignum.ShiftLeft(100);
  422. // "FFFF0 0000 0000 0000 0000 0000 0000"
  423. bignum.MultiplyByUInt32(0xFFFF);
  424. CHECK(bignum.ToHexString(buffer, kBufferSize));
  425. CHECK_EQ("FFFE00010000000000000000000000000", buffer);
  426. bignum.AssignUInt16(0xFFFF);
  427. bignum.ShiftLeft(100);
  428. // "FFFF0 0000 0000 0000 0000 0000 0000"
  429. bignum.MultiplyByUInt32(0xFFFFFFFF);
  430. CHECK(bignum.ToHexString(buffer, kBufferSize));
  431. CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
  432. bignum.AssignUInt16(0xFFFF);
  433. bignum.ShiftLeft(100);
  434. // "FFFF0 0000 0000 0000 0000 0000 0000"
  435. bignum.MultiplyByUInt32(0xFFFFFFFF);
  436. CHECK(bignum.ToHexString(buffer, kBufferSize));
  437. CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
  438. AssignDecimalString(&bignum, "15611230384529777");
  439. bignum.MultiplyByUInt32(10000000);
  440. CHECK(bignum.ToHexString(buffer, kBufferSize));
  441. CHECK_EQ("210EDD6D4CDD2580EE80", buffer);
  442. }
  443. TEST(MultiplyUInt64) {
  444. char buffer[kBufferSize];
  445. Bignum bignum;
  446. AssignHexString(&bignum, "0");
  447. bignum.MultiplyByUInt64(0x25);
  448. CHECK(bignum.ToHexString(buffer, kBufferSize));
  449. CHECK_EQ("0", buffer);
  450. AssignHexString(&bignum, "2");
  451. bignum.MultiplyByUInt64(0x5);
  452. CHECK(bignum.ToHexString(buffer, kBufferSize));
  453. CHECK_EQ("A", buffer);
  454. AssignHexString(&bignum, "10000000");
  455. bignum.MultiplyByUInt64(0x9);
  456. CHECK(bignum.ToHexString(buffer, kBufferSize));
  457. CHECK_EQ("90000000", buffer);
  458. AssignHexString(&bignum, "100000000000000");
  459. bignum.MultiplyByUInt64(0xFFFF);
  460. CHECK(bignum.ToHexString(buffer, kBufferSize));
  461. CHECK_EQ("FFFF00000000000000", buffer);
  462. AssignHexString(&bignum, "100000000000000");
  463. bignum.MultiplyByUInt64(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
  464. CHECK(bignum.ToHexString(buffer, kBufferSize));
  465. CHECK_EQ("FFFFFFFFFFFFFFFF00000000000000", buffer);
  466. AssignHexString(&bignum, "1234567ABCD");
  467. bignum.MultiplyByUInt64(0xFFF);
  468. CHECK(bignum.ToHexString(buffer, kBufferSize));
  469. CHECK_EQ("12333335552433", buffer);
  470. AssignHexString(&bignum, "1234567ABCD");
  471. bignum.MultiplyByUInt64(UINT64_2PART_C(0xFF, FFFFFFFF));
  472. CHECK(bignum.ToHexString(buffer, kBufferSize));
  473. CHECK_EQ("1234567ABCBDCBA985433", buffer);
  474. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  475. bignum.MultiplyByUInt64(0x2);
  476. CHECK(bignum.ToHexString(buffer, kBufferSize));
  477. CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer);
  478. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  479. bignum.MultiplyByUInt64(0x4);
  480. CHECK(bignum.ToHexString(buffer, kBufferSize));
  481. CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer);
  482. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  483. bignum.MultiplyByUInt64(0xF);
  484. CHECK(bignum.ToHexString(buffer, kBufferSize));
  485. CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer);
  486. AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
  487. bignum.MultiplyByUInt64(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
  488. CHECK(bignum.ToHexString(buffer, kBufferSize));
  489. CHECK_EQ("FFFFFFFFFFFFFFFE0000000000000001", buffer);
  490. bignum.AssignUInt16(0x1);
  491. bignum.ShiftLeft(100);
  492. // "10 0000 0000 0000 0000 0000 0000"
  493. bignum.MultiplyByUInt64(2);
  494. CHECK(bignum.ToHexString(buffer, kBufferSize));
  495. CHECK_EQ("20000000000000000000000000", buffer);
  496. bignum.AssignUInt16(0x1);
  497. bignum.ShiftLeft(100);
  498. // "10 0000 0000 0000 0000 0000 0000"
  499. bignum.MultiplyByUInt64(0xF);
  500. CHECK(bignum.ToHexString(buffer, kBufferSize));
  501. CHECK_EQ("F0000000000000000000000000", buffer);
  502. bignum.AssignUInt16(0xFFFF);
  503. bignum.ShiftLeft(100);
  504. // "FFFF0 0000 0000 0000 0000 0000 0000"
  505. bignum.MultiplyByUInt64(0xFFFF);
  506. CHECK(bignum.ToHexString(buffer, kBufferSize));
  507. CHECK_EQ("FFFE00010000000000000000000000000", buffer);
  508. bignum.AssignUInt16(0xFFFF);
  509. bignum.ShiftLeft(100);
  510. // "FFFF0 0000 0000 0000 0000 0000 0000"
  511. bignum.MultiplyByUInt64(0xFFFFFFFF);
  512. CHECK(bignum.ToHexString(buffer, kBufferSize));
  513. CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
  514. bignum.AssignUInt16(0xFFFF);
  515. bignum.ShiftLeft(100);
  516. // "FFFF0 0000 0000 0000 0000 0000 0000"
  517. bignum.MultiplyByUInt64(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
  518. CHECK(bignum.ToHexString(buffer, kBufferSize));
  519. CHECK_EQ("FFFEFFFFFFFFFFFF00010000000000000000000000000", buffer);
  520. AssignDecimalString(&bignum, "15611230384529777");
  521. bignum.MultiplyByUInt64(UINT64_2PART_C(0x8ac72304, 89e80000));
  522. CHECK(bignum.ToHexString(buffer, kBufferSize));
  523. CHECK_EQ("1E10EE4B11D15A7F3DE7F3C7680000", buffer);
  524. }
  525. TEST(MultiplyPowerOfTen) {
  526. char buffer[kBufferSize];
  527. Bignum bignum;
  528. AssignDecimalString(&bignum, "1234");
  529. bignum.MultiplyByPowerOfTen(1);
  530. CHECK(bignum.ToHexString(buffer, kBufferSize));
  531. CHECK_EQ("3034", buffer);
  532. AssignDecimalString(&bignum, "1234");
  533. bignum.MultiplyByPowerOfTen(2);
  534. CHECK(bignum.ToHexString(buffer, kBufferSize));
  535. CHECK_EQ("1E208", buffer);
  536. AssignDecimalString(&bignum, "1234");
  537. bignum.MultiplyByPowerOfTen(3);
  538. CHECK(bignum.ToHexString(buffer, kBufferSize));
  539. CHECK_EQ("12D450", buffer);
  540. AssignDecimalString(&bignum, "1234");
  541. bignum.MultiplyByPowerOfTen(4);
  542. CHECK(bignum.ToHexString(buffer, kBufferSize));
  543. CHECK_EQ("BC4B20", buffer);
  544. AssignDecimalString(&bignum, "1234");
  545. bignum.MultiplyByPowerOfTen(5);
  546. CHECK(bignum.ToHexString(buffer, kBufferSize));
  547. CHECK_EQ("75AEF40", buffer);
  548. AssignDecimalString(&bignum, "1234");
  549. bignum.MultiplyByPowerOfTen(6);
  550. CHECK(bignum.ToHexString(buffer, kBufferSize));
  551. CHECK_EQ("498D5880", buffer);
  552. AssignDecimalString(&bignum, "1234");
  553. bignum.MultiplyByPowerOfTen(7);
  554. CHECK(bignum.ToHexString(buffer, kBufferSize));
  555. CHECK_EQ("2DF857500", buffer);
  556. AssignDecimalString(&bignum, "1234");
  557. bignum.MultiplyByPowerOfTen(8);
  558. CHECK(bignum.ToHexString(buffer, kBufferSize));
  559. CHECK_EQ("1CBB369200", buffer);
  560. AssignDecimalString(&bignum, "1234");
  561. bignum.MultiplyByPowerOfTen(9);
  562. CHECK(bignum.ToHexString(buffer, kBufferSize));
  563. CHECK_EQ("11F5021B400", buffer);
  564. AssignDecimalString(&bignum, "1234");
  565. bignum.MultiplyByPowerOfTen(10);
  566. CHECK(bignum.ToHexString(buffer, kBufferSize));
  567. CHECK_EQ("B3921510800", buffer);
  568. AssignDecimalString(&bignum, "1234");
  569. bignum.MultiplyByPowerOfTen(11);
  570. CHECK(bignum.ToHexString(buffer, kBufferSize));
  571. CHECK_EQ("703B4D2A5000", buffer);
  572. AssignDecimalString(&bignum, "1234");
  573. bignum.MultiplyByPowerOfTen(12);
  574. CHECK(bignum.ToHexString(buffer, kBufferSize));
  575. CHECK_EQ("4625103A72000", buffer);
  576. AssignDecimalString(&bignum, "1234");
  577. bignum.MultiplyByPowerOfTen(13);
  578. CHECK(bignum.ToHexString(buffer, kBufferSize));
  579. CHECK_EQ("2BD72A24874000", buffer);
  580. AssignDecimalString(&bignum, "1234");
  581. bignum.MultiplyByPowerOfTen(14);
  582. CHECK(bignum.ToHexString(buffer, kBufferSize));
  583. CHECK_EQ("1B667A56D488000", buffer);
  584. AssignDecimalString(&bignum, "1234");
  585. bignum.MultiplyByPowerOfTen(15);
  586. CHECK(bignum.ToHexString(buffer, kBufferSize));
  587. CHECK_EQ("11200C7644D50000", buffer);
  588. AssignDecimalString(&bignum, "1234");
  589. bignum.MultiplyByPowerOfTen(16);
  590. CHECK(bignum.ToHexString(buffer, kBufferSize));
  591. CHECK_EQ("AB407C9EB0520000", buffer);
  592. AssignDecimalString(&bignum, "1234");
  593. bignum.MultiplyByPowerOfTen(17);
  594. CHECK(bignum.ToHexString(buffer, kBufferSize));
  595. CHECK_EQ("6B084DE32E3340000", buffer);
  596. AssignDecimalString(&bignum, "1234");
  597. bignum.MultiplyByPowerOfTen(18);
  598. CHECK(bignum.ToHexString(buffer, kBufferSize));
  599. CHECK_EQ("42E530ADFCE0080000", buffer);
  600. AssignDecimalString(&bignum, "1234");
  601. bignum.MultiplyByPowerOfTen(19);
  602. CHECK(bignum.ToHexString(buffer, kBufferSize));
  603. CHECK_EQ("29CF3E6CBE0C0500000", buffer);
  604. AssignDecimalString(&bignum, "1234");
  605. bignum.MultiplyByPowerOfTen(20);
  606. CHECK(bignum.ToHexString(buffer, kBufferSize));
  607. CHECK_EQ("1A218703F6C783200000", buffer);
  608. AssignDecimalString(&bignum, "1234");
  609. bignum.MultiplyByPowerOfTen(21);
  610. CHECK(bignum.ToHexString(buffer, kBufferSize));
  611. CHECK_EQ("1054F4627A3CB1F400000", buffer);
  612. AssignDecimalString(&bignum, "1234");
  613. bignum.MultiplyByPowerOfTen(22);
  614. CHECK(bignum.ToHexString(buffer, kBufferSize));
  615. CHECK_EQ("A3518BD8C65EF38800000", buffer);
  616. AssignDecimalString(&bignum, "1234");
  617. bignum.MultiplyByPowerOfTen(23);
  618. CHECK(bignum.ToHexString(buffer, kBufferSize));
  619. CHECK_EQ("6612F7677BFB5835000000", buffer);
  620. AssignDecimalString(&bignum, "1234");
  621. bignum.MultiplyByPowerOfTen(24);
  622. CHECK(bignum.ToHexString(buffer, kBufferSize));
  623. CHECK_EQ("3FCBDAA0AD7D17212000000", buffer);
  624. AssignDecimalString(&bignum, "1234");
  625. bignum.MultiplyByPowerOfTen(25);
  626. CHECK(bignum.ToHexString(buffer, kBufferSize));
  627. CHECK_EQ("27DF68A46C6E2E74B4000000", buffer);
  628. AssignDecimalString(&bignum, "1234");
  629. bignum.MultiplyByPowerOfTen(26);
  630. CHECK(bignum.ToHexString(buffer, kBufferSize));
  631. CHECK_EQ("18EBA166C3C4DD08F08000000", buffer);
  632. AssignDecimalString(&bignum, "1234");
  633. bignum.MultiplyByPowerOfTen(27);
  634. CHECK(bignum.ToHexString(buffer, kBufferSize));
  635. CHECK_EQ("F9344E03A5B0A259650000000", buffer);
  636. AssignDecimalString(&bignum, "1234");
  637. bignum.MultiplyByPowerOfTen(28);
  638. CHECK(bignum.ToHexString(buffer, kBufferSize));
  639. CHECK_EQ("9BC0B0C2478E6577DF20000000", buffer);
  640. AssignDecimalString(&bignum, "1234");
  641. bignum.MultiplyByPowerOfTen(29);
  642. CHECK(bignum.ToHexString(buffer, kBufferSize));
  643. CHECK_EQ("61586E796CB8FF6AEB740000000", buffer);
  644. AssignDecimalString(&bignum, "1234");
  645. bignum.MultiplyByPowerOfTen(30);
  646. CHECK(bignum.ToHexString(buffer, kBufferSize));
  647. CHECK_EQ("3CD7450BE3F39FA2D32880000000", buffer);
  648. AssignDecimalString(&bignum, "1234");
  649. bignum.MultiplyByPowerOfTen(31);
  650. CHECK(bignum.ToHexString(buffer, kBufferSize));
  651. CHECK_EQ("26068B276E7843C5C3F9500000000", buffer);
  652. AssignDecimalString(&bignum, "1234");
  653. bignum.MultiplyByPowerOfTen(50);
  654. CHECK(bignum.ToHexString(buffer, kBufferSize));
  655. CHECK_EQ("149D1B4CFED03B23AB5F4E1196EF45C08000000000000", buffer);
  656. AssignDecimalString(&bignum, "1234");
  657. bignum.MultiplyByPowerOfTen(100);
  658. CHECK(bignum.ToHexString(buffer, kBufferSize));
  659. CHECK_EQ("5827249F27165024FBC47DFCA9359BF316332D1B91ACEECF471FBAB06D9B2"
  660. "0000000000000000000000000", buffer);
  661. AssignDecimalString(&bignum, "1234");
  662. bignum.MultiplyByPowerOfTen(200);
  663. CHECK(bignum.ToHexString(buffer, kBufferSize));
  664. CHECK_EQ("64C1F5C06C3816AFBF8DAFD5A3D756365BB0FD020E6F084E759C1F7C99E4F"
  665. "55B9ACC667CEC477EB958C2AEEB3C6C19BA35A1AD30B35C51EB72040920000"
  666. "0000000000000000000000000000000000000000000000", buffer);
  667. AssignDecimalString(&bignum, "1234");
  668. bignum.MultiplyByPowerOfTen(500);
  669. CHECK(bignum.ToHexString(buffer, kBufferSize));
  670. CHECK_EQ("96741A625EB5D7C91039FEB5C5ACD6D9831EDA5B083D800E6019442C8C8223"
  671. "3EAFB3501FE2058062221E15121334928880827DEE1EC337A8B26489F3A40A"
  672. "CB440A2423734472D10BFCE886F41B3AF9F9503013D86D088929CA86EEB4D8"
  673. "B9C831D0BD53327B994A0326227CFD0ECBF2EB48B02387AAE2D4CCCDF1F1A1"
  674. "B8CC4F1FA2C56AD40D0E4DAA9C28CDBF0A549098EA13200000000000000000"
  675. "00000000000000000000000000000000000000000000000000000000000000"
  676. "0000000000000000000000000000000000000000000000", buffer);
  677. AssignDecimalString(&bignum, "1234");
  678. bignum.MultiplyByPowerOfTen(1000);
  679. CHECK(bignum.ToHexString(buffer, kBufferSize));
  680. CHECK_EQ("1258040F99B1CD1CC9819C676D413EA50E4A6A8F114BB0C65418C62D399B81"
  681. "6361466CA8E095193E1EE97173553597C96673AF67FAFE27A66E7EF2E5EF2E"
  682. "E3F5F5070CC17FE83BA53D40A66A666A02F9E00B0E11328D2224B8694C7372"
  683. "F3D536A0AD1985911BD361496F268E8B23112500EAF9B88A9BC67B2AB04D38"
  684. "7FEFACD00F5AF4F764F9ABC3ABCDE54612DE38CD90CB6647CA389EA0E86B16"
  685. "BF7A1F34086E05ADBE00BD1673BE00FAC4B34AF1091E8AD50BA675E0381440"
  686. "EA8E9D93E75D816BAB37C9844B1441C38FC65CF30ABB71B36433AF26DD97BD"
  687. "ABBA96C03B4919B8F3515B92826B85462833380DC193D79F69D20DD6038C99"
  688. "6114EF6C446F0BA28CC772ACBA58B81C04F8FFDE7B18C4E5A3ABC51E637FDF"
  689. "6E37FDFF04C940919390F4FF92000000000000000000000000000000000000"
  690. "00000000000000000000000000000000000000000000000000000000000000"
  691. "00000000000000000000000000000000000000000000000000000000000000"
  692. "00000000000000000000000000000000000000000000000000000000000000"
  693. "0000000000000000000000000000", buffer);
  694. Bignum bignum2;
  695. AssignHexString(&bignum2, "3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501"
  696. "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17"
  697. "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88"
  698. "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97"
  699. "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA"
  700. "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D"
  701. "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6"
  702. "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2"
  703. "C667A10958EA6D2");
  704. CHECK(bignum2.ToHexString(buffer, kBufferSize));
  705. CHECK_EQ("3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501"
  706. "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17"
  707. "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88"
  708. "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97"
  709. "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA"
  710. "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D"
  711. "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6"
  712. "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2"
  713. "C667A10958EA6D2", buffer);
  714. bignum.AssignBignum(bignum2);
  715. bignum.MultiplyByPowerOfTen(1);
  716. CHECK(bignum.ToHexString(buffer, kBufferSize));
  717. CHECK_EQ("2688A8F84FD1AB949930261C0986DB4DF931E85A8AD2FA8921284EE1C2BC51"
  718. "E55915823BBA5789E7EC99E326EEE69F543ECE890929DED9AC79489884BE57"
  719. "630AD569E121BB76ED8DAC8FB545A8AFDADF1F8860599AFC47A93B6346C191"
  720. "7237F5BD36B73EB29371F4A4EE7A116CB5E8E5808D1BEA4D7F7E3716090C13"
  721. "F29E5DDA53F0FD513362A2D20F6505314B9419DB967F8A8A89589FC43917C3"
  722. "BB892062B17CBE421DB0D47E34ACCCE060D422CFF60DCBD0277EE038BD509C"
  723. "7BC494D8D854F5B76696F927EA99BC00C4A5D7928434", buffer);
  724. bignum.AssignBignum(bignum2);
  725. bignum.MultiplyByPowerOfTen(2);
  726. CHECK(bignum.ToHexString(buffer, kBufferSize));
  727. CHECK_EQ("1815699B31E30B3CDFBE17D185F44910BBBF313896C3DC95B4B9314D19B5B32"
  728. "F57AD71655476B630F3E02DF855502394A74115A5BA2B480BCBCD5F52F6F69D"
  729. "E6C5622CB5152A54788BD9D14B896DE8CB73B53C3800DDACC9C51E0C38FAE76"
  730. "2F9964232872F9C2738E7150C4AE3F1B18F70583172706FAEE26DC5A78C77A2"
  731. "FAA874769E52C01DA5C3499F233ECF3C90293E0FB69695D763DAA3AEDA5535B"
  732. "43DAEEDF6E9528E84CEE0EC000C3C8495C1F9C89F6218AF4C23765261CD5ADD"
  733. "0787351992A01E5BB8F2A015807AE7A6BB92A08", buffer);
  734. bignum.AssignBignum(bignum2);
  735. bignum.MultiplyByPowerOfTen(5);
  736. CHECK(bignum.ToHexString(buffer, kBufferSize));
  737. CHECK_EQ("5E13A4863ADEE3E5C9FE8D0A73423D695D62D8450CED15A8C9F368952C6DC3"
  738. "F0EE7D82F3D1EFB7AF38A3B3920D410AFCAD563C8F5F39116E141A3C5C14B3"
  739. "58CD73077EA35AAD59F6E24AD98F10D5555ABBFBF33AC361EAF429FD5FBE94"
  740. "17DA9EF2F2956011F9F93646AA38048A681D984ED88127073443247CCC167C"
  741. "B354A32206EF5A733E73CF82D795A1AD598493211A6D613C39515E0E0F6304"
  742. "DCD9C810F3518C7F6A7CB6C81E99E02FCC65E8FDB7B7AE97306CC16A8631CE"
  743. "0A2AEF6568276BE4C176964A73C153FDE018E34CB4C2F40", buffer);
  744. bignum.AssignBignum(bignum2);
  745. bignum.MultiplyByPowerOfTen(10);
  746. CHECK(bignum.ToHexString(buffer, kBufferSize));
  747. CHECK_EQ("8F8CB8EB51945A7E815809F6121EF2F4E61EF3405CD9432CAD2709749EEAFD"
  748. "1B81E843F14A3667A7BDCCC9E0BB795F63CDFDB62844AC7438976C885A0116"
  749. "29607DA54F9C023CC366570B7637ED0F855D931752038A614922D0923E382C"
  750. "B8E5F6C975672DB76E0DE471937BB9EDB11E28874F1C122D5E1EF38CECE9D0"
  751. "0723056BCBD4F964192B76830634B1D322B7EB0062F3267E84F5C824343A77"
  752. "4B7DCEE6DD464F01EBDC8C671BB18BB4EF4300A42474A6C77243F2A12B03BF"
  753. "0443C38A1C0D2701EDB393135AE0DEC94211F9D4EB51F990800", buffer);
  754. bignum.AssignBignum(bignum2);
  755. bignum.MultiplyByPowerOfTen(50);
  756. CHECK(bignum.ToHexString(buffer, kBufferSize));
  757. CHECK_EQ("107A8BE345E24407372FC1DE442CBA696BC23C4FFD5B4BDFD9E5C39559815"
  758. "86628CF8472D2D589F2FC2BAD6E0816EC72CBF85CCA663D8A1EC6C51076D8"
  759. "2D247E6C26811B7EC4D4300FB1F91028DCB7B2C4E7A60C151161AA7E65E79"
  760. "B40917B12B2B5FBE7745984D4E8EFA31F9AE6062427B068B144A9CB155873"
  761. "E7C0C9F0115E5AC72DC5A73C4796DB970BF9205AB8C77A6996EB1B417F9D1"
  762. "6232431E6313C392203601B9C22CC10DDA88DCC6D282605F8DB67044F2DFD"
  763. "3695E7BA63877AE16701536AE6567C794D0BFE338DFBB42D924CF964BD2C0"
  764. "F586E03A2FCD35A408000000000000", buffer);
  765. bignum.AssignBignum(bignum2);
  766. bignum.MultiplyByPowerOfTen(100);
  767. CHECK(bignum.ToHexString(buffer, kBufferSize));
  768. CHECK_EQ("46784A90ACD0ED3E7759CC585FB32D36EB6034A6F78D92604E3BAA5ED3D8B"
  769. "6E60E854439BE448897FB4B7EA5A3D873AA0FCB3CFFD80D0530880E45F511"
  770. "722A50CE7E058B5A6F5464DB7500E34984EE3202A9441F44FA1554C0CEA96"
  771. "B438A36F25E7C9D56D71AE2CD313EC37534DA299AC0854FC48591A7CF3171"
  772. "31265AA4AE62DE32344CE7BEEEF894AE686A2DAAFE5D6D9A10971FFD9C064"
  773. "5079B209E1048F58B5192D41D84336AC4C8C489EEF00939CFC9D55C122036"
  774. "01B9C22CC10DDA88DCC6D282605F8DB67044F2DFD3695E7BA3F67B96D3A32"
  775. "E11FB5561B68744C4035B0800DC166D49D98E3FD1D5BB2000000000000000"
  776. "0000000000", buffer);
  777. bignum.AssignBignum(bignum2);
  778. bignum.MultiplyByPowerOfTen(200);
  779. CHECK(bignum.ToHexString(buffer, kBufferSize));
  780. CHECK_EQ("508BD351221DF139D72D88CDC0416845A53EE2D0E6B98352509A9AC312F8C"
  781. "6CB1A144889416201E0B6CE66EA3EBE259B5FD79ECFC1FD77963CE516CC7E"
  782. "2FE73D4B5B710C19F6BCB092C7A2FD76286543B8DBD2C596DFF2C896720BA"
  783. "DFF7BC9C366ACEA3A880AEC287C5E6207DF2739B5326FC19D773BD830B109"
  784. "ED36C7086544BF8FDB9D4B73719C2B5BC2F571A5937EC46876CD428281F6B"
  785. "F287E1E07F25C1B1D46BC37324FF657A8B2E0071DB83B86123CA34004F406"
  786. "001082D7945E90C6E8C9A9FEC2B44BE0DDA46E9F52B152E4D1336D2FCFBC9"
  787. "96E30CA0082256737365158FE36482AA7EB9DAF2AB128F10E7551A3CD5BE6"
  788. "0A922F3A7D5EED38B634A7EC95BCF7021BA6820A292000000000000000000"
  789. "00000000000000000000000000000000", buffer);
  790. bignum.AssignBignum(bignum2);
  791. bignum.MultiplyByPowerOfTen(500);
  792. CHECK(bignum.ToHexString(buffer, kBufferSize));
  793. CHECK_EQ("7845F900E475B5086885BAAAE67C8E85185ACFE4633727F82A4B06B5582AC"
  794. "BE933C53357DA0C98C20C5AC900C4D76A97247DF52B79F48F9E35840FB715"
  795. "D392CE303E22622B0CF82D9471B398457DD3196F639CEE8BBD2C146873841"
  796. "F0699E6C41F04FC7A54B48CEB995BEB6F50FE81DE9D87A8D7F849CC523553"
  797. "7B7BBBC1C7CAAFF6E9650BE03B308C6D31012AEF9580F70D3EE2083ADE126"
  798. "8940FA7D6308E239775DFD2F8C97FF7EBD525DAFA6512216F7047A62A93DC"
  799. "38A0165BDC67E250DCC96A0181DE935A70B38704DC71819F02FC5261FF7E1"
  800. "E5F11907678B0A3E519FF4C10A867B0C26CE02BE6960BA8621A87303C101C"
  801. "3F88798BB9F7739655946F8B5744E6B1EAF10B0C5621330F0079209033C69"
  802. "20DE2E2C8D324F0624463735D482BF291926C22A910F5B80FA25170B6B57D"
  803. "8D5928C7BCA3FE87461275F69BD5A1B83181DAAF43E05FC3C72C4E93111B6"
  804. "6205EBF49B28FEDFB7E7526CBDA658A332000000000000000000000000000"
  805. "0000000000000000000000000000000000000000000000000000000000000"
  806. "0000000000000000000000000000000000000", buffer);
  807. }
  808. TEST(DivideModuloIntBignum) {
  809. char buffer[kBufferSize];
  810. Bignum bignum;
  811. Bignum other;
  812. Bignum third;
  813. bignum.AssignUInt16(10);
  814. other.AssignUInt16(2);
  815. CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
  816. CHECK(bignum.ToHexString(buffer, kBufferSize));
  817. CHECK_EQ("0", buffer);
  818. bignum.AssignUInt16(10);
  819. bignum.ShiftLeft(500);
  820. other.AssignUInt16(2);
  821. other.ShiftLeft(500);
  822. CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
  823. CHECK_EQ("0", buffer);
  824. bignum.AssignUInt16(11);
  825. other.AssignUInt16(2);
  826. CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
  827. CHECK(bignum.ToHexString(buffer, kBufferSize));
  828. CHECK_EQ("1", buffer);
  829. bignum.AssignUInt16(10);
  830. bignum.ShiftLeft(500);
  831. other.AssignUInt16(1);
  832. bignum.AddBignum(other);
  833. other.AssignUInt16(2);
  834. other.ShiftLeft(500);
  835. CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
  836. CHECK(bignum.ToHexString(buffer, kBufferSize));
  837. CHECK_EQ("1", buffer);
  838. bignum.AssignUInt16(10);
  839. bignum.ShiftLeft(500);
  840. other.AssignBignum(bignum);
  841. bignum.MultiplyByUInt32(0x1234);
  842. third.AssignUInt16(0xFFF);
  843. bignum.AddBignum(third);
  844. CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other));
  845. CHECK(bignum.ToHexString(buffer, kBufferSize));
  846. CHECK_EQ("FFF", buffer);
  847. bignum.AssignUInt16(10);
  848. AssignHexString(&other, "1234567890");
  849. CHECK_EQ(0, bignum.DivideModuloIntBignum(other));
  850. CHECK(bignum.ToHexString(buffer, kBufferSize));
  851. CHECK_EQ("A", buffer);
  852. AssignHexString(&bignum, "12345678");
  853. AssignHexString(&other, "3789012");
  854. CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
  855. CHECK(bignum.ToHexString(buffer, kBufferSize));
  856. CHECK_EQ("D9861E", buffer);
  857. AssignHexString(&bignum, "70000001");
  858. AssignHexString(&other, "1FFFFFFF");
  859. CHECK_EQ(3, bignum.DivideModuloIntBignum(other));
  860. CHECK(bignum.ToHexString(buffer, kBufferSize));
  861. CHECK_EQ("10000004", buffer);
  862. AssignHexString(&bignum, "28000000");
  863. AssignHexString(&other, "12A05F20");
  864. CHECK_EQ(2, bignum.DivideModuloIntBignum(other));
  865. CHECK(bignum.ToHexString(buffer, kBufferSize));
  866. CHECK_EQ("2BF41C0", buffer);
  867. bignum.AssignUInt16(10);
  868. bignum.ShiftLeft(500);
  869. other.AssignBignum(bignum);
  870. bignum.MultiplyByUInt32(0x1234);
  871. third.AssignUInt16(0xFFF);
  872. other.SubtractBignum(third);
  873. CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other));
  874. CHECK(bignum.ToHexString(buffer, kBufferSize));
  875. CHECK_EQ("1232DCC", buffer);
  876. CHECK_EQ(0, bignum.DivideModuloIntBignum(other));
  877. CHECK(bignum.ToHexString(buffer, kBufferSize));
  878. CHECK_EQ("1232DCC", buffer);
  879. }
  880. TEST(Compare) {
  881. Bignum bignum1;
  882. Bignum bignum2;
  883. bignum1.AssignUInt16(1);
  884. bignum2.AssignUInt16(1);
  885. CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
  886. CHECK(Bignum::Equal(bignum1, bignum2));
  887. CHECK(Bignum::LessEqual(bignum1, bignum2));
  888. CHECK(!Bignum::Less(bignum1, bignum2));
  889. bignum1.AssignUInt16(0);
  890. bignum2.AssignUInt16(1);
  891. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  892. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  893. CHECK(!Bignum::Equal(bignum1, bignum2));
  894. CHECK(!Bignum::Equal(bignum2, bignum1));
  895. CHECK(Bignum::LessEqual(bignum1, bignum2));
  896. CHECK(!Bignum::LessEqual(bignum2, bignum1));
  897. CHECK(Bignum::Less(bignum1, bignum2));
  898. CHECK(!Bignum::Less(bignum2, bignum1));
  899. AssignHexString(&bignum1, "1234567890ABCDEF12345");
  900. AssignHexString(&bignum2, "1234567890ABCDEF12345");
  901. CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
  902. AssignHexString(&bignum1, "1234567890ABCDEF12345");
  903. AssignHexString(&bignum2, "1234567890ABCDEF12346");
  904. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  905. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  906. AssignHexString(&bignum1, "1234567890ABCDEF12345");
  907. bignum1.ShiftLeft(500);
  908. AssignHexString(&bignum2, "1234567890ABCDEF12345");
  909. bignum2.ShiftLeft(500);
  910. CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
  911. AssignHexString(&bignum1, "1234567890ABCDEF12345");
  912. bignum1.ShiftLeft(500);
  913. AssignHexString(&bignum2, "1234567890ABCDEF12346");
  914. bignum2.ShiftLeft(500);
  915. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  916. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  917. bignum1.AssignUInt16(1);
  918. bignum1.ShiftLeft(64);
  919. AssignHexString(&bignum2, "10000000000000000");
  920. CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
  921. CHECK_EQ(0, Bignum::Compare(bignum2, bignum1));
  922. bignum1.AssignUInt16(1);
  923. bignum1.ShiftLeft(64);
  924. AssignHexString(&bignum2, "10000000000000001");
  925. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  926. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  927. bignum1.AssignUInt16(1);
  928. bignum1.ShiftLeft(96);
  929. AssignHexString(&bignum2, "10000000000000001");
  930. bignum2.ShiftLeft(32);
  931. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  932. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  933. AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
  934. bignum2.AssignUInt16(1);
  935. bignum2.ShiftLeft(64);
  936. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  937. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  938. AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
  939. bignum1.ShiftLeft(32);
  940. bignum2.AssignUInt16(1);
  941. bignum2.ShiftLeft(96);
  942. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  943. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  944. AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
  945. bignum1.ShiftLeft(32);
  946. bignum2.AssignUInt16(1);
  947. bignum2.ShiftLeft(95);
  948. CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2));
  949. CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1));
  950. AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
  951. bignum1.ShiftLeft(32);
  952. bignum2.AssignUInt16(1);
  953. bignum2.ShiftLeft(100);
  954. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  955. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  956. AssignHexString(&bignum1, "100000000000000");
  957. bignum2.AssignUInt16(1);
  958. bignum2.ShiftLeft(14*4);
  959. CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
  960. CHECK_EQ(0, Bignum::Compare(bignum2, bignum1));
  961. AssignHexString(&bignum1, "100000000000001");
  962. bignum2.AssignUInt16(1);
  963. bignum2.ShiftLeft(14*4);
  964. CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2));
  965. CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1));
  966. AssignHexString(&bignum1, "200000000000000");
  967. bignum2.AssignUInt16(3);
  968. bignum2.ShiftLeft(14*4);
  969. CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
  970. CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
  971. }
  972. TEST(PlusCompare) {
  973. Bignum a;
  974. Bignum b;
  975. Bignum c;
  976. a.AssignUInt16(1);
  977. b.AssignUInt16(0);
  978. c.AssignUInt16(1);
  979. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  980. CHECK(Bignum::PlusEqual(a, b, c));
  981. CHECK(Bignum::PlusLessEqual(a, b, c));
  982. CHECK(!Bignum::PlusLess(a, b, c));
  983. a.AssignUInt16(0);
  984. b.AssignUInt16(0);
  985. c.AssignUInt16(1);
  986. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  987. CHECK_EQ(+1, Bignum::PlusCompare(c, b, a));
  988. CHECK(!Bignum::PlusEqual(a, b, c));
  989. CHECK(!Bignum::PlusEqual(c, b, a));
  990. CHECK(Bignum::PlusLessEqual(a, b, c));
  991. CHECK(!Bignum::PlusLessEqual(c, b, a));
  992. CHECK(Bignum::PlusLess(a, b, c));
  993. CHECK(!Bignum::PlusLess(c, b, a));
  994. AssignHexString(&a, "1234567890ABCDEF12345");
  995. b.AssignUInt16(1);
  996. AssignHexString(&c, "1234567890ABCDEF12345");
  997. CHECK_EQ(+1, Bignum::PlusCompare(a, b, c));
  998. AssignHexString(&a, "1234567890ABCDEF12344");
  999. b.AssignUInt16(1);
  1000. AssignHexString(&c, "1234567890ABCDEF12345");
  1001. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1002. AssignHexString(&a, "1234567890");
  1003. a.ShiftLeft(11*4);
  1004. AssignHexString(&b, "ABCDEF12345");
  1005. AssignHexString(&c, "1234567890ABCDEF12345");
  1006. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1007. AssignHexString(&a, "1234567890");
  1008. a.ShiftLeft(11*4);
  1009. AssignHexString(&b, "ABCDEF12344");
  1010. AssignHexString(&c, "1234567890ABCDEF12345");
  1011. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1012. AssignHexString(&a, "1234567890");
  1013. a.ShiftLeft(11*4);
  1014. AssignHexString(&b, "ABCDEF12346");
  1015. AssignHexString(&c, "1234567890ABCDEF12345");
  1016. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1017. AssignHexString(&a, "1234567891");
  1018. a.ShiftLeft(11*4);
  1019. AssignHexString(&b, "ABCDEF12345");
  1020. AssignHexString(&c, "1234567890ABCDEF12345");
  1021. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1022. AssignHexString(&a, "1234567889");
  1023. a.ShiftLeft(11*4);
  1024. AssignHexString(&b, "ABCDEF12345");
  1025. AssignHexString(&c, "1234567890ABCDEF12345");
  1026. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1027. AssignHexString(&a, "1234567890");
  1028. a.ShiftLeft(11*4 + 32);
  1029. AssignHexString(&b, "ABCDEF12345");
  1030. b.ShiftLeft(32);
  1031. AssignHexString(&c, "1234567890ABCDEF12345");
  1032. c.ShiftLeft(32);
  1033. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1034. AssignHexString(&a, "1234567890");
  1035. a.ShiftLeft(11*4 + 32);
  1036. AssignHexString(&b, "ABCDEF12344");
  1037. b.ShiftLeft(32);
  1038. AssignHexString(&c, "1234567890ABCDEF12345");
  1039. c.ShiftLeft(32);
  1040. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1041. AssignHexString(&a, "1234567890");
  1042. a.ShiftLeft(11*4 + 32);
  1043. AssignHexString(&b, "ABCDEF12346");
  1044. b.ShiftLeft(32);
  1045. AssignHexString(&c, "1234567890ABCDEF12345");
  1046. c.ShiftLeft(32);
  1047. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1048. AssignHexString(&a, "1234567891");
  1049. a.ShiftLeft(11*4 + 32);
  1050. AssignHexString(&b, "ABCDEF12345");
  1051. b.ShiftLeft(32);
  1052. AssignHexString(&c, "1234567890ABCDEF12345");
  1053. c.ShiftLeft(32);
  1054. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1055. AssignHexString(&a, "1234567889");
  1056. a.ShiftLeft(11*4 + 32);
  1057. AssignHexString(&b, "ABCDEF12345");
  1058. b.ShiftLeft(32);
  1059. AssignHexString(&c, "1234567890ABCDEF12345");
  1060. c.ShiftLeft(32);
  1061. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1062. AssignHexString(&a, "1234567890");
  1063. a.ShiftLeft(11*4 + 32);
  1064. AssignHexString(&b, "ABCDEF12345");
  1065. b.ShiftLeft(32);
  1066. AssignHexString(&c, "1234567890ABCDEF1234500000000");
  1067. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1068. AssignHexString(&a, "1234567890");
  1069. a.ShiftLeft(11*4 + 32);
  1070. AssignHexString(&b, "ABCDEF12344");
  1071. b.ShiftLeft(32);
  1072. AssignHexString(&c, "1234567890ABCDEF1234500000000");
  1073. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1074. AssignHexString(&a, "1234567890");
  1075. a.ShiftLeft(11*4 + 32);
  1076. AssignHexString(&b, "ABCDEF12346");
  1077. b.ShiftLeft(32);
  1078. AssignHexString(&c, "1234567890ABCDEF1234500000000");
  1079. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1080. AssignHexString(&a, "1234567891");
  1081. a.ShiftLeft(11*4 + 32);
  1082. AssignHexString(&b, "ABCDEF12345");
  1083. b.ShiftLeft(32);
  1084. AssignHexString(&c, "1234567890ABCDEF1234500000000");
  1085. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1086. AssignHexString(&a, "1234567889");
  1087. a.ShiftLeft(11*4 + 32);
  1088. AssignHexString(&b, "ABCDEF12345");
  1089. b.ShiftLeft(32);
  1090. AssignHexString(&c, "1234567890ABCDEF1234500000000");
  1091. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1092. AssignHexString(&a, "1234567890");
  1093. a.ShiftLeft(11*4 + 32);
  1094. AssignHexString(&b, "ABCDEF12345");
  1095. AssignHexString(&c, "123456789000000000ABCDEF12345");
  1096. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1097. AssignHexString(&a, "1234567890");
  1098. a.ShiftLeft(11*4 + 32);
  1099. AssignHexString(&b, "ABCDEF12346");
  1100. AssignHexString(&c, "123456789000000000ABCDEF12345");
  1101. CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
  1102. AssignHexString(&a, "1234567890");
  1103. a.ShiftLeft(11*4 + 32);
  1104. AssignHexString(&b, "ABCDEF12344");
  1105. AssignHexString(&c, "123456789000000000ABCDEF12345");
  1106. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1107. AssignHexString(&a, "1234567890");
  1108. a.ShiftLeft(11*4 + 32);
  1109. AssignHexString(&b, "ABCDEF12345");
  1110. b.ShiftLeft(16);
  1111. AssignHexString(&c, "12345678900000ABCDEF123450000");
  1112. CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
  1113. AssignHexString(&a, "1234567890");
  1114. a.ShiftLeft(11*4 + 32);
  1115. AssignHexString(&b, "ABCDEF12344");
  1116. b.ShiftLeft(16);
  1117. AssignHexString(&c, "12345678900000ABCDEF123450000");
  1118. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1119. AssignHexString(&a, "1234567890");
  1120. a.ShiftLeft(11*4 + 32);
  1121. AssignHexString(&b, "ABCDEF12345");
  1122. b.ShiftLeft(16);
  1123. AssignHexString(&c, "12345678900000ABCDEF123450001");
  1124. CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
  1125. AssignHexString(&a, "1234567890");
  1126. a.ShiftLeft(11*4 + 32);
  1127. AssignHexString(&b, "ABCDEF12346");
  1128. b.ShiftLeft(16);
  1129. AssignHexString(&c, "12345678900000ABCDEF123450000");
  1130. CHECK_EQ(+1, Bignum::PlusCompare(a, b, c));
  1131. }
  1132. TEST(Square) {
  1133. Bignum bignum;
  1134. char buffer[kBufferSize];
  1135. bignum.AssignUInt16(1);
  1136. bignum.Square();
  1137. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1138. CHECK_EQ("1", buffer);
  1139. bignum.AssignUInt16(2);
  1140. bignum.Square();
  1141. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1142. CHECK_EQ("4", buffer);
  1143. bignum.AssignUInt16(10);
  1144. bignum.Square();
  1145. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1146. CHECK_EQ("64", buffer);
  1147. AssignHexString(&bignum, "FFFFFFF");
  1148. bignum.Square();
  1149. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1150. CHECK_EQ("FFFFFFE0000001", buffer);
  1151. AssignHexString(&bignum, "FFFFFFFFFFFFFF");
  1152. bignum.Square();
  1153. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1154. CHECK_EQ("FFFFFFFFFFFFFE00000000000001", buffer);
  1155. }
  1156. TEST(AssignPowerUInt16) {
  1157. Bignum bignum;
  1158. char buffer[kBufferSize];
  1159. bignum.AssignPowerUInt16(1, 0);
  1160. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1161. CHECK_EQ("1", buffer);
  1162. bignum.AssignPowerUInt16(1, 1);
  1163. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1164. CHECK_EQ("1", buffer);
  1165. bignum.AssignPowerUInt16(1, 2);
  1166. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1167. CHECK_EQ("1", buffer);
  1168. bignum.AssignPowerUInt16(2, 0);
  1169. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1170. CHECK_EQ("1", buffer);
  1171. bignum.AssignPowerUInt16(2, 1);
  1172. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1173. CHECK_EQ("2", buffer);
  1174. bignum.AssignPowerUInt16(2, 2);
  1175. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1176. CHECK_EQ("4", buffer);
  1177. bignum.AssignPowerUInt16(16, 1);
  1178. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1179. CHECK_EQ("10", buffer);
  1180. bignum.AssignPowerUInt16(16, 2);
  1181. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1182. CHECK_EQ("100", buffer);
  1183. bignum.AssignPowerUInt16(16, 5);
  1184. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1185. CHECK_EQ("100000", buffer);
  1186. bignum.AssignPowerUInt16(16, 8);
  1187. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1188. CHECK_EQ("100000000", buffer);
  1189. bignum.AssignPowerUInt16(16, 16);
  1190. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1191. CHECK_EQ("10000000000000000", buffer);
  1192. bignum.AssignPowerUInt16(16, 30);
  1193. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1194. CHECK_EQ("1000000000000000000000000000000", buffer);
  1195. bignum.AssignPowerUInt16(10, 0);
  1196. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1197. CHECK_EQ("1", buffer);
  1198. bignum.AssignPowerUInt16(10, 1);
  1199. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1200. CHECK_EQ("A", buffer);
  1201. bignum.AssignPowerUInt16(10, 2);
  1202. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1203. CHECK_EQ("64", buffer);
  1204. bignum.AssignPowerUInt16(10, 5);
  1205. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1206. CHECK_EQ("186A0", buffer);
  1207. bignum.AssignPowerUInt16(10, 8);
  1208. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1209. CHECK_EQ("5F5E100", buffer);
  1210. bignum.AssignPowerUInt16(10, 16);
  1211. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1212. CHECK_EQ("2386F26FC10000", buffer);
  1213. bignum.AssignPowerUInt16(10, 30);
  1214. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1215. CHECK_EQ("C9F2C9CD04674EDEA40000000", buffer);
  1216. bignum.AssignPowerUInt16(10, 31);
  1217. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1218. CHECK_EQ("7E37BE2022C0914B2680000000", buffer);
  1219. bignum.AssignPowerUInt16(2, 0);
  1220. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1221. CHECK_EQ("1", buffer);
  1222. bignum.AssignPowerUInt16(2, 100);
  1223. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1224. CHECK_EQ("10000000000000000000000000", buffer);
  1225. bignum.AssignPowerUInt16(17, 0);
  1226. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1227. CHECK_EQ("1", buffer);
  1228. bignum.AssignPowerUInt16(17, 99);
  1229. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1230. CHECK_EQ("1942BB9853FAD924A3D4DD92B89B940E0207BEF05DB9C26BC1B757"
  1231. "80BE0C5A2C2990E02A681224F34ED68558CE4C6E33760931",
  1232. buffer);
  1233. bignum.AssignPowerUInt16(0xFFFF, 99);
  1234. CHECK(bignum.ToHexString(buffer, kBufferSize));
  1235. CHECK_EQ("FF9D12F09B886C54E77E7439C7D2DED2D34F669654C0C2B6B8C288250"
  1236. "5A2211D0E3DC9A61831349EAE674B11D56E3049D7BD79DAAD6C9FA2BA"
  1237. "528E3A794299F2EE9146A324DAFE3E88967A0358233B543E233E575B9"
  1238. "DD4E3AA7942146426C328FF55BFD5C45E0901B1629260AF9AE2F310C5"
  1239. "50959FAF305C30116D537D80CF6EBDBC15C5694062AF1AC3D956D0A41"
  1240. "B7E1B79FF11E21D83387A1CE1F5882B31E4B5D8DE415BDBE6854466DF"
  1241. "343362267A7E8833119D31D02E18DB5B0E8F6A64B0ED0D0062FFFF",
  1242. buffer);
  1243. }