github.com/cockroachdb/apd/v3@v3.2.0/bigint_test.go (about) 1 // Copyright 2022 The Cockroach Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. See the License for the specific language governing 13 // permissions and limitations under the License. 14 15 package apd 16 17 import ( 18 "bytes" 19 "encoding/gob" 20 "encoding/hex" 21 "encoding/json" 22 "encoding/xml" 23 "fmt" 24 "math" 25 "math/big" 26 "math/rand" 27 "reflect" 28 "strconv" 29 "strings" 30 "testing" 31 "testing/quick" 32 ) 33 34 // TestBigIntMatchesMathBigInt uses testing/quick to verify that all methods on 35 // apd.BigInt and math/big.Int have identical behavior for all inputs. 36 func TestBigIntMatchesMathBigInt(t *testing.T) { 37 // Catch specific panics and map to strings. 38 const ( 39 panicDivisionByZero = "division by zero" 40 panicJacobi = "invalid 2nd argument to Int.Jacobi: need odd integer" 41 panicNegativeBit = "negative bit index" 42 panicSquareRootOfNegativeNum = "square root of negative number" 43 ) 44 catchPanic := func(fn func() string, catches ...string) (res string) { 45 defer func() { 46 if r := recover(); r != nil { 47 if rs, ok := r.(string); ok { 48 for _, catch := range catches { 49 if strings.Contains(rs, catch) { 50 res = fmt.Sprintf("caught: %s", r) 51 } 52 } 53 } 54 if res == "" { // not caught 55 panic(r) 56 } 57 } 58 }() 59 return fn() 60 } 61 62 t.Run("Abs", func(t *testing.T) { 63 apd := func(z, x number) string { 64 return z.toApd(t).Abs(x.toApd(t)).String() 65 } 66 math := func(z, x number) string { 67 return z.toMath(t).Abs(x.toMath(t)).String() 68 } 69 require(t, quick.CheckEqual(apd, math, nil)) 70 }) 71 72 t.Run("Add", func(t *testing.T) { 73 apd := func(z, x, y number) string { 74 return z.toApd(t).Add(x.toApd(t), y.toApd(t)).String() 75 } 76 math := func(z, x, y number) string { 77 return z.toMath(t).Add(x.toMath(t), y.toMath(t)).String() 78 } 79 require(t, quick.CheckEqual(apd, math, nil)) 80 }) 81 82 t.Run("And", func(t *testing.T) { 83 apd := func(z, x, y number) string { 84 return z.toApd(t).And(x.toApd(t), y.toApd(t)).String() 85 } 86 math := func(z, x, y number) string { 87 return z.toMath(t).And(x.toMath(t), y.toMath(t)).String() 88 } 89 require(t, quick.CheckEqual(apd, math, nil)) 90 }) 91 92 t.Run("AndNot", func(t *testing.T) { 93 apd := func(z, x, y number) string { 94 return z.toApd(t).AndNot(x.toApd(t), y.toApd(t)).String() 95 } 96 math := func(z, x, y number) string { 97 return z.toMath(t).AndNot(x.toMath(t), y.toMath(t)).String() 98 } 99 require(t, quick.CheckEqual(apd, math, nil)) 100 }) 101 102 t.Run("Append", func(t *testing.T) { 103 apd := func(z numberOrNil) []byte { 104 return z.toApd(t).Append(nil, 10) 105 } 106 math := func(z numberOrNil) []byte { 107 return z.toMath(t).Append(nil, 10) 108 } 109 require(t, quick.CheckEqual(apd, math, nil)) 110 }) 111 112 t.Run("Binomial", func(t *testing.T) { 113 t.Skip("too slow") 114 apd := func(z number, n, k int64) string { 115 return z.toApd(t).Binomial(n, k).String() 116 } 117 math := func(z number, n, k int64) string { 118 return z.toMath(t).Binomial(n, k).String() 119 } 120 require(t, quick.CheckEqual(apd, math, nil)) 121 }) 122 123 t.Run("Bit", func(t *testing.T) { 124 apd := func(z number, i int) string { 125 return catchPanic(func() string { 126 return strconv.FormatUint(uint64(z.toApd(t).Bit(i)), 10) 127 }, panicNegativeBit) 128 } 129 math := func(z number, i int) string { 130 return catchPanic(func() string { 131 return strconv.FormatUint(uint64(z.toMath(t).Bit(i)), 10) 132 }, panicNegativeBit) 133 } 134 require(t, quick.CheckEqual(apd, math, nil)) 135 }) 136 137 t.Run("BitLen", func(t *testing.T) { 138 apd := func(z number) int { 139 return z.toApd(t).BitLen() 140 } 141 math := func(z number) int { 142 return z.toMath(t).BitLen() 143 } 144 require(t, quick.CheckEqual(apd, math, nil)) 145 }) 146 147 t.Run("Bits", func(t *testing.T) { 148 emptyToNil := func(w []big.Word) []big.Word { 149 if len(w) == 0 { 150 return nil 151 } 152 return w 153 } 154 apd := func(z number) []big.Word { 155 return emptyToNil(z.toApd(t).Bits()) 156 } 157 math := func(z number) []big.Word { 158 return emptyToNil(z.toMath(t).Bits()) 159 } 160 require(t, quick.CheckEqual(apd, math, nil)) 161 }) 162 163 t.Run("Bytes", func(t *testing.T) { 164 apd := func(z number) []byte { 165 return z.toApd(t).Bytes() 166 } 167 math := func(z number) []byte { 168 return z.toMath(t).Bytes() 169 } 170 require(t, quick.CheckEqual(apd, math, nil)) 171 }) 172 173 t.Run("Cmp", func(t *testing.T) { 174 apd := func(z, y number) int { 175 return z.toApd(t).Cmp(y.toApd(t)) 176 } 177 math := func(z, y number) int { 178 return z.toMath(t).Cmp(y.toMath(t)) 179 } 180 require(t, quick.CheckEqual(apd, math, nil)) 181 }) 182 183 t.Run("CmpAbs", func(t *testing.T) { 184 apd := func(z, y number) int { 185 return z.toApd(t).CmpAbs(y.toApd(t)) 186 } 187 math := func(z, y number) int { 188 return z.toMath(t).CmpAbs(y.toMath(t)) 189 } 190 require(t, quick.CheckEqual(apd, math, nil)) 191 }) 192 193 t.Run("Div", func(t *testing.T) { 194 apd := func(z, x, y number) string { 195 return catchPanic(func() string { 196 return z.toApd(t).Div(x.toApd(t), y.toApd(t)).String() 197 }, panicDivisionByZero) 198 } 199 math := func(z, x, y number) string { 200 return catchPanic(func() string { 201 return z.toMath(t).Div(x.toMath(t), y.toMath(t)).String() 202 }, panicDivisionByZero) 203 } 204 require(t, quick.CheckEqual(apd, math, nil)) 205 }) 206 207 t.Run("DivMod", func(t *testing.T) { 208 apd := func(z, x, y, m number) string { 209 return catchPanic(func() string { 210 zi, mi := z.toApd(t), m.toApd(t) 211 zi.DivMod(x.toApd(t), y.toApd(t), mi) 212 return zi.String() + " | " + mi.String() 213 }, panicDivisionByZero) 214 } 215 math := func(z, x, y, m number) string { 216 return catchPanic(func() string { 217 zi, mi := z.toMath(t), m.toMath(t) 218 zi.DivMod(x.toMath(t), y.toMath(t), mi) 219 return zi.String() + " | " + mi.String() 220 }, panicDivisionByZero) 221 } 222 require(t, quick.CheckEqual(apd, math, nil)) 223 }) 224 225 t.Run("Exp", func(t *testing.T) { 226 t.Skip("too slow") 227 apd := func(z, x, y, m number) string { 228 return z.toApd(t).Exp(x.toApd(t), y.toApd(t), m.toApd(t)).String() 229 } 230 math := func(z, x, y, m number) string { 231 return z.toMath(t).Exp(x.toMath(t), y.toMath(t), m.toMath(t)).String() 232 } 233 require(t, quick.CheckEqual(apd, math, nil)) 234 }) 235 236 t.Run("Format", func(t *testing.T) { 237 // Call indirectly through fmt.Sprint. 238 apd := func(z numberOrNil) string { 239 return fmt.Sprint(z.toApd(t)) 240 } 241 math := func(z numberOrNil) string { 242 return fmt.Sprint(z.toMath(t)) 243 } 244 require(t, quick.CheckEqual(apd, math, nil)) 245 }) 246 247 t.Run("GCD", func(t *testing.T) { 248 apd := func(z number, x, y numberOrNil, a, b number) string { 249 return z.toApd(t).GCD(x.toApd(t), y.toApd(t), a.toApd(t), b.toApd(t)).String() 250 } 251 math := func(z number, x, y numberOrNil, a, b number) string { 252 return z.toMath(t).GCD(x.toMath(t), y.toMath(t), a.toMath(t), b.toMath(t)).String() 253 } 254 require(t, quick.CheckEqual(apd, math, nil)) 255 }) 256 257 t.Run("GobEncode", func(t *testing.T) { 258 apd := func(z numberOrNil) ([]byte, error) { 259 return z.toApd(t).GobEncode() 260 } 261 math := func(z numberOrNil) ([]byte, error) { 262 return z.toMath(t).GobEncode() 263 } 264 require(t, quick.CheckEqual(apd, math, nil)) 265 }) 266 267 t.Run("GobDecode", func(t *testing.T) { 268 apd := func(z number, buf []byte) (string, error) { 269 zi := z.toApd(t) 270 err := zi.GobDecode(buf) 271 return zi.String(), err 272 } 273 math := func(z number, buf []byte) (string, error) { 274 zi := z.toMath(t) 275 err := zi.GobDecode(buf) 276 return zi.String(), err 277 } 278 require(t, quick.CheckEqual(apd, math, nil)) 279 }) 280 281 t.Run("Int64", func(t *testing.T) { 282 apd := func(z number) int64 { 283 return z.toApd(t).Int64() 284 } 285 math := func(z number) int64 { 286 return z.toMath(t).Int64() 287 } 288 require(t, quick.CheckEqual(apd, math, nil)) 289 }) 290 291 t.Run("IsInt64", func(t *testing.T) { 292 apd := func(z number) bool { 293 return z.toApd(t).IsInt64() 294 } 295 math := func(z number) bool { 296 return z.toMath(t).IsInt64() 297 } 298 require(t, quick.CheckEqual(apd, math, nil)) 299 }) 300 301 t.Run("IsUint64", func(t *testing.T) { 302 apd := func(z number) bool { 303 return z.toApd(t).IsUint64() 304 } 305 math := func(z number) bool { 306 return z.toMath(t).IsUint64() 307 } 308 require(t, quick.CheckEqual(apd, math, nil)) 309 }) 310 311 t.Run("Lsh", func(t *testing.T) { 312 const maxShift = 1000 // avoid makeslice: len out of range 313 apd := func(z, x number, n uint) string { 314 if n > maxShift { 315 n = maxShift 316 } 317 return z.toApd(t).Lsh(x.toApd(t), n).String() 318 } 319 math := func(z, x number, n uint) string { 320 if n > maxShift { 321 n = maxShift 322 } 323 return z.toMath(t).Lsh(x.toMath(t), n).String() 324 } 325 require(t, quick.CheckEqual(apd, math, nil)) 326 }) 327 328 t.Run("MarshalJSON", func(t *testing.T) { 329 apd := func(z numberOrNil) ([]byte, error) { 330 return z.toApd(t).MarshalJSON() 331 } 332 math := func(z numberOrNil) ([]byte, error) { 333 return z.toMath(t).MarshalJSON() 334 } 335 require(t, quick.CheckEqual(apd, math, nil)) 336 }) 337 338 t.Run("MarshalText", func(t *testing.T) { 339 apd := func(z numberOrNil) ([]byte, error) { 340 return z.toApd(t).MarshalText() 341 } 342 math := func(z numberOrNil) ([]byte, error) { 343 return z.toMath(t).MarshalText() 344 } 345 require(t, quick.CheckEqual(apd, math, nil)) 346 }) 347 348 t.Run("Mod", func(t *testing.T) { 349 apd := func(z, x, y number) string { 350 return catchPanic(func() string { 351 return z.toApd(t).Mod(x.toApd(t), y.toApd(t)).String() 352 }, panicDivisionByZero, panicJacobi) 353 } 354 math := func(z, x, y number) string { 355 return catchPanic(func() string { 356 return z.toMath(t).Mod(x.toMath(t), y.toMath(t)).String() 357 }, panicDivisionByZero, panicJacobi) 358 } 359 require(t, quick.CheckEqual(apd, math, nil)) 360 }) 361 362 t.Run("ModInverse", func(t *testing.T) { 363 apd := func(z, x, y number) string { 364 return catchPanic(func() string { 365 return z.toApd(t).ModInverse(x.toApd(t), y.toApd(t)).String() 366 }, panicDivisionByZero) 367 } 368 math := func(z, x, y number) string { 369 return catchPanic(func() string { 370 return z.toMath(t).ModInverse(x.toMath(t), y.toMath(t)).String() 371 }, panicDivisionByZero) 372 } 373 require(t, quick.CheckEqual(apd, math, nil)) 374 }) 375 376 t.Run("ModSqrt", func(t *testing.T) { 377 t.Skip("too slow") 378 apd := func(z, x, y number) string { 379 return catchPanic(func() string { 380 return z.toApd(t).ModSqrt(x.toApd(t), y.toApd(t)).String() 381 }, panicJacobi) 382 } 383 math := func(z, x, y number) string { 384 return catchPanic(func() string { 385 return z.toMath(t).ModSqrt(x.toMath(t), y.toMath(t)).String() 386 }, panicJacobi) 387 } 388 require(t, quick.CheckEqual(apd, math, nil)) 389 }) 390 391 t.Run("Mul", func(t *testing.T) { 392 apd := func(z, x, y number) string { 393 return z.toApd(t).Mul(x.toApd(t), y.toApd(t)).String() 394 } 395 math := func(z, x, y number) string { 396 return z.toMath(t).Mul(x.toMath(t), y.toMath(t)).String() 397 } 398 require(t, quick.CheckEqual(apd, math, nil)) 399 }) 400 401 t.Run("MulRange", func(t *testing.T) { 402 t.Skip("too slow") 403 apd := func(z number, x, y int64) string { 404 return z.toApd(t).MulRange(x, y).String() 405 } 406 math := func(z number, x, y int64) string { 407 return z.toMath(t).MulRange(x, y).String() 408 } 409 require(t, quick.CheckEqual(apd, math, nil)) 410 }) 411 412 t.Run("Neg", func(t *testing.T) { 413 apd := func(z, x number) string { 414 return z.toApd(t).Neg(x.toApd(t)).String() 415 } 416 math := func(z, x number) string { 417 return z.toMath(t).Neg(x.toMath(t)).String() 418 } 419 require(t, quick.CheckEqual(apd, math, nil)) 420 }) 421 422 t.Run("Not", func(t *testing.T) { 423 apd := func(z, x number) string { 424 return z.toApd(t).Not(x.toApd(t)).String() 425 } 426 math := func(z, x number) string { 427 return z.toMath(t).Not(x.toMath(t)).String() 428 } 429 require(t, quick.CheckEqual(apd, math, nil)) 430 }) 431 432 t.Run("Or", func(t *testing.T) { 433 apd := func(z, x, y number) string { 434 return z.toApd(t).Or(x.toApd(t), y.toApd(t)).String() 435 } 436 math := func(z, x, y number) string { 437 return z.toMath(t).Or(x.toMath(t), y.toMath(t)).String() 438 } 439 require(t, quick.CheckEqual(apd, math, nil)) 440 }) 441 442 t.Run("ProbablyPrime", func(t *testing.T) { 443 apd := func(z number) bool { 444 return z.toApd(t).ProbablyPrime(64) 445 } 446 math := func(z number) bool { 447 return z.toMath(t).ProbablyPrime(64) 448 } 449 require(t, quick.CheckEqual(apd, math, nil)) 450 }) 451 452 t.Run("Quo", func(t *testing.T) { 453 apd := func(z, x, y number) string { 454 return catchPanic(func() string { 455 return z.toApd(t).Quo(x.toApd(t), y.toApd(t)).String() 456 }, panicDivisionByZero) 457 } 458 math := func(z, x, y number) string { 459 return catchPanic(func() string { 460 return z.toMath(t).Quo(x.toMath(t), y.toMath(t)).String() 461 }, panicDivisionByZero) 462 } 463 require(t, quick.CheckEqual(apd, math, nil)) 464 }) 465 466 t.Run("QuoRem", func(t *testing.T) { 467 apd := func(z, x, y, r number) string { 468 return catchPanic(func() string { 469 zi, ri := z.toApd(t), r.toApd(t) 470 zi.QuoRem(x.toApd(t), y.toApd(t), ri) 471 return zi.String() + " | " + ri.String() 472 }, panicDivisionByZero) 473 } 474 math := func(z, x, y, r number) string { 475 return catchPanic(func() string { 476 zi, ri := z.toMath(t), r.toMath(t) 477 zi.QuoRem(x.toMath(t), y.toMath(t), ri) 478 return zi.String() + " | " + ri.String() 479 }, panicDivisionByZero) 480 } 481 require(t, quick.CheckEqual(apd, math, nil)) 482 }) 483 484 t.Run("Rand", func(t *testing.T) { 485 apd := func(z, n number, seed int64) string { 486 rng := rand.New(rand.NewSource(seed)) 487 return z.toApd(t).Rand(rng, n.toApd(t)).String() 488 } 489 math := func(z, n number, seed int64) string { 490 rng := rand.New(rand.NewSource(seed)) 491 return z.toMath(t).Rand(rng, n.toMath(t)).String() 492 } 493 require(t, quick.CheckEqual(apd, math, nil)) 494 }) 495 496 t.Run("Rem", func(t *testing.T) { 497 apd := func(z, x, y number) string { 498 return catchPanic(func() string { 499 return z.toApd(t).Rem(x.toApd(t), y.toApd(t)).String() 500 }, panicDivisionByZero) 501 } 502 math := func(z, x, y number) string { 503 return catchPanic(func() string { 504 return z.toMath(t).Rem(x.toMath(t), y.toMath(t)).String() 505 }, panicDivisionByZero) 506 } 507 require(t, quick.CheckEqual(apd, math, nil)) 508 }) 509 510 t.Run("Rsh", func(t *testing.T) { 511 const maxShift = 1000 // avoid makeslice: len out of range 512 apd := func(z, x number, n uint) string { 513 if n > maxShift { 514 n = maxShift 515 } 516 return z.toApd(t).Rsh(x.toApd(t), n).String() 517 } 518 math := func(z, x number, n uint) string { 519 if n > maxShift { 520 n = maxShift 521 } 522 return z.toMath(t).Rsh(x.toMath(t), n).String() 523 } 524 require(t, quick.CheckEqual(apd, math, nil)) 525 }) 526 527 t.Run("Scan", func(t *testing.T) { 528 // Call indirectly through fmt.Sscan. 529 apd := func(z, src number) (string, error) { 530 zi := z.toApd(t) 531 _, err := fmt.Sscan(string(src), zi) 532 return zi.String(), err 533 } 534 math := func(z, src number) (string, error) { 535 zi := z.toMath(t) 536 _, err := fmt.Sscan(string(src), zi) 537 return zi.String(), err 538 } 539 require(t, quick.CheckEqual(apd, math, nil)) 540 }) 541 542 t.Run("Set", func(t *testing.T) { 543 apd := func(z, x number) string { 544 return z.toApd(t).Set(x.toApd(t)).String() 545 } 546 math := func(z, x number) string { 547 return z.toMath(t).Set(x.toMath(t)).String() 548 } 549 require(t, quick.CheckEqual(apd, math, nil)) 550 }) 551 552 t.Run("SetBit", func(t *testing.T) { 553 const maxBit = 1000 // avoid makeslice: len out of range 554 apd := func(z, x number, i int, b bool) string { 555 if i > maxBit { 556 i = maxBit 557 } 558 bi := uint(0) 559 if b { 560 bi = 1 561 } 562 return catchPanic(func() string { 563 return z.toApd(t).SetBit(x.toApd(t), i, bi).String() 564 }, panicNegativeBit) 565 } 566 math := func(z, x number, i int, b bool) string { 567 if i > maxBit { 568 i = maxBit 569 } 570 bi := uint(0) 571 if b { 572 bi = 1 573 } 574 return catchPanic(func() string { 575 return z.toMath(t).SetBit(x.toMath(t), i, bi).String() 576 }, panicNegativeBit) 577 } 578 require(t, quick.CheckEqual(apd, math, nil)) 579 }) 580 581 t.Run("SetBits", func(t *testing.T) { 582 apd := func(z number, abs []big.Word) string { 583 return z.toApd(t).SetBits(abs).String() 584 } 585 math := func(z number, abs []big.Word) string { 586 return z.toMath(t).SetBits(abs).String() 587 } 588 require(t, quick.CheckEqual(apd, math, nil)) 589 }) 590 591 t.Run("SetBytes", func(t *testing.T) { 592 apd := func(z number, buf []byte) string { 593 return z.toApd(t).SetBytes(buf).String() 594 } 595 math := func(z number, buf []byte) string { 596 return z.toMath(t).SetBytes(buf).String() 597 } 598 require(t, quick.CheckEqual(apd, math, nil)) 599 }) 600 601 t.Run("SetInt64", func(t *testing.T) { 602 apd := func(z number, x int64) string { 603 return z.toApd(t).SetInt64(x).String() 604 } 605 math := func(z number, x int64) string { 606 return z.toMath(t).SetInt64(x).String() 607 } 608 require(t, quick.CheckEqual(apd, math, nil)) 609 }) 610 611 t.Run("SetString", func(t *testing.T) { 612 apd := func(z, x number) (string, bool) { 613 zi, ok := z.toApd(t).SetString(string(x), 10) 614 return zi.String(), ok 615 } 616 math := func(z, x number) (string, bool) { 617 zi, ok := z.toMath(t).SetString(string(x), 10) 618 return zi.String(), ok 619 } 620 require(t, quick.CheckEqual(apd, math, nil)) 621 }) 622 623 t.Run("SetUint64", func(t *testing.T) { 624 apd := func(z number, x uint64) string { 625 return z.toApd(t).SetUint64(x).String() 626 } 627 math := func(z number, x uint64) string { 628 return z.toMath(t).SetUint64(x).String() 629 } 630 require(t, quick.CheckEqual(apd, math, nil)) 631 }) 632 633 t.Run("Sign", func(t *testing.T) { 634 apd := func(z number) int { 635 return z.toApd(t).Sign() 636 } 637 math := func(z number) int { 638 return z.toMath(t).Sign() 639 } 640 require(t, quick.CheckEqual(apd, math, nil)) 641 }) 642 643 t.Run("Sqrt", func(t *testing.T) { 644 apd := func(z, x number) string { 645 return catchPanic(func() string { 646 return z.toApd(t).Sqrt(x.toApd(t)).String() 647 }, panicSquareRootOfNegativeNum) 648 } 649 math := func(z, x number) string { 650 return catchPanic(func() string { 651 return z.toMath(t).Sqrt(x.toMath(t)).String() 652 }, panicSquareRootOfNegativeNum) 653 } 654 require(t, quick.CheckEqual(apd, math, nil)) 655 }) 656 657 t.Run("String", func(t *testing.T) { 658 apd := func(z numberOrNil) string { 659 return z.toApd(t).String() 660 } 661 math := func(z numberOrNil) string { 662 return z.toMath(t).String() 663 } 664 require(t, quick.CheckEqual(apd, math, nil)) 665 }) 666 667 t.Run("Sub", func(t *testing.T) { 668 apd := func(z, x, y number) string { 669 return z.toApd(t).Sub(x.toApd(t), y.toApd(t)).String() 670 } 671 math := func(z, x, y number) string { 672 return z.toMath(t).Sub(x.toMath(t), y.toMath(t)).String() 673 } 674 require(t, quick.CheckEqual(apd, math, nil)) 675 }) 676 677 t.Run("Text", func(t *testing.T) { 678 apd := func(z numberOrNil) string { 679 return z.toApd(t).Text(10) 680 } 681 math := func(z numberOrNil) string { 682 return z.toMath(t).Text(10) 683 } 684 require(t, quick.CheckEqual(apd, math, nil)) 685 }) 686 687 t.Run("TrailingZeroBits", func(t *testing.T) { 688 apd := func(z number) uint { 689 return z.toApd(t).TrailingZeroBits() 690 } 691 math := func(z number) uint { 692 return z.toMath(t).TrailingZeroBits() 693 } 694 require(t, quick.CheckEqual(apd, math, nil)) 695 }) 696 697 t.Run("Uint64", func(t *testing.T) { 698 apd := func(z number) uint64 { 699 return z.toApd(t).Uint64() 700 } 701 math := func(z number) uint64 { 702 return z.toMath(t).Uint64() 703 } 704 require(t, quick.CheckEqual(apd, math, nil)) 705 }) 706 707 t.Run("UnmarshalJSON", func(t *testing.T) { 708 apd := func(z number, text []byte) (string, error) { 709 zi := z.toApd(t) 710 if err := zi.UnmarshalJSON(text); err != nil { 711 return "", err 712 } 713 return zi.String(), nil 714 } 715 math := func(z number, text []byte) (string, error) { 716 zi := z.toMath(t) 717 if err := zi.UnmarshalJSON(text); err != nil { 718 return "", err 719 } 720 return zi.String(), nil 721 } 722 require(t, quick.CheckEqual(apd, math, nil)) 723 }) 724 725 t.Run("UnmarshalText", func(t *testing.T) { 726 apd := func(z number, text []byte) (string, error) { 727 zi := z.toApd(t) 728 if err := zi.UnmarshalText(text); err != nil { 729 return "", err 730 } 731 return zi.String(), nil 732 } 733 math := func(z number, text []byte) (string, error) { 734 zi := z.toMath(t) 735 if err := zi.UnmarshalText(text); err != nil { 736 return "", err 737 } 738 return zi.String(), nil 739 } 740 require(t, quick.CheckEqual(apd, math, nil)) 741 }) 742 743 t.Run("Xor", func(t *testing.T) { 744 apd := func(z, x, y number) string { 745 return z.toApd(t).Xor(x.toApd(t), y.toApd(t)).String() 746 } 747 math := func(z, x, y number) string { 748 return z.toMath(t).Xor(x.toMath(t), y.toMath(t)).String() 749 } 750 require(t, quick.CheckEqual(apd, math, nil)) 751 }) 752 } 753 754 // TestBigIntMathBigIntRoundTrip uses testing/quick to verify that the 755 // apd.BigInt / math/big.Int interoperation methods each round-trip. 756 func TestBigIntMathBigIntRoundTrip(t *testing.T) { 757 t.Run("apd->math->apd", func(t *testing.T) { 758 base := func(z number) string { 759 return z.toApd(t).String() 760 } 761 roundtrip := func(z number) string { 762 bi := z.toApd(t).MathBigInt() 763 return new(BigInt).SetMathBigInt(bi).String() 764 } 765 require(t, quick.CheckEqual(base, roundtrip, nil)) 766 }) 767 768 t.Run("math->apd->math", func(t *testing.T) { 769 base := func(z number) string { 770 return z.toMath(t).String() 771 } 772 roundtrip := func(z number) string { 773 bi := new(BigInt).SetMathBigInt(z.toMath(t)) 774 return bi.MathBigInt().String() 775 } 776 require(t, quick.CheckEqual(base, roundtrip, nil)) 777 }) 778 } 779 780 // number is a quick.Generator for large integer numbers. 781 type number string 782 783 func (n number) Generate(r *rand.Rand, size int) reflect.Value { 784 var s string 785 if r.Intn(2) != 0 { 786 s = n.generateInterestingNumber(r) 787 } else { 788 s = n.generateRandomNumber(r, size) 789 } 790 return reflect.ValueOf(number(s)) 791 } 792 793 func (z *BigInt) incr() *BigInt { return z.Add(z, bigOne) } 794 func (z *BigInt) decr() *BigInt { return z.Sub(z, bigOne) } 795 796 var interestingNumbers = [...]*BigInt{ 797 new(BigInt).SetInt64(math.MinInt64).decr(), 798 new(BigInt).SetInt64(math.MinInt64), 799 new(BigInt).SetInt64(math.MinInt64).incr(), 800 new(BigInt).SetInt64(math.MinInt32), 801 new(BigInt).SetInt64(math.MinInt16), 802 new(BigInt).SetInt64(math.MinInt8), 803 new(BigInt).SetInt64(0), 804 new(BigInt).SetInt64(math.MaxInt8), 805 new(BigInt).SetInt64(math.MaxUint8), 806 new(BigInt).SetInt64(math.MaxInt16), 807 new(BigInt).SetInt64(math.MaxUint16), 808 new(BigInt).SetInt64(math.MaxInt32), 809 new(BigInt).SetInt64(math.MaxUint32), 810 new(BigInt).SetInt64(math.MaxInt64).decr(), 811 new(BigInt).SetInt64(math.MaxInt64), 812 new(BigInt).SetInt64(math.MaxInt64).incr(), 813 new(BigInt).SetUint64(math.MaxUint64).decr(), 814 new(BigInt).SetUint64(math.MaxUint64), 815 new(BigInt).SetUint64(math.MaxUint64).incr(), 816 } 817 818 func (number) generateInterestingNumber(r *rand.Rand) string { 819 return interestingNumbers[r.Intn(len(interestingNumbers))].String() 820 } 821 822 var numbers = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} 823 824 func (number) generateRandomNumber(r *rand.Rand, size int) string { 825 var s strings.Builder 826 if r.Intn(2) != 0 { 827 s.WriteByte('-') // neg 828 } 829 digits := r.Intn(size) + 1 830 for i := 0; i < digits; i++ { 831 s.WriteByte(numbers[r.Intn(len(numbers))]) 832 } 833 return s.String() 834 } 835 836 func (n number) toApd(t *testing.T) *BigInt { 837 var x BigInt 838 if _, ok := x.SetString(string(n), 10); !ok { 839 t.Fatalf("failed to SetString(%q)", n) 840 } 841 return &x 842 } 843 844 func (n number) toMath(t *testing.T) *big.Int { 845 var x big.Int 846 if _, ok := x.SetString(string(n), 10); !ok { 847 t.Fatalf("failed to SetString(%q)", n) 848 } 849 return &x 850 } 851 852 type numberOrNil struct { 853 Num number 854 Nil bool 855 } 856 857 func (n numberOrNil) toApd(t *testing.T) *BigInt { 858 if n.Nil { 859 return nil 860 } 861 return n.Num.toApd(t) 862 } 863 864 func (n numberOrNil) toMath(t *testing.T) *big.Int { 865 if n.Nil { 866 return nil 867 } 868 return n.Num.toMath(t) 869 } 870 871 // Until we import github.com/stretchr/testify/require. 872 func require(t *testing.T, err error) { 873 if err != nil { 874 t.Error(err) 875 } 876 } 877 878 ////////////////////////////////////////////////////////////////////////////////// 879 // The following tests were copied from the standard library's math/big package // 880 ////////////////////////////////////////////////////////////////////////////////// 881 882 // 883 // Tests from src/math/big/int_test.go 884 // 885 886 type funZZ func(z, x, y *BigInt) *BigInt 887 type argZZ struct { 888 z, x, y *BigInt 889 } 890 891 var sumZZ = []argZZ{ 892 {NewBigInt(0), NewBigInt(0), NewBigInt(0)}, 893 {NewBigInt(1), NewBigInt(1), NewBigInt(0)}, 894 {NewBigInt(1111111110), NewBigInt(123456789), NewBigInt(987654321)}, 895 {NewBigInt(-1), NewBigInt(-1), NewBigInt(0)}, 896 {NewBigInt(864197532), NewBigInt(-123456789), NewBigInt(987654321)}, 897 {NewBigInt(-1111111110), NewBigInt(-123456789), NewBigInt(-987654321)}, 898 } 899 900 var prodZZ = []argZZ{ 901 {NewBigInt(0), NewBigInt(0), NewBigInt(0)}, 902 {NewBigInt(0), NewBigInt(1), NewBigInt(0)}, 903 {NewBigInt(1), NewBigInt(1), NewBigInt(1)}, 904 {NewBigInt(-991 * 991), NewBigInt(991), NewBigInt(-991)}, 905 // TODO(gri) add larger products 906 } 907 908 func TestBigIntSignZ(t *testing.T) { 909 var zero BigInt 910 for _, a := range sumZZ { 911 s := a.z.Sign() 912 e := a.z.Cmp(&zero) 913 if s != e { 914 t.Errorf("got %d; want %d for z = %v", s, e, a.z) 915 } 916 } 917 } 918 919 func TestBigIntSetZ(t *testing.T) { 920 for _, a := range sumZZ { 921 var z BigInt 922 z.Set(a.z) 923 if (&z).Cmp(a.z) != 0 { 924 t.Errorf("got z = %v; want %v", &z, a.z) 925 } 926 } 927 } 928 929 func TestBigIntAbsZ(t *testing.T) { 930 var zero BigInt 931 for _, a := range sumZZ { 932 var z BigInt 933 z.Abs(a.z) 934 var e BigInt 935 e.Set(a.z) 936 if e.Cmp(&zero) < 0 { 937 e.Sub(&zero, &e) 938 } 939 if z.Cmp(&e) != 0 { 940 t.Errorf("got z = %v; want %v", &z, &e) 941 } 942 } 943 } 944 945 func testFunZZ(t *testing.T, msg string, f funZZ, a argZZ) { 946 var z BigInt 947 f(&z, a.x, a.y) 948 if (&z).Cmp(a.z) != 0 { 949 t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, &z, a.z) 950 } 951 } 952 953 func TestBigIntSumZZ(t *testing.T) { 954 AddZZ := func(z, x, y *BigInt) *BigInt { return z.Add(x, y) } 955 SubZZ := func(z, x, y *BigInt) *BigInt { return z.Sub(x, y) } 956 for _, a := range sumZZ { 957 arg := a 958 testFunZZ(t, "AddZZ", AddZZ, arg) 959 960 arg = argZZ{a.z, a.y, a.x} 961 testFunZZ(t, "AddZZ symmetric", AddZZ, arg) 962 963 arg = argZZ{a.x, a.z, a.y} 964 testFunZZ(t, "SubZZ", SubZZ, arg) 965 966 arg = argZZ{a.y, a.z, a.x} 967 testFunZZ(t, "SubZZ symmetric", SubZZ, arg) 968 } 969 } 970 971 func TestBigIntProdZZ(t *testing.T) { 972 MulZZ := func(z, x, y *BigInt) *BigInt { return z.Mul(x, y) } 973 for _, a := range prodZZ { 974 arg := a 975 testFunZZ(t, "MulZZ", MulZZ, arg) 976 977 arg = argZZ{a.z, a.y, a.x} 978 testFunZZ(t, "MulZZ symmetric", MulZZ, arg) 979 } 980 } 981 982 // mulBytes returns x*y via grade school multiplication. Both inputs 983 // and the result are assumed to be in big-endian representation (to 984 // match the semantics of BigInt.Bytes and BigInt.SetBytes). 985 func mulBytes(x, y []byte) []byte { 986 z := make([]byte, len(x)+len(y)) 987 988 // multiply 989 k0 := len(z) - 1 990 for j := len(y) - 1; j >= 0; j-- { 991 d := int(y[j]) 992 if d != 0 { 993 k := k0 994 carry := 0 995 for i := len(x) - 1; i >= 0; i-- { 996 t := int(z[k]) + int(x[i])*d + carry 997 z[k], carry = byte(t), t>>8 998 k-- 999 } 1000 z[k] = byte(carry) 1001 } 1002 k0-- 1003 } 1004 1005 // normalize (remove leading 0's) 1006 i := 0 1007 for i < len(z) && z[i] == 0 { 1008 i++ 1009 } 1010 1011 return z[i:] 1012 } 1013 1014 func checkMul(a, b []byte) bool { 1015 var x, y, z1 BigInt 1016 x.SetBytes(a) 1017 y.SetBytes(b) 1018 z1.Mul(&x, &y) 1019 1020 var z2 BigInt 1021 z2.SetBytes(mulBytes(a, b)) 1022 1023 return z1.Cmp(&z2) == 0 1024 } 1025 1026 func TestBigIntMul(t *testing.T) { 1027 if err := quick.Check(checkMul, nil); err != nil { 1028 t.Error(err) 1029 } 1030 } 1031 1032 var mulRangesN = []struct { 1033 a, b uint64 1034 prod string 1035 }{ 1036 {0, 0, "0"}, 1037 {1, 1, "1"}, 1038 {1, 2, "2"}, 1039 {1, 3, "6"}, 1040 {10, 10, "10"}, 1041 {0, 100, "0"}, 1042 {0, 1e9, "0"}, 1043 {1, 0, "1"}, // empty range 1044 {100, 1, "1"}, // empty range 1045 {1, 10, "3628800"}, // 10! 1046 {1, 20, "2432902008176640000"}, // 20! 1047 {1, 100, 1048 "933262154439441526816992388562667004907159682643816214685929" + 1049 "638952175999932299156089414639761565182862536979208272237582" + 1050 "51185210916864000000000000000000000000", // 100! 1051 }, 1052 } 1053 1054 var mulRangesZ = []struct { 1055 a, b int64 1056 prod string 1057 }{ 1058 // entirely positive ranges are covered by mulRangesN 1059 {-1, 1, "0"}, 1060 {-2, -1, "2"}, 1061 {-3, -2, "6"}, 1062 {-3, -1, "-6"}, 1063 {1, 3, "6"}, 1064 {-10, -10, "-10"}, 1065 {0, -1, "1"}, // empty range 1066 {-1, -100, "1"}, // empty range 1067 {-1, 1, "0"}, // range includes 0 1068 {-1e9, 0, "0"}, // range includes 0 1069 {-1e9, 1e9, "0"}, // range includes 0 1070 {-10, -1, "3628800"}, // 10! 1071 {-20, -2, "-2432902008176640000"}, // -20! 1072 {-99, -1, 1073 "-933262154439441526816992388562667004907159682643816214685929" + 1074 "638952175999932299156089414639761565182862536979208272237582" + 1075 "511852109168640000000000000000000000", // -99! 1076 }, 1077 } 1078 1079 func TestBigIntMulRangeZ(t *testing.T) { 1080 var tmp BigInt 1081 // test entirely positive ranges 1082 for i, r := range mulRangesN { 1083 prod := tmp.MulRange(int64(r.a), int64(r.b)).String() 1084 if prod != r.prod { 1085 t.Errorf("#%da: got %s; want %s", i, prod, r.prod) 1086 } 1087 } 1088 // test other ranges 1089 for i, r := range mulRangesZ { 1090 prod := tmp.MulRange(r.a, r.b).String() 1091 if prod != r.prod { 1092 t.Errorf("#%db: got %s; want %s", i, prod, r.prod) 1093 } 1094 } 1095 } 1096 1097 func TestBigIntBinomial(t *testing.T) { 1098 var z BigInt 1099 for _, test := range []struct { 1100 n, k int64 1101 want string 1102 }{ 1103 {0, 0, "1"}, 1104 {0, 1, "0"}, 1105 {1, 0, "1"}, 1106 {1, 1, "1"}, 1107 {1, 10, "0"}, 1108 {4, 0, "1"}, 1109 {4, 1, "4"}, 1110 {4, 2, "6"}, 1111 {4, 3, "4"}, 1112 {4, 4, "1"}, 1113 {10, 1, "10"}, 1114 {10, 9, "10"}, 1115 {10, 5, "252"}, 1116 {11, 5, "462"}, 1117 {11, 6, "462"}, 1118 {100, 10, "17310309456440"}, 1119 {100, 90, "17310309456440"}, 1120 {1000, 10, "263409560461970212832400"}, 1121 {1000, 990, "263409560461970212832400"}, 1122 } { 1123 if got := z.Binomial(test.n, test.k).String(); got != test.want { 1124 t.Errorf("Binomial(%d, %d) = %s; want %s", test.n, test.k, got, test.want) 1125 } 1126 } 1127 } 1128 1129 // Examples from the Go Language Spec, section "Arithmetic operators" 1130 var divisionSignsTests = []struct { 1131 x, y int64 1132 q, r int64 // T-division 1133 d, m int64 // Euclidean division 1134 }{ 1135 {5, 3, 1, 2, 1, 2}, 1136 {-5, 3, -1, -2, -2, 1}, 1137 {5, -3, -1, 2, -1, 2}, 1138 {-5, -3, 1, -2, 2, 1}, 1139 {1, 2, 0, 1, 0, 1}, 1140 {8, 4, 2, 0, 2, 0}, 1141 } 1142 1143 func TestBigIntDivisionSigns(t *testing.T) { 1144 for i, test := range divisionSignsTests { 1145 x := NewBigInt(test.x) 1146 y := NewBigInt(test.y) 1147 q := NewBigInt(test.q) 1148 r := NewBigInt(test.r) 1149 d := NewBigInt(test.d) 1150 m := NewBigInt(test.m) 1151 1152 q1 := new(BigInt).Quo(x, y) 1153 r1 := new(BigInt).Rem(x, y) 1154 if q1.Cmp(q) != 0 || r1.Cmp(r) != 0 { 1155 t.Errorf("#%d QuoRem: got (%s, %s), want (%s, %s)", i, q1, r1, q, r) 1156 } 1157 1158 q2, r2 := new(BigInt).QuoRem(x, y, new(BigInt)) 1159 if q2.Cmp(q) != 0 || r2.Cmp(r) != 0 { 1160 t.Errorf("#%d QuoRem: got (%s, %s), want (%s, %s)", i, q2, r2, q, r) 1161 } 1162 1163 d1 := new(BigInt).Div(x, y) 1164 m1 := new(BigInt).Mod(x, y) 1165 if d1.Cmp(d) != 0 || m1.Cmp(m) != 0 { 1166 t.Errorf("#%d DivMod: got (%s, %s), want (%s, %s)", i, d1, m1, d, m) 1167 } 1168 1169 d2, m2 := new(BigInt).DivMod(x, y, new(BigInt)) 1170 if d2.Cmp(d) != 0 || m2.Cmp(m) != 0 { 1171 t.Errorf("#%d DivMod: got (%s, %s), want (%s, %s)", i, d2, m2, d, m) 1172 } 1173 } 1174 } 1175 1176 func checkSetBytes(b []byte) bool { 1177 hex1 := hex.EncodeToString(new(BigInt).SetBytes(b).Bytes()) 1178 hex2 := hex.EncodeToString(b) 1179 1180 for len(hex1) < len(hex2) { 1181 hex1 = "0" + hex1 1182 } 1183 1184 for len(hex1) > len(hex2) { 1185 hex2 = "0" + hex2 1186 } 1187 1188 return hex1 == hex2 1189 } 1190 1191 func TestBigIntSetBytes(t *testing.T) { 1192 if err := quick.Check(checkSetBytes, nil); err != nil { 1193 t.Error(err) 1194 } 1195 } 1196 1197 func checkBytes(b []byte) bool { 1198 // trim leading zero bytes since Bytes() won't return them 1199 // (was issue 12231) 1200 for len(b) > 0 && b[0] == 0 { 1201 b = b[1:] 1202 } 1203 b2 := new(BigInt).SetBytes(b).Bytes() 1204 return bytes.Equal(b, b2) 1205 } 1206 1207 func TestBigIntBytes(t *testing.T) { 1208 if err := quick.Check(checkBytes, nil); err != nil { 1209 t.Error(err) 1210 } 1211 } 1212 1213 func checkQuo(x, y []byte) bool { 1214 u := new(BigInt).SetBytes(x) 1215 v := new(BigInt).SetBytes(y) 1216 1217 var tmp1 big.Int 1218 if len(v.inner(&tmp1).Bits()) == 0 { 1219 return true 1220 } 1221 1222 r := new(BigInt) 1223 q, r := new(BigInt).QuoRem(u, v, r) 1224 1225 if r.Cmp(v) >= 0 { 1226 return false 1227 } 1228 1229 uprime := new(BigInt).Set(q) 1230 uprime.Mul(uprime, v) 1231 uprime.Add(uprime, r) 1232 1233 return uprime.Cmp(u) == 0 1234 } 1235 1236 var quoTests = []struct { 1237 x, y string 1238 q, r string 1239 }{ 1240 { 1241 "476217953993950760840509444250624797097991362735329973741718102894495832294430498335824897858659711275234906400899559094370964723884706254265559534144986498357", 1242 "9353930466774385905609975137998169297361893554149986716853295022578535724979483772383667534691121982974895531435241089241440253066816724367338287092081996", 1243 "50911", 1244 "1", 1245 }, 1246 { 1247 "11510768301994997771168", 1248 "1328165573307167369775", 1249 "8", 1250 "885443715537658812968", 1251 }, 1252 } 1253 1254 func TestBigIntQuo(t *testing.T) { 1255 if err := quick.Check(checkQuo, nil); err != nil { 1256 t.Error(err) 1257 } 1258 1259 for i, test := range quoTests { 1260 x, _ := new(BigInt).SetString(test.x, 10) 1261 y, _ := new(BigInt).SetString(test.y, 10) 1262 expectedQ, _ := new(BigInt).SetString(test.q, 10) 1263 expectedR, _ := new(BigInt).SetString(test.r, 10) 1264 1265 r := new(BigInt) 1266 q, r := new(BigInt).QuoRem(x, y, r) 1267 1268 if q.Cmp(expectedQ) != 0 || r.Cmp(expectedR) != 0 { 1269 t.Errorf("#%d got (%s, %s) want (%s, %s)", i, q, r, expectedQ, expectedR) 1270 } 1271 } 1272 } 1273 1274 var bitLenTests = []struct { 1275 in string 1276 out int 1277 }{ 1278 {"-1", 1}, 1279 {"0", 0}, 1280 {"1", 1}, 1281 {"2", 2}, 1282 {"4", 3}, 1283 {"0xabc", 12}, 1284 {"0x8000", 16}, 1285 {"0x80000000", 32}, 1286 {"0x800000000000", 48}, 1287 {"0x8000000000000000", 64}, 1288 {"0x80000000000000000000", 80}, 1289 {"-0x4000000000000000000000", 87}, 1290 } 1291 1292 func TestBigIntBitLen(t *testing.T) { 1293 for i, test := range bitLenTests { 1294 x, ok := new(BigInt).SetString(test.in, 0) 1295 if !ok { 1296 t.Errorf("#%d test input invalid: %s", i, test.in) 1297 continue 1298 } 1299 1300 if n := x.BitLen(); n != test.out { 1301 t.Errorf("#%d got %d want %d", i, n, test.out) 1302 } 1303 } 1304 } 1305 1306 var expTests = []struct { 1307 x, y, m string 1308 out string 1309 }{ 1310 // y <= 0 1311 {"0", "0", "", "1"}, 1312 {"1", "0", "", "1"}, 1313 {"-10", "0", "", "1"}, 1314 {"1234", "-1", "", "1"}, 1315 {"1234", "-1", "0", "1"}, 1316 {"17", "-100", "1234", "865"}, 1317 {"2", "-100", "1234", ""}, 1318 1319 // m == 1 1320 {"0", "0", "1", "0"}, 1321 {"1", "0", "1", "0"}, 1322 {"-10", "0", "1", "0"}, 1323 {"1234", "-1", "1", "0"}, 1324 1325 // misc 1326 {"5", "1", "3", "2"}, 1327 {"5", "-7", "", "1"}, 1328 {"-5", "-7", "", "1"}, 1329 {"5", "0", "", "1"}, 1330 {"-5", "0", "", "1"}, 1331 {"5", "1", "", "5"}, 1332 {"-5", "1", "", "-5"}, 1333 {"-5", "1", "7", "2"}, 1334 {"-2", "3", "2", "0"}, 1335 {"5", "2", "", "25"}, 1336 {"1", "65537", "2", "1"}, 1337 {"0x8000000000000000", "2", "", "0x40000000000000000000000000000000"}, 1338 {"0x8000000000000000", "2", "6719", "4944"}, 1339 {"0x8000000000000000", "3", "6719", "5447"}, 1340 {"0x8000000000000000", "1000", "6719", "1603"}, 1341 {"0x8000000000000000", "1000000", "6719", "3199"}, 1342 {"0x8000000000000000", "-1000000", "6719", "3663"}, // 3663 = ModInverse(3199, 6719) Issue #25865 1343 1344 {"0xffffffffffffffffffffffffffffffff", "0x12345678123456781234567812345678123456789", "0x01112222333344445555666677778889", "0x36168FA1DB3AAE6C8CE647E137F97A"}, 1345 1346 { 1347 "2938462938472983472983659726349017249287491026512746239764525612965293865296239471239874193284792387498274256129746192347", 1348 "298472983472983471903246121093472394872319615612417471234712061", 1349 "29834729834729834729347290846729561262544958723956495615629569234729836259263598127342374289365912465901365498236492183464", 1350 "23537740700184054162508175125554701713153216681790245129157191391322321508055833908509185839069455749219131480588829346291", 1351 }, 1352 // test case for issue 8822 1353 { 1354 "11001289118363089646017359372117963499250546375269047542777928006103246876688756735760905680604646624353196869572752623285140408755420374049317646428185270079555372763503115646054602867593662923894140940837479507194934267532831694565516466765025434902348314525627418515646588160955862839022051353653052947073136084780742729727874803457643848197499548297570026926927502505634297079527299004267769780768565695459945235586892627059178884998772989397505061206395455591503771677500931269477503508150175717121828518985901959919560700853226255420793148986854391552859459511723547532575574664944815966793196961286234040892865", 1355 "0xB08FFB20760FFED58FADA86DFEF71AD72AA0FA763219618FE022C197E54708BB1191C66470250FCE8879487507CEE41381CA4D932F81C2B3F1AB20B539D50DCD", 1356 "0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73", 1357 "21484252197776302499639938883777710321993113097987201050501182909581359357618579566746556372589385361683610524730509041328855066514963385522570894839035884713051640171474186548713546686476761306436434146475140156284389181808675016576845833340494848283681088886584219750554408060556769486628029028720727393293111678826356480455433909233520504112074401376133077150471237549474149190242010469539006449596611576612573955754349042329130631128234637924786466585703488460540228477440853493392086251021228087076124706778899179648655221663765993962724699135217212118535057766739392069738618682722216712319320435674779146070442", 1358 }, 1359 { 1360 "-0x1BCE04427D8032319A89E5C4136456671AC620883F2C4139E57F91307C485AD2D6204F4F87A58262652DB5DBBAC72B0613E51B835E7153BEC6068F5C8D696B74DBD18FEC316AEF73985CF0475663208EB46B4F17DD9DA55367B03323E5491A70997B90C059FB34809E6EE55BCFBD5F2F52233BFE62E6AA9E4E26A1D4C2439883D14F2633D55D8AA66A1ACD5595E778AC3A280517F1157989E70C1A437B849F1877B779CC3CDDEDE2DAA6594A6C66D181A00A5F777EE60596D8773998F6E988DEAE4CCA60E4DDCF9590543C89F74F603259FCAD71660D30294FBBE6490300F78A9D63FA660DC9417B8B9DDA28BEB3977B621B988E23D4D954F322C3540541BC649ABD504C50FADFD9F0987D58A2BF689313A285E773FF02899A6EF887D1D4A0D2", 1361 "0xB08FFB20760FFED58FADA86DFEF71AD72AA0FA763219618FE022C197E54708BB1191C66470250FCE8879487507CEE41381CA4D932F81C2B3F1AB20B539D50DCD", 1362 "0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73", 1363 "21484252197776302499639938883777710321993113097987201050501182909581359357618579566746556372589385361683610524730509041328855066514963385522570894839035884713051640171474186548713546686476761306436434146475140156284389181808675016576845833340494848283681088886584219750554408060556769486628029028720727393293111678826356480455433909233520504112074401376133077150471237549474149190242010469539006449596611576612573955754349042329130631128234637924786466585703488460540228477440853493392086251021228087076124706778899179648655221663765993962724699135217212118535057766739392069738618682722216712319320435674779146070442", 1364 }, 1365 1366 // test cases for issue 13907 1367 {"0xffffffff00000001", "0xffffffff00000001", "0xffffffff00000001", "0"}, 1368 {"0xffffffffffffffff00000001", "0xffffffffffffffff00000001", "0xffffffffffffffff00000001", "0"}, 1369 {"0xffffffffffffffffffffffff00000001", "0xffffffffffffffffffffffff00000001", "0xffffffffffffffffffffffff00000001", "0"}, 1370 {"0xffffffffffffffffffffffffffffffff00000001", "0xffffffffffffffffffffffffffffffff00000001", "0xffffffffffffffffffffffffffffffff00000001", "0"}, 1371 1372 { 1373 "2", 1374 "0xB08FFB20760FFED58FADA86DFEF71AD72AA0FA763219618FE022C197E54708BB1191C66470250FCE8879487507CEE41381CA4D932F81C2B3F1AB20B539D50DCD", 1375 "0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73", // odd 1376 "0x6AADD3E3E424D5B713FCAA8D8945B1E055166132038C57BBD2D51C833F0C5EA2007A2324CE514F8E8C2F008A2F36F44005A4039CB55830986F734C93DAF0EB4BAB54A6A8C7081864F44346E9BC6F0A3EB9F2C0146A00C6A05187D0C101E1F2D038CDB70CB5E9E05A2D188AB6CBB46286624D4415E7D4DBFAD3BCC6009D915C406EED38F468B940F41E6BEDC0430DD78E6F19A7DA3A27498A4181E24D738B0072D8F6ADB8C9809A5B033A09785814FD9919F6EF9F83EEA519BEC593855C4C10CBEEC582D4AE0792158823B0275E6AEC35242740468FAF3D5C60FD1E376362B6322F78B7ED0CA1C5BBCD2B49734A56C0967A1D01A100932C837B91D592CE08ABFF", 1377 }, 1378 { 1379 "2", 1380 "0xB08FFB20760FFED58FADA86DFEF71AD72AA0FA763219618FE022C197E54708BB1191C66470250FCE8879487507CEE41381CA4D932F81C2B3F1AB20B539D50DCD", 1381 "0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF72", // even 1382 "0x7858794B5897C29F4ED0B40913416AB6C48588484E6A45F2ED3E26C941D878E923575AAC434EE2750E6439A6976F9BB4D64CEDB2A53CE8D04DD48CADCDF8E46F22747C6B81C6CEA86C0D873FBF7CEF262BAAC43A522BD7F32F3CDAC52B9337C77B3DCFB3DB3EDD80476331E82F4B1DF8EFDC1220C92656DFC9197BDC1877804E28D928A2A284B8DED506CBA304435C9D0133C246C98A7D890D1DE60CBC53A024361DA83A9B8775019083D22AC6820ED7C3C68F8E801DD4EC779EE0A05C6EB682EF9840D285B838369BA7E148FA27691D524FAEAF7C6ECE2A4B99A294B9F2C241857B5B90CC8BFFCFCF18DFA7D676131D5CD3855A5A3E8EBFA0CDFADB4D198B4A", 1383 }, 1384 } 1385 1386 func TestBigIntExp(t *testing.T) { 1387 for i, test := range expTests { 1388 x, ok1 := new(BigInt).SetString(test.x, 0) 1389 y, ok2 := new(BigInt).SetString(test.y, 0) 1390 1391 var ok3, ok4 bool 1392 var out, m *BigInt 1393 1394 if len(test.out) == 0 { 1395 out, ok3 = nil, true 1396 } else { 1397 out, ok3 = new(BigInt).SetString(test.out, 0) 1398 } 1399 1400 if len(test.m) == 0 { 1401 m, ok4 = nil, true 1402 } else { 1403 m, ok4 = new(BigInt).SetString(test.m, 0) 1404 } 1405 1406 if !ok1 || !ok2 || !ok3 || !ok4 { 1407 t.Errorf("#%d: error in input", i) 1408 continue 1409 } 1410 1411 z1 := new(BigInt).Exp(x, y, m) 1412 if !(z1 == nil && out == nil || z1.Cmp(out) == 0) { 1413 t.Errorf("#%d: got %x want %x", i, z1, out) 1414 } 1415 1416 if m == nil { 1417 // The result should be the same as for m == 0; 1418 // specifically, there should be no div-zero panic. 1419 m = new(BigInt) // m != nil && len(m.abs) == 0 1420 z2 := new(BigInt).Exp(x, y, m) 1421 if z2.Cmp(z1) != 0 { 1422 t.Errorf("#%d: got %x want %x", i, z2, z1) 1423 } 1424 } 1425 } 1426 } 1427 1428 type intShiftTest struct { 1429 in string 1430 shift uint 1431 out string 1432 } 1433 1434 var rshTests = []intShiftTest{ 1435 {"0", 0, "0"}, 1436 {"-0", 0, "0"}, 1437 {"0", 1, "0"}, 1438 {"0", 2, "0"}, 1439 {"1", 0, "1"}, 1440 {"1", 1, "0"}, 1441 {"1", 2, "0"}, 1442 {"2", 0, "2"}, 1443 {"2", 1, "1"}, 1444 {"-1", 0, "-1"}, 1445 {"-1", 1, "-1"}, 1446 {"-1", 10, "-1"}, 1447 {"-100", 2, "-25"}, 1448 {"-100", 3, "-13"}, 1449 {"-100", 100, "-1"}, 1450 {"4294967296", 0, "4294967296"}, 1451 {"4294967296", 1, "2147483648"}, 1452 {"4294967296", 2, "1073741824"}, 1453 {"18446744073709551616", 0, "18446744073709551616"}, 1454 {"18446744073709551616", 1, "9223372036854775808"}, 1455 {"18446744073709551616", 2, "4611686018427387904"}, 1456 {"18446744073709551616", 64, "1"}, 1457 {"340282366920938463463374607431768211456", 64, "18446744073709551616"}, 1458 {"340282366920938463463374607431768211456", 128, "1"}, 1459 } 1460 1461 func TestBigIntRsh(t *testing.T) { 1462 for i, test := range rshTests { 1463 in, _ := new(BigInt).SetString(test.in, 10) 1464 expected, _ := new(BigInt).SetString(test.out, 10) 1465 out := new(BigInt).Rsh(in, test.shift) 1466 1467 if out.Cmp(expected) != 0 { 1468 t.Errorf("#%d: got %s want %s", i, out, expected) 1469 } 1470 } 1471 } 1472 1473 func TestBigIntRshSelf(t *testing.T) { 1474 for i, test := range rshTests { 1475 z, _ := new(BigInt).SetString(test.in, 10) 1476 expected, _ := new(BigInt).SetString(test.out, 10) 1477 z.Rsh(z, test.shift) 1478 1479 if z.Cmp(expected) != 0 { 1480 t.Errorf("#%d: got %s want %s", i, z, expected) 1481 } 1482 } 1483 } 1484 1485 var lshTests = []intShiftTest{ 1486 {"0", 0, "0"}, 1487 {"0", 1, "0"}, 1488 {"0", 2, "0"}, 1489 {"1", 0, "1"}, 1490 {"1", 1, "2"}, 1491 {"1", 2, "4"}, 1492 {"2", 0, "2"}, 1493 {"2", 1, "4"}, 1494 {"2", 2, "8"}, 1495 {"-87", 1, "-174"}, 1496 {"4294967296", 0, "4294967296"}, 1497 {"4294967296", 1, "8589934592"}, 1498 {"4294967296", 2, "17179869184"}, 1499 {"18446744073709551616", 0, "18446744073709551616"}, 1500 {"9223372036854775808", 1, "18446744073709551616"}, 1501 {"4611686018427387904", 2, "18446744073709551616"}, 1502 {"1", 64, "18446744073709551616"}, 1503 {"18446744073709551616", 64, "340282366920938463463374607431768211456"}, 1504 {"1", 128, "340282366920938463463374607431768211456"}, 1505 } 1506 1507 func TestBigIntLsh(t *testing.T) { 1508 for i, test := range lshTests { 1509 in, _ := new(BigInt).SetString(test.in, 10) 1510 expected, _ := new(BigInt).SetString(test.out, 10) 1511 out := new(BigInt).Lsh(in, test.shift) 1512 1513 if out.Cmp(expected) != 0 { 1514 t.Errorf("#%d: got %s want %s", i, out, expected) 1515 } 1516 } 1517 } 1518 1519 func TestBigIntLshSelf(t *testing.T) { 1520 for i, test := range lshTests { 1521 z, _ := new(BigInt).SetString(test.in, 10) 1522 expected, _ := new(BigInt).SetString(test.out, 10) 1523 z.Lsh(z, test.shift) 1524 1525 if z.Cmp(expected) != 0 { 1526 t.Errorf("#%d: got %s want %s", i, z, expected) 1527 } 1528 } 1529 } 1530 1531 func TestBigIntLshRsh(t *testing.T) { 1532 for i, test := range rshTests { 1533 in, _ := new(BigInt).SetString(test.in, 10) 1534 out := new(BigInt).Lsh(in, test.shift) 1535 out = out.Rsh(out, test.shift) 1536 1537 if in.Cmp(out) != 0 { 1538 t.Errorf("#%d: got %s want %s", i, out, in) 1539 } 1540 } 1541 for i, test := range lshTests { 1542 in, _ := new(BigInt).SetString(test.in, 10) 1543 out := new(BigInt).Lsh(in, test.shift) 1544 out.Rsh(out, test.shift) 1545 1546 if in.Cmp(out) != 0 { 1547 t.Errorf("#%d: got %s want %s", i, out, in) 1548 } 1549 } 1550 } 1551 1552 // Entries must be sorted by value in ascending order. 1553 var cmpAbsTests = []string{ 1554 "0", 1555 "1", 1556 "2", 1557 "10", 1558 "10000000", 1559 "2783678367462374683678456387645876387564783686583485", 1560 "2783678367462374683678456387645876387564783686583486", 1561 "32957394867987420967976567076075976570670947609750670956097509670576075067076027578341538", 1562 } 1563 1564 func TestBigIntCmpAbs(t *testing.T) { 1565 values := make([]*BigInt, len(cmpAbsTests)) 1566 var prev *BigInt 1567 for i, s := range cmpAbsTests { 1568 x, ok := new(BigInt).SetString(s, 0) 1569 if !ok { 1570 t.Fatalf("SetString(%s, 0) failed", s) 1571 } 1572 if prev != nil && prev.Cmp(x) >= 0 { 1573 t.Fatal("cmpAbsTests entries not sorted in ascending order") 1574 } 1575 values[i] = x 1576 prev = x 1577 } 1578 1579 for i, x := range values { 1580 for j, y := range values { 1581 // try all combinations of signs for x, y 1582 for k := 0; k < 4; k++ { 1583 var a, b BigInt 1584 a.Set(x) 1585 b.Set(y) 1586 if k&1 != 0 { 1587 a.Neg(&a) 1588 } 1589 if k&2 != 0 { 1590 b.Neg(&b) 1591 } 1592 1593 got := a.CmpAbs(&b) 1594 want := 0 1595 switch { 1596 case i > j: 1597 want = 1 1598 case i < j: 1599 want = -1 1600 } 1601 if got != want { 1602 t.Errorf("absCmp |%s|, |%s|: got %d; want %d", &a, &b, got, want) 1603 } 1604 } 1605 } 1606 } 1607 } 1608 1609 func TestBigIntCmpSelf(t *testing.T) { 1610 for _, s := range cmpAbsTests { 1611 x, ok := new(BigInt).SetString(s, 0) 1612 if !ok { 1613 t.Fatalf("SetString(%s, 0) failed", s) 1614 } 1615 got := x.Cmp(x) 1616 want := 0 1617 if got != want { 1618 t.Errorf("x = %s: x.Cmp(x): got %d; want %d", x, got, want) 1619 } 1620 } 1621 } 1622 1623 var int64Tests = []string{ 1624 // int64 1625 "0", 1626 "1", 1627 "-1", 1628 "4294967295", 1629 "-4294967295", 1630 "4294967296", 1631 "-4294967296", 1632 "9223372036854775807", 1633 "-9223372036854775807", 1634 "-9223372036854775808", 1635 1636 // not int64 1637 "0x8000000000000000", 1638 "-0x8000000000000001", 1639 "38579843757496759476987459679745", 1640 "-38579843757496759476987459679745", 1641 } 1642 1643 func TestBigInt64(t *testing.T) { 1644 for _, s := range int64Tests { 1645 var x BigInt 1646 _, ok := x.SetString(s, 0) 1647 if !ok { 1648 t.Errorf("SetString(%s, 0) failed", s) 1649 continue 1650 } 1651 1652 want, err := strconv.ParseInt(s, 0, 64) 1653 if err != nil { 1654 if err.(*strconv.NumError).Err == strconv.ErrRange { 1655 if x.IsInt64() { 1656 t.Errorf("IsInt64(%s) succeeded unexpectedly", s) 1657 } 1658 } else { 1659 t.Errorf("ParseInt(%s) failed", s) 1660 } 1661 continue 1662 } 1663 1664 if !x.IsInt64() { 1665 t.Errorf("IsInt64(%s) failed unexpectedly", s) 1666 } 1667 1668 got := x.Int64() 1669 if got != want { 1670 t.Errorf("Int64(%s) = %d; want %d", s, got, want) 1671 } 1672 } 1673 } 1674 1675 var uint64Tests = []string{ 1676 // uint64 1677 "0", 1678 "1", 1679 "4294967295", 1680 "4294967296", 1681 "8589934591", 1682 "8589934592", 1683 "9223372036854775807", 1684 "9223372036854775808", 1685 "0x08000000000000000", 1686 1687 // not uint64 1688 "0x10000000000000000", 1689 "-0x08000000000000000", 1690 "-1", 1691 } 1692 1693 func TestBigIntUint64(t *testing.T) { 1694 for _, s := range uint64Tests { 1695 var x BigInt 1696 _, ok := x.SetString(s, 0) 1697 if !ok { 1698 t.Errorf("SetString(%s, 0) failed", s) 1699 continue 1700 } 1701 1702 want, err := strconv.ParseUint(s, 0, 64) 1703 if err != nil { 1704 // check for sign explicitly (ErrRange doesn't cover signed input) 1705 if s[0] == '-' || err.(*strconv.NumError).Err == strconv.ErrRange { 1706 if x.IsUint64() { 1707 t.Errorf("IsUint64(%s) succeeded unexpectedly", s) 1708 } 1709 } else { 1710 t.Errorf("ParseUint(%s) failed", s) 1711 } 1712 continue 1713 } 1714 1715 if !x.IsUint64() { 1716 t.Errorf("IsUint64(%s) failed unexpectedly", s) 1717 } 1718 1719 got := x.Uint64() 1720 if got != want { 1721 t.Errorf("Uint64(%s) = %d; want %d", s, got, want) 1722 } 1723 } 1724 } 1725 1726 var bitwiseTests = []struct { 1727 x, y string 1728 and, or, xor, andNot string 1729 }{ 1730 {"0x00", "0x00", "0x00", "0x00", "0x00", "0x00"}, 1731 {"0x00", "0x01", "0x00", "0x01", "0x01", "0x00"}, 1732 {"0x01", "0x00", "0x00", "0x01", "0x01", "0x01"}, 1733 {"-0x01", "0x00", "0x00", "-0x01", "-0x01", "-0x01"}, 1734 {"-0xaf", "-0x50", "-0xf0", "-0x0f", "0xe1", "0x41"}, 1735 {"0x00", "-0x01", "0x00", "-0x01", "-0x01", "0x00"}, 1736 {"0x01", "0x01", "0x01", "0x01", "0x00", "0x00"}, 1737 {"-0x01", "-0x01", "-0x01", "-0x01", "0x00", "0x00"}, 1738 {"0x07", "0x08", "0x00", "0x0f", "0x0f", "0x07"}, 1739 {"0x05", "0x0f", "0x05", "0x0f", "0x0a", "0x00"}, 1740 {"0xff", "-0x0a", "0xf6", "-0x01", "-0xf7", "0x09"}, 1741 {"0x013ff6", "0x9a4e", "0x1a46", "0x01bffe", "0x01a5b8", "0x0125b0"}, 1742 {"-0x013ff6", "0x9a4e", "0x800a", "-0x0125b2", "-0x01a5bc", "-0x01c000"}, 1743 {"-0x013ff6", "-0x9a4e", "-0x01bffe", "-0x1a46", "0x01a5b8", "0x8008"}, 1744 { 1745 "0x1000009dc6e3d9822cba04129bcbe3401", 1746 "0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd", 1747 "0x1000001186210100001000009048c2001", 1748 "0xb9bd7d543685789d57cb918e8bfeff7fddb2ebe87dfbbdfe35fd", 1749 "0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fc", 1750 "0x8c40c2d8822caa04120b8321400", 1751 }, 1752 { 1753 "0x1000009dc6e3d9822cba04129bcbe3401", 1754 "-0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd", 1755 "0x8c40c2d8822caa04120b8321401", 1756 "-0xb9bd7d543685789d57ca918e82229142459020483cd2014001fd", 1757 "-0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fe", 1758 "0x1000001186210100001000009048c2000", 1759 }, 1760 { 1761 "-0x1000009dc6e3d9822cba04129bcbe3401", 1762 "-0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd", 1763 "-0xb9bd7d543685789d57cb918e8bfeff7fddb2ebe87dfbbdfe35fd", 1764 "-0x1000001186210100001000009048c2001", 1765 "0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fc", 1766 "0xb9bd7d543685789d57ca918e82229142459020483cd2014001fc", 1767 }, 1768 } 1769 1770 type bitFun func(z, x, y *BigInt) *BigInt 1771 1772 func testBitFun(t *testing.T, msg string, f bitFun, x, y *BigInt, exp string) { 1773 expected := new(BigInt) 1774 expected.SetString(exp, 0) 1775 1776 out := f(new(BigInt), x, y) 1777 if out.Cmp(expected) != 0 { 1778 t.Errorf("%s: got %s want %s", msg, out, expected) 1779 } 1780 } 1781 1782 func testBitFunSelf(t *testing.T, msg string, f bitFun, x, y *BigInt, exp string) { 1783 self := new(BigInt) 1784 self.Set(x) 1785 expected := new(BigInt) 1786 expected.SetString(exp, 0) 1787 1788 self = f(self, self, y) 1789 if self.Cmp(expected) != 0 { 1790 t.Errorf("%s: got %s want %s", msg, self, expected) 1791 } 1792 } 1793 1794 func altBit(x *BigInt, i int) uint { 1795 z := new(BigInt).Rsh(x, uint(i)) 1796 z = z.And(z, NewBigInt(1)) 1797 if z.Cmp(new(BigInt)) != 0 { 1798 return 1 1799 } 1800 return 0 1801 } 1802 1803 func altSetBit(z *BigInt, x *BigInt, i int, b uint) *BigInt { 1804 one := NewBigInt(1) 1805 m := one.Lsh(one, uint(i)) 1806 switch b { 1807 case 1: 1808 return z.Or(x, m) 1809 case 0: 1810 return z.AndNot(x, m) 1811 } 1812 panic("set bit is not 0 or 1") 1813 } 1814 1815 func testBitset(t *testing.T, x *BigInt) { 1816 n := x.BitLen() 1817 z := new(BigInt).Set(x) 1818 z1 := new(BigInt).Set(x) 1819 for i := 0; i < n+10; i++ { 1820 old := z.Bit(i) 1821 old1 := altBit(z1, i) 1822 if old != old1 { 1823 t.Errorf("bitset: inconsistent value for Bit(%s, %d), got %v want %v", z1, i, old, old1) 1824 } 1825 z := new(BigInt).SetBit(z, i, 1) 1826 z1 := altSetBit(new(BigInt), z1, i, 1) 1827 if z.Bit(i) == 0 { 1828 t.Errorf("bitset: bit %d of %s got 0 want 1", i, x) 1829 } 1830 if z.Cmp(z1) != 0 { 1831 t.Errorf("bitset: inconsistent value after SetBit 1, got %s want %s", z, z1) 1832 } 1833 z.SetBit(z, i, 0) 1834 altSetBit(z1, z1, i, 0) 1835 if z.Bit(i) != 0 { 1836 t.Errorf("bitset: bit %d of %s got 1 want 0", i, x) 1837 } 1838 if z.Cmp(z1) != 0 { 1839 t.Errorf("bitset: inconsistent value after SetBit 0, got %s want %s", z, z1) 1840 } 1841 altSetBit(z1, z1, i, old) 1842 z.SetBit(z, i, old) 1843 if z.Cmp(z1) != 0 { 1844 t.Errorf("bitset: inconsistent value after SetBit old, got %s want %s", z, z1) 1845 } 1846 } 1847 if z.Cmp(x) != 0 { 1848 t.Errorf("bitset: got %s want %s", z, x) 1849 } 1850 } 1851 1852 var bitsetTests = []struct { 1853 x string 1854 i int 1855 b uint 1856 }{ 1857 {"0", 0, 0}, 1858 {"0", 200, 0}, 1859 {"1", 0, 1}, 1860 {"1", 1, 0}, 1861 {"-1", 0, 1}, 1862 {"-1", 200, 1}, 1863 {"0x2000000000000000000000000000", 108, 0}, 1864 {"0x2000000000000000000000000000", 109, 1}, 1865 {"0x2000000000000000000000000000", 110, 0}, 1866 {"-0x2000000000000000000000000001", 108, 1}, 1867 {"-0x2000000000000000000000000001", 109, 0}, 1868 {"-0x2000000000000000000000000001", 110, 1}, 1869 } 1870 1871 func TestBigIntBitSet(t *testing.T) { 1872 for _, test := range bitwiseTests { 1873 x := new(BigInt) 1874 x.SetString(test.x, 0) 1875 testBitset(t, x) 1876 x = new(BigInt) 1877 x.SetString(test.y, 0) 1878 testBitset(t, x) 1879 } 1880 for i, test := range bitsetTests { 1881 x := new(BigInt) 1882 x.SetString(test.x, 0) 1883 b := x.Bit(test.i) 1884 if b != test.b { 1885 t.Errorf("#%d got %v want %v", i, b, test.b) 1886 } 1887 } 1888 z := NewBigInt(1) 1889 z.SetBit(NewBigInt(0), 2, 1) 1890 if z.Cmp(NewBigInt(4)) != 0 { 1891 t.Errorf("destination leaked into result; got %s want 4", z) 1892 } 1893 } 1894 1895 var tzbTests = []struct { 1896 in string 1897 out uint 1898 }{ 1899 {"0", 0}, 1900 {"1", 0}, 1901 {"-1", 0}, 1902 {"4", 2}, 1903 {"-8", 3}, 1904 {"0x4000000000000000000", 74}, 1905 {"-0x8000000000000000000", 75}, 1906 } 1907 1908 func TestBigIntTrailingZeroBits(t *testing.T) { 1909 for i, test := range tzbTests { 1910 in, _ := new(BigInt).SetString(test.in, 0) 1911 want := test.out 1912 got := in.TrailingZeroBits() 1913 1914 if got != want { 1915 t.Errorf("#%d: got %v want %v", i, got, want) 1916 } 1917 } 1918 } 1919 1920 func TestBigIntBitwise(t *testing.T) { 1921 x := new(BigInt) 1922 y := new(BigInt) 1923 for _, test := range bitwiseTests { 1924 x.SetString(test.x, 0) 1925 y.SetString(test.y, 0) 1926 1927 testBitFun(t, "and", (*BigInt).And, x, y, test.and) 1928 testBitFunSelf(t, "and", (*BigInt).And, x, y, test.and) 1929 testBitFun(t, "andNot", (*BigInt).AndNot, x, y, test.andNot) 1930 testBitFunSelf(t, "andNot", (*BigInt).AndNot, x, y, test.andNot) 1931 testBitFun(t, "or", (*BigInt).Or, x, y, test.or) 1932 testBitFunSelf(t, "or", (*BigInt).Or, x, y, test.or) 1933 testBitFun(t, "xor", (*BigInt).Xor, x, y, test.xor) 1934 testBitFunSelf(t, "xor", (*BigInt).Xor, x, y, test.xor) 1935 } 1936 } 1937 1938 var notTests = []struct { 1939 in string 1940 out string 1941 }{ 1942 {"0", "-1"}, 1943 {"1", "-2"}, 1944 {"7", "-8"}, 1945 {"0", "-1"}, 1946 {"-81910", "81909"}, 1947 { 1948 "298472983472983471903246121093472394872319615612417471234712061", 1949 "-298472983472983471903246121093472394872319615612417471234712062", 1950 }, 1951 } 1952 1953 func TestBigIntNot(t *testing.T) { 1954 in := new(BigInt) 1955 out := new(BigInt) 1956 expected := new(BigInt) 1957 for i, test := range notTests { 1958 in.SetString(test.in, 10) 1959 expected.SetString(test.out, 10) 1960 out = out.Not(in) 1961 if out.Cmp(expected) != 0 { 1962 t.Errorf("#%d: got %s want %s", i, out, expected) 1963 } 1964 out = out.Not(out) 1965 if out.Cmp(in) != 0 { 1966 t.Errorf("#%d: got %s want %s", i, out, in) 1967 } 1968 } 1969 } 1970 1971 var modInverseTests = []struct { 1972 element string 1973 modulus string 1974 }{ 1975 {"1234567", "458948883992"}, 1976 {"239487239847", "2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919"}, 1977 {"-10", "13"}, // issue #16984 1978 {"10", "-13"}, 1979 {"-17", "-13"}, 1980 } 1981 1982 func TestBigIntModInverse(t *testing.T) { 1983 var element, modulus, gcd, inverse BigInt 1984 one := NewBigInt(1) 1985 for _, test := range modInverseTests { 1986 (&element).SetString(test.element, 10) 1987 (&modulus).SetString(test.modulus, 10) 1988 (&inverse).ModInverse(&element, &modulus) 1989 (&inverse).Mul(&inverse, &element) 1990 (&inverse).Mod(&inverse, &modulus) 1991 if (&inverse).Cmp(one) != 0 { 1992 t.Errorf("ModInverse(%d,%d)*%d%%%d=%d, not 1", &element, &modulus, &element, &modulus, &inverse) 1993 } 1994 } 1995 // exhaustive test for small values 1996 for n := 2; n < 100; n++ { 1997 (&modulus).SetInt64(int64(n)) 1998 for x := 1; x < n; x++ { 1999 (&element).SetInt64(int64(x)) 2000 (&gcd).GCD(nil, nil, &element, &modulus) 2001 if (&gcd).Cmp(one) != 0 { 2002 continue 2003 } 2004 (&inverse).ModInverse(&element, &modulus) 2005 (&inverse).Mul(&inverse, &element) 2006 (&inverse).Mod(&inverse, &modulus) 2007 if (&inverse).Cmp(one) != 0 { 2008 t.Errorf("ModInverse(%d,%d)*%d%%%d=%d, not 1", &element, &modulus, &element, &modulus, &inverse) 2009 } 2010 } 2011 } 2012 } 2013 2014 // testModSqrt is a helper for TestModSqrt, 2015 // which checks that ModSqrt can compute a square-root of elt^2. 2016 func testModSqrt(t *testing.T, elt, mod, sq, sqrt *BigInt) bool { 2017 var sqChk, sqrtChk, sqrtsq BigInt 2018 sq.Mul(elt, elt) 2019 sq.Mod(sq, mod) 2020 z := sqrt.ModSqrt(sq, mod) 2021 if z != sqrt { 2022 t.Errorf("ModSqrt returned wrong value %s", z) 2023 } 2024 2025 // test ModSqrt arguments outside the range [0,mod) 2026 sqChk.Add(sq, mod) 2027 z = sqrtChk.ModSqrt(&sqChk, mod) 2028 if z != &sqrtChk || z.Cmp(sqrt) != 0 { 2029 t.Errorf("ModSqrt returned inconsistent value %s", z) 2030 } 2031 sqChk.Sub(sq, mod) 2032 z = sqrtChk.ModSqrt(&sqChk, mod) 2033 if z != &sqrtChk || z.Cmp(sqrt) != 0 { 2034 t.Errorf("ModSqrt returned inconsistent value %s", z) 2035 } 2036 2037 // test x aliasing z 2038 z = sqrtChk.ModSqrt(sqrtChk.Set(sq), mod) 2039 if z != &sqrtChk || z.Cmp(sqrt) != 0 { 2040 t.Errorf("ModSqrt returned inconsistent value %s", z) 2041 } 2042 2043 // make sure we actually got a square root 2044 if sqrt.Cmp(elt) == 0 { 2045 return true // we found the "desired" square root 2046 } 2047 sqrtsq.Mul(sqrt, sqrt) // make sure we found the "other" one 2048 sqrtsq.Mod(&sqrtsq, mod) 2049 return sq.Cmp(&sqrtsq) == 0 2050 } 2051 2052 var primes = []string{ 2053 "2", 2054 "3", 2055 "5", 2056 "7", 2057 "11", 2058 2059 "13756265695458089029", 2060 "13496181268022124907", 2061 "10953742525620032441", 2062 "17908251027575790097", 2063 2064 // https://golang.org/issue/638 2065 "18699199384836356663", 2066 2067 "98920366548084643601728869055592650835572950932266967461790948584315647051443", 2068 "94560208308847015747498523884063394671606671904944666360068158221458669711639", 2069 2070 // https://primes.utm.edu/lists/small/small3.html 2071 "449417999055441493994709297093108513015373787049558499205492347871729927573118262811508386655998299074566974373711472560655026288668094291699357843464363003144674940345912431129144354948751003607115263071543163", 2072 "230975859993204150666423538988557839555560243929065415434980904258310530753006723857139742334640122533598517597674807096648905501653461687601339782814316124971547968912893214002992086353183070342498989426570593", 2073 "5521712099665906221540423207019333379125265462121169655563495403888449493493629943498064604536961775110765377745550377067893607246020694972959780839151452457728855382113555867743022746090187341871655890805971735385789993", 2074 "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123", 2075 2076 // ECC primes: https://tools.ietf.org/html/draft-ladd-safecurves-02 2077 "3618502788666131106986593281521497120414687020801267626233049500247285301239", // Curve1174: 2^251-9 2078 "57896044618658097711785492504343953926634992332820282019728792003956564819949", // Curve25519: 2^255-19 2079 "9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576599", // E-382: 2^382-105 2080 "42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472367", // Curve41417: 2^414-17 2081 "6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", // E-521: 2^521-1 2082 } 2083 2084 func TestBigIntModSqrt(t *testing.T) { 2085 var elt, mod, modx4, sq, sqrt BigInt 2086 r := rand.New(rand.NewSource(9)) 2087 for i, s := range primes[1:] { // skip 2, use only odd primes 2088 mod.SetString(s, 10) 2089 modx4.Lsh(&mod, 2) 2090 2091 // test a few random elements per prime 2092 for x := 1; x < 5; x++ { 2093 elt.Rand(r, &modx4) 2094 elt.Sub(&elt, &mod) // test range [-mod, 3*mod) 2095 if !testModSqrt(t, &elt, &mod, &sq, &sqrt) { 2096 t.Errorf("#%d: failed (sqrt(e) = %s)", i, &sqrt) 2097 } 2098 } 2099 2100 if testing.Short() && i > 2 { 2101 break 2102 } 2103 } 2104 2105 if testing.Short() { 2106 return 2107 } 2108 2109 // exhaustive test for small values 2110 for n := 3; n < 100; n++ { 2111 mod.SetInt64(int64(n)) 2112 if !mod.ProbablyPrime(10) { 2113 continue 2114 } 2115 isSquare := make([]bool, n) 2116 2117 // test all the squares 2118 for x := 1; x < n; x++ { 2119 elt.SetInt64(int64(x)) 2120 if !testModSqrt(t, &elt, &mod, &sq, &sqrt) { 2121 t.Errorf("#%d: failed (sqrt(%d,%d) = %s)", x, &elt, &mod, &sqrt) 2122 } 2123 isSquare[sq.Uint64()] = true 2124 } 2125 2126 // test all non-squares 2127 for x := 1; x < n; x++ { 2128 sq.SetInt64(int64(x)) 2129 z := sqrt.ModSqrt(&sq, &mod) 2130 if !isSquare[x] && z != nil { 2131 t.Errorf("#%d: failed (sqrt(%d,%d) = nil)", x, &sqrt, &mod) 2132 } 2133 } 2134 } 2135 } 2136 2137 func TestBigIntIssue2607(t *testing.T) { 2138 // This code sequence used to hang. 2139 n := NewBigInt(10) 2140 n.Rand(rand.New(rand.NewSource(9)), n) 2141 } 2142 2143 func TestBigIntSqrt(t *testing.T) { 2144 root := 0 2145 r := new(BigInt) 2146 for i := 0; i < 10000; i++ { 2147 if (root+1)*(root+1) <= i { 2148 root++ 2149 } 2150 n := NewBigInt(int64(i)) 2151 r.SetInt64(-2) 2152 r.Sqrt(n) 2153 if r.Cmp(NewBigInt(int64(root))) != 0 { 2154 t.Errorf("Sqrt(%v) = %v, want %v", n, r, root) 2155 } 2156 } 2157 2158 for i := 0; i < 1000; i += 10 { 2159 n, _ := new(BigInt).SetString("1"+strings.Repeat("0", i), 10) 2160 r := new(BigInt).Sqrt(n) 2161 root, _ := new(BigInt).SetString("1"+strings.Repeat("0", i/2), 10) 2162 if r.Cmp(root) != 0 { 2163 t.Errorf("Sqrt(1e%d) = %v, want 1e%d", i, r, i/2) 2164 } 2165 } 2166 2167 // Test aliasing. 2168 r.SetInt64(100) 2169 r.Sqrt(r) 2170 if r.Int64() != 10 { 2171 t.Errorf("Sqrt(100) = %v, want 10 (aliased output)", r.Int64()) 2172 } 2173 } 2174 2175 // We can't test this together with the other Exp tests above because 2176 // it requires a different receiver setup. 2177 func TestBigIntIssue22830(t *testing.T) { 2178 one := new(BigInt).SetInt64(1) 2179 base, _ := new(BigInt).SetString("84555555300000000000", 10) 2180 mod, _ := new(BigInt).SetString("66666670001111111111", 10) 2181 want, _ := new(BigInt).SetString("17888885298888888889", 10) 2182 2183 var tests = []int64{ 2184 0, 1, -1, 2185 } 2186 2187 for _, n := range tests { 2188 m := NewBigInt(n) 2189 if got := m.Exp(base, one, mod); got.Cmp(want) != 0 { 2190 t.Errorf("(%v).Exp(%s, 1, %s) = %s, want %s", n, base, mod, got, want) 2191 } 2192 } 2193 } 2194 2195 // 2196 // Tests from src/math/big/intconv_test.go 2197 // 2198 2199 var stringTests = []struct { 2200 in string 2201 out string 2202 base int 2203 val int64 2204 ok bool 2205 }{ 2206 // invalid inputs 2207 {in: ""}, 2208 {in: "a"}, 2209 {in: "z"}, 2210 {in: "+"}, 2211 {in: "-"}, 2212 {in: "0b"}, 2213 {in: "0o"}, 2214 {in: "0x"}, 2215 {in: "0y"}, 2216 {in: "2", base: 2}, 2217 {in: "0b2", base: 0}, 2218 {in: "08"}, 2219 {in: "8", base: 8}, 2220 {in: "0xg", base: 0}, 2221 {in: "g", base: 16}, 2222 2223 // invalid inputs with separators 2224 // (smoke tests only - a comprehensive set of tests is in natconv_test.go) 2225 {in: "_"}, 2226 {in: "0_"}, 2227 {in: "_0"}, 2228 {in: "-1__0"}, 2229 {in: "0x10_"}, 2230 {in: "1_000", base: 10}, // separators are not permitted for bases != 0 2231 {in: "d_e_a_d", base: 16}, 2232 2233 // valid inputs 2234 {"0", "0", 0, 0, true}, 2235 {"0", "0", 10, 0, true}, 2236 {"0", "0", 16, 0, true}, 2237 {"+0", "0", 0, 0, true}, 2238 {"-0", "0", 0, 0, true}, 2239 {"10", "10", 0, 10, true}, 2240 {"10", "10", 10, 10, true}, 2241 {"10", "10", 16, 16, true}, 2242 {"-10", "-10", 16, -16, true}, 2243 {"+10", "10", 16, 16, true}, 2244 {"0b10", "2", 0, 2, true}, 2245 {"0o10", "8", 0, 8, true}, 2246 {"0x10", "16", 0, 16, true}, 2247 {in: "0x10", base: 16}, 2248 {"-0x10", "-16", 0, -16, true}, 2249 {"+0x10", "16", 0, 16, true}, 2250 {"00", "0", 0, 0, true}, 2251 {"0", "0", 8, 0, true}, 2252 {"07", "7", 0, 7, true}, 2253 {"7", "7", 8, 7, true}, 2254 {"023", "19", 0, 19, true}, 2255 {"23", "23", 8, 19, true}, 2256 {"cafebabe", "cafebabe", 16, 0xcafebabe, true}, 2257 {"0b0", "0", 0, 0, true}, 2258 {"-111", "-111", 2, -7, true}, 2259 {"-0b111", "-7", 0, -7, true}, 2260 {"0b1001010111", "599", 0, 0x257, true}, 2261 {"1001010111", "1001010111", 2, 0x257, true}, 2262 {"A", "a", 36, 10, true}, 2263 {"A", "A", 37, 36, true}, 2264 {"ABCXYZ", "abcxyz", 36, 623741435, true}, 2265 {"ABCXYZ", "ABCXYZ", 62, 33536793425, true}, 2266 2267 // valid input with separators 2268 // (smoke tests only - a comprehensive set of tests is in natconv_test.go) 2269 {"1_000", "1000", 0, 1000, true}, 2270 {"0b_1010", "10", 0, 10, true}, 2271 {"+0o_660", "432", 0, 0660, true}, 2272 {"-0xF00D_1E", "-15731998", 0, -0xf00d1e, true}, 2273 } 2274 2275 func TestBigIntText(t *testing.T) { 2276 z := new(BigInt) 2277 for _, test := range stringTests { 2278 if !test.ok { 2279 continue 2280 } 2281 2282 _, ok := z.SetString(test.in, test.base) 2283 if !ok { 2284 t.Errorf("%v: failed to parse", test) 2285 continue 2286 } 2287 2288 base := test.base 2289 if base == 0 { 2290 base = 10 2291 } 2292 2293 if got := z.Text(base); got != test.out { 2294 t.Errorf("%v: got %s; want %s", test, got, test.out) 2295 } 2296 } 2297 } 2298 2299 func TestBigIntAppendText(t *testing.T) { 2300 z := new(BigInt) 2301 var buf []byte 2302 for _, test := range stringTests { 2303 if !test.ok { 2304 continue 2305 } 2306 2307 _, ok := z.SetString(test.in, test.base) 2308 if !ok { 2309 t.Errorf("%v: failed to parse", test) 2310 continue 2311 } 2312 2313 base := test.base 2314 if base == 0 { 2315 base = 10 2316 } 2317 2318 i := len(buf) 2319 buf = z.Append(buf, base) 2320 if got := string(buf[i:]); got != test.out { 2321 t.Errorf("%v: got %s; want %s", test, got, test.out) 2322 } 2323 } 2324 } 2325 2326 func TestBigIntGetString(t *testing.T) { 2327 format := func(base int) string { 2328 switch base { 2329 case 2: 2330 return "%b" 2331 case 8: 2332 return "%o" 2333 case 16: 2334 return "%x" 2335 } 2336 return "%d" 2337 } 2338 2339 z := new(BigInt) 2340 for i, test := range stringTests { 2341 if !test.ok { 2342 continue 2343 } 2344 z.SetInt64(test.val) 2345 2346 if test.base == 10 { 2347 if got := z.String(); got != test.out { 2348 t.Errorf("#%da got %s; want %s", i, got, test.out) 2349 } 2350 } 2351 2352 f := format(test.base) 2353 got := fmt.Sprintf(f, z) 2354 if f == "%d" { 2355 if got != fmt.Sprintf("%d", test.val) { 2356 t.Errorf("#%db got %s; want %d", i, got, test.val) 2357 } 2358 } else { 2359 if got != test.out { 2360 t.Errorf("#%dc got %s; want %s", i, got, test.out) 2361 } 2362 } 2363 } 2364 } 2365 2366 func TestBigIntSetString(t *testing.T) { 2367 tmp := new(BigInt) 2368 for i, test := range stringTests { 2369 // initialize to a non-zero value so that issues with parsing 2370 // 0 are detected 2371 tmp.SetInt64(1234567890) 2372 n1, ok1 := new(BigInt).SetString(test.in, test.base) 2373 n2, ok2 := tmp.SetString(test.in, test.base) 2374 expected := NewBigInt(test.val) 2375 if ok1 != test.ok || ok2 != test.ok { 2376 t.Errorf("#%d (input '%s') ok incorrect (should be %t)", i, test.in, test.ok) 2377 continue 2378 } 2379 if !ok1 { 2380 if n1 != nil { 2381 t.Errorf("#%d (input '%s') n1 != nil", i, test.in) 2382 } 2383 continue 2384 } 2385 if !ok2 { 2386 if n2 != nil { 2387 t.Errorf("#%d (input '%s') n2 != nil", i, test.in) 2388 } 2389 continue 2390 } 2391 2392 if n1.Cmp(expected) != 0 { 2393 t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n1, test.val) 2394 } 2395 if n2.Cmp(expected) != 0 { 2396 t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n2, test.val) 2397 } 2398 } 2399 } 2400 2401 var formatTests = []struct { 2402 input string 2403 format string 2404 output string 2405 }{ 2406 {"<nil>", "%x", "<nil>"}, 2407 {"<nil>", "%#x", "<nil>"}, 2408 {"<nil>", "%#y", "%!y(big.Int=<nil>)"}, 2409 2410 {"10", "%b", "1010"}, 2411 {"10", "%o", "12"}, 2412 {"10", "%d", "10"}, 2413 {"10", "%v", "10"}, 2414 {"10", "%x", "a"}, 2415 {"10", "%X", "A"}, 2416 {"-10", "%X", "-A"}, 2417 {"10", "%y", "%!y(big.Int=10)"}, 2418 {"-10", "%y", "%!y(big.Int=-10)"}, 2419 2420 {"10", "%#b", "0b1010"}, 2421 {"10", "%#o", "012"}, 2422 {"10", "%O", "0o12"}, 2423 {"-10", "%#b", "-0b1010"}, 2424 {"-10", "%#o", "-012"}, 2425 {"-10", "%O", "-0o12"}, 2426 {"10", "%#d", "10"}, 2427 {"10", "%#v", "10"}, 2428 {"10", "%#x", "0xa"}, 2429 {"10", "%#X", "0XA"}, 2430 {"-10", "%#X", "-0XA"}, 2431 {"10", "%#y", "%!y(big.Int=10)"}, 2432 {"-10", "%#y", "%!y(big.Int=-10)"}, 2433 2434 {"1234", "%d", "1234"}, 2435 {"1234", "%3d", "1234"}, 2436 {"1234", "%4d", "1234"}, 2437 {"-1234", "%d", "-1234"}, 2438 {"1234", "% 5d", " 1234"}, 2439 {"1234", "%+5d", "+1234"}, 2440 {"1234", "%-5d", "1234 "}, 2441 {"1234", "%x", "4d2"}, 2442 {"1234", "%X", "4D2"}, 2443 {"-1234", "%3x", "-4d2"}, 2444 {"-1234", "%4x", "-4d2"}, 2445 {"-1234", "%5x", " -4d2"}, 2446 {"-1234", "%-5x", "-4d2 "}, 2447 {"1234", "%03d", "1234"}, 2448 {"1234", "%04d", "1234"}, 2449 {"1234", "%05d", "01234"}, 2450 {"1234", "%06d", "001234"}, 2451 {"-1234", "%06d", "-01234"}, 2452 {"1234", "%+06d", "+01234"}, 2453 {"1234", "% 06d", " 01234"}, 2454 {"1234", "%-6d", "1234 "}, 2455 {"1234", "%-06d", "1234 "}, 2456 {"-1234", "%-06d", "-1234 "}, 2457 2458 {"1234", "%.3d", "1234"}, 2459 {"1234", "%.4d", "1234"}, 2460 {"1234", "%.5d", "01234"}, 2461 {"1234", "%.6d", "001234"}, 2462 {"-1234", "%.3d", "-1234"}, 2463 {"-1234", "%.4d", "-1234"}, 2464 {"-1234", "%.5d", "-01234"}, 2465 {"-1234", "%.6d", "-001234"}, 2466 2467 {"1234", "%8.3d", " 1234"}, 2468 {"1234", "%8.4d", " 1234"}, 2469 {"1234", "%8.5d", " 01234"}, 2470 {"1234", "%8.6d", " 001234"}, 2471 {"-1234", "%8.3d", " -1234"}, 2472 {"-1234", "%8.4d", " -1234"}, 2473 {"-1234", "%8.5d", " -01234"}, 2474 {"-1234", "%8.6d", " -001234"}, 2475 2476 {"1234", "%+8.3d", " +1234"}, 2477 {"1234", "%+8.4d", " +1234"}, 2478 {"1234", "%+8.5d", " +01234"}, 2479 {"1234", "%+8.6d", " +001234"}, 2480 {"-1234", "%+8.3d", " -1234"}, 2481 {"-1234", "%+8.4d", " -1234"}, 2482 {"-1234", "%+8.5d", " -01234"}, 2483 {"-1234", "%+8.6d", " -001234"}, 2484 2485 {"1234", "% 8.3d", " 1234"}, 2486 {"1234", "% 8.4d", " 1234"}, 2487 {"1234", "% 8.5d", " 01234"}, 2488 {"1234", "% 8.6d", " 001234"}, 2489 {"-1234", "% 8.3d", " -1234"}, 2490 {"-1234", "% 8.4d", " -1234"}, 2491 {"-1234", "% 8.5d", " -01234"}, 2492 {"-1234", "% 8.6d", " -001234"}, 2493 2494 {"1234", "%.3x", "4d2"}, 2495 {"1234", "%.4x", "04d2"}, 2496 {"1234", "%.5x", "004d2"}, 2497 {"1234", "%.6x", "0004d2"}, 2498 {"-1234", "%.3x", "-4d2"}, 2499 {"-1234", "%.4x", "-04d2"}, 2500 {"-1234", "%.5x", "-004d2"}, 2501 {"-1234", "%.6x", "-0004d2"}, 2502 2503 {"1234", "%8.3x", " 4d2"}, 2504 {"1234", "%8.4x", " 04d2"}, 2505 {"1234", "%8.5x", " 004d2"}, 2506 {"1234", "%8.6x", " 0004d2"}, 2507 {"-1234", "%8.3x", " -4d2"}, 2508 {"-1234", "%8.4x", " -04d2"}, 2509 {"-1234", "%8.5x", " -004d2"}, 2510 {"-1234", "%8.6x", " -0004d2"}, 2511 2512 {"1234", "%+8.3x", " +4d2"}, 2513 {"1234", "%+8.4x", " +04d2"}, 2514 {"1234", "%+8.5x", " +004d2"}, 2515 {"1234", "%+8.6x", " +0004d2"}, 2516 {"-1234", "%+8.3x", " -4d2"}, 2517 {"-1234", "%+8.4x", " -04d2"}, 2518 {"-1234", "%+8.5x", " -004d2"}, 2519 {"-1234", "%+8.6x", " -0004d2"}, 2520 2521 {"1234", "% 8.3x", " 4d2"}, 2522 {"1234", "% 8.4x", " 04d2"}, 2523 {"1234", "% 8.5x", " 004d2"}, 2524 {"1234", "% 8.6x", " 0004d2"}, 2525 {"1234", "% 8.7x", " 00004d2"}, 2526 {"1234", "% 8.8x", " 000004d2"}, 2527 {"-1234", "% 8.3x", " -4d2"}, 2528 {"-1234", "% 8.4x", " -04d2"}, 2529 {"-1234", "% 8.5x", " -004d2"}, 2530 {"-1234", "% 8.6x", " -0004d2"}, 2531 {"-1234", "% 8.7x", "-00004d2"}, 2532 {"-1234", "% 8.8x", "-000004d2"}, 2533 2534 {"1234", "%-8.3d", "1234 "}, 2535 {"1234", "%-8.4d", "1234 "}, 2536 {"1234", "%-8.5d", "01234 "}, 2537 {"1234", "%-8.6d", "001234 "}, 2538 {"1234", "%-8.7d", "0001234 "}, 2539 {"1234", "%-8.8d", "00001234"}, 2540 {"-1234", "%-8.3d", "-1234 "}, 2541 {"-1234", "%-8.4d", "-1234 "}, 2542 {"-1234", "%-8.5d", "-01234 "}, 2543 {"-1234", "%-8.6d", "-001234 "}, 2544 {"-1234", "%-8.7d", "-0001234"}, 2545 {"-1234", "%-8.8d", "-00001234"}, 2546 2547 {"16777215", "%b", "111111111111111111111111"}, // 2**24 - 1 2548 2549 {"0", "%.d", ""}, 2550 {"0", "%.0d", ""}, 2551 {"0", "%3.d", ""}, 2552 } 2553 2554 func TestBigIntFormat(t *testing.T) { 2555 for i, test := range formatTests { 2556 var x *BigInt 2557 if test.input != "<nil>" { 2558 var ok bool 2559 x, ok = new(BigInt).SetString(test.input, 0) 2560 if !ok { 2561 t.Errorf("#%d failed reading input %s", i, test.input) 2562 } 2563 } 2564 output := fmt.Sprintf(test.format, x) 2565 if output != test.output { 2566 t.Errorf("#%d got %q; want %q, {%q, %q, %q}", i, output, test.output, test.input, test.format, test.output) 2567 } 2568 } 2569 } 2570 2571 var scanTests = []struct { 2572 input string 2573 format string 2574 output string 2575 remaining int 2576 }{ 2577 {"1010", "%b", "10", 0}, 2578 {"0b1010", "%v", "10", 0}, 2579 {"12", "%o", "10", 0}, 2580 {"012", "%v", "10", 0}, 2581 {"10", "%d", "10", 0}, 2582 {"10", "%v", "10", 0}, 2583 {"a", "%x", "10", 0}, 2584 {"0xa", "%v", "10", 0}, 2585 {"A", "%X", "10", 0}, 2586 {"-A", "%X", "-10", 0}, 2587 {"+0b1011001", "%v", "89", 0}, 2588 {"0xA", "%v", "10", 0}, 2589 {"0 ", "%v", "0", 1}, 2590 {"2+3", "%v", "2", 2}, 2591 {"0XABC 12", "%v", "2748", 3}, 2592 } 2593 2594 func TestBigIntScan(t *testing.T) { 2595 var buf bytes.Buffer 2596 for i, test := range scanTests { 2597 x := new(BigInt) 2598 buf.Reset() 2599 buf.WriteString(test.input) 2600 if _, err := fmt.Fscanf(&buf, test.format, x); err != nil { 2601 t.Errorf("#%d error: %s", i, err) 2602 } 2603 if x.String() != test.output { 2604 t.Errorf("#%d got %s; want %s", i, x.String(), test.output) 2605 } 2606 if buf.Len() != test.remaining { 2607 t.Errorf("#%d got %d bytes remaining; want %d", i, buf.Len(), test.remaining) 2608 } 2609 } 2610 } 2611 2612 // 2613 // Tests from src/math/big/intmarsh_test.go 2614 // 2615 2616 var encodingTests = []string{ 2617 "0", 2618 "1", 2619 "2", 2620 "10", 2621 "1000", 2622 "1234567890", 2623 "298472983472983471903246121093472394872319615612417471234712061", 2624 } 2625 2626 func TestBigIntGobEncoding(t *testing.T) { 2627 var medium bytes.Buffer 2628 enc := gob.NewEncoder(&medium) 2629 dec := gob.NewDecoder(&medium) 2630 for _, test := range encodingTests { 2631 for _, sign := range []string{"", "+", "-"} { 2632 x := sign + test 2633 medium.Reset() // empty buffer for each test case (in case of failures) 2634 var tx BigInt 2635 tx.SetString(x, 10) 2636 if err := enc.Encode(&tx); err != nil { 2637 t.Errorf("encoding of %s failed: %s", &tx, err) 2638 continue 2639 } 2640 var rx BigInt 2641 if err := dec.Decode(&rx); err != nil { 2642 t.Errorf("decoding of %s failed: %s", &tx, err) 2643 continue 2644 } 2645 if rx.Cmp(&tx) != 0 { 2646 t.Errorf("transmission of %s failed: got %s want %s", &tx, &rx, &tx) 2647 } 2648 } 2649 } 2650 } 2651 2652 // Sending a nil BigInt pointer (inside a slice) on a round trip through gob should yield a zero. 2653 func TestBigIntGobEncodingNilIntInSlice(t *testing.T) { 2654 buf := new(bytes.Buffer) 2655 enc := gob.NewEncoder(buf) 2656 dec := gob.NewDecoder(buf) 2657 2658 var in = make([]*BigInt, 1) 2659 err := enc.Encode(&in) 2660 if err != nil { 2661 t.Errorf("gob encode failed: %q", err) 2662 } 2663 var out []*BigInt 2664 err = dec.Decode(&out) 2665 if err != nil { 2666 t.Fatalf("gob decode failed: %q", err) 2667 } 2668 if len(out) != 1 { 2669 t.Fatalf("wrong len; want 1 got %d", len(out)) 2670 } 2671 var zero BigInt 2672 if out[0].Cmp(&zero) != 0 { 2673 t.Fatalf("transmission of (*BigInt)(nil) failed: got %s want 0", out) 2674 } 2675 } 2676 2677 func TestBigIntJSONEncoding(t *testing.T) { 2678 for _, test := range encodingTests { 2679 for _, sign := range []string{"", "+", "-"} { 2680 x := sign + test 2681 var tx BigInt 2682 tx.SetString(x, 10) 2683 b, err := json.Marshal(&tx) 2684 if err != nil { 2685 t.Errorf("marshaling of %s failed: %s", &tx, err) 2686 continue 2687 } 2688 var rx BigInt 2689 if err := json.Unmarshal(b, &rx); err != nil { 2690 t.Errorf("unmarshaling of %s failed: %s", &tx, err) 2691 continue 2692 } 2693 if rx.Cmp(&tx) != 0 { 2694 t.Errorf("JSON encoding of %s failed: got %s want %s", &tx, &rx, &tx) 2695 } 2696 } 2697 } 2698 } 2699 2700 func TestBigIntXMLEncoding(t *testing.T) { 2701 for _, test := range encodingTests { 2702 for _, sign := range []string{"", "+", "-"} { 2703 x := sign + test 2704 var tx BigInt 2705 tx.SetString(x, 0) 2706 b, err := xml.Marshal(&tx) 2707 if err != nil { 2708 t.Errorf("marshaling of %s failed: %s", &tx, err) 2709 continue 2710 } 2711 var rx BigInt 2712 if err := xml.Unmarshal(b, &rx); err != nil { 2713 t.Errorf("unmarshaling of %s failed: %s", &tx, err) 2714 continue 2715 } 2716 if rx.Cmp(&tx) != 0 { 2717 t.Errorf("XML encoding of %s failed: got %s want %s", &tx, &rx, &tx) 2718 } 2719 } 2720 } 2721 } 2722 2723 // 2724 // Benchmarks from src/math/big/int_test.go 2725 // 2726 2727 func BenchmarkBigIntBinomial(b *testing.B) { 2728 var z BigInt 2729 for i := b.N - 1; i >= 0; i-- { 2730 z.Binomial(1000, 990) 2731 } 2732 } 2733 2734 func BenchmarkBigIntQuoRem(b *testing.B) { 2735 x, _ := new(BigInt).SetString("153980389784927331788354528594524332344709972855165340650588877572729725338415474372475094155672066328274535240275856844648695200875763869073572078279316458648124537905600131008790701752441155668003033945258023841165089852359980273279085783159654751552359397986180318708491098942831252291841441726305535546071", 0) 2736 y, _ := new(BigInt).SetString("7746362281539803897849273317883545285945243323447099728551653406505888775727297253384154743724750941556720663282745352402758568446486952008757638690735720782793164586481245379056001310087907017524411556680030339452580238411650898523599802732790857831596547515523593979861803187084910989428312522918414417263055355460715745539358014631136245887418412633787074173796862711588221766398229333338511838891484974940633857861775630560092874987828057333663969469797013996401149696897591265769095952887917296740109742927689053276850469671231961384715398038978492733178835452859452433234470997285516534065058887757272972533841547437247509415567206632827453524027585684464869520087576386907357207827931645864812453790560013100879070175244115566800303394525802384116508985235998027327908578315965475155235939798618031870849109894283125229184144172630553554607112725169432413343763989564437170644270643461665184965150423819594083121075825", 0) 2737 q := new(BigInt) 2738 r := new(BigInt) 2739 2740 b.ResetTimer() 2741 for i := 0; i < b.N; i++ { 2742 q.QuoRem(y, x, r) 2743 } 2744 } 2745 2746 func BenchmarkBigIntExp(b *testing.B) { 2747 x, _ := new(BigInt).SetString("11001289118363089646017359372117963499250546375269047542777928006103246876688756735760905680604646624353196869572752623285140408755420374049317646428185270079555372763503115646054602867593662923894140940837479507194934267532831694565516466765025434902348314525627418515646588160955862839022051353653052947073136084780742729727874803457643848197499548297570026926927502505634297079527299004267769780768565695459945235586892627059178884998772989397505061206395455591503771677500931269477503508150175717121828518985901959919560700853226255420793148986854391552859459511723547532575574664944815966793196961286234040892865", 0) 2748 y, _ := new(BigInt).SetString("0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF72", 0) 2749 n, _ := new(BigInt).SetString("0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73", 0) 2750 out := new(BigInt) 2751 for i := 0; i < b.N; i++ { 2752 out.Exp(x, y, n) 2753 } 2754 } 2755 2756 func BenchmarkBigIntExp2(b *testing.B) { 2757 x, _ := new(BigInt).SetString("2", 0) 2758 y, _ := new(BigInt).SetString("0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF72", 0) 2759 n, _ := new(BigInt).SetString("0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73", 0) 2760 out := new(BigInt) 2761 for i := 0; i < b.N; i++ { 2762 out.Exp(x, y, n) 2763 } 2764 } 2765 2766 func BenchmarkBigIntBitset(b *testing.B) { 2767 z := new(BigInt) 2768 z.SetBit(z, 512, 1) 2769 b.ResetTimer() 2770 b.StartTimer() 2771 for i := b.N - 1; i >= 0; i-- { 2772 z.SetBit(z, i&512, 1) 2773 } 2774 } 2775 2776 func BenchmarkBigIntBitsetNeg(b *testing.B) { 2777 z := NewBigInt(-1) 2778 z.SetBit(z, 512, 0) 2779 b.ResetTimer() 2780 b.StartTimer() 2781 for i := b.N - 1; i >= 0; i-- { 2782 z.SetBit(z, i&512, 0) 2783 } 2784 } 2785 2786 func BenchmarkBigIntBitsetOrig(b *testing.B) { 2787 z := new(BigInt) 2788 altSetBit(z, z, 512, 1) 2789 b.ResetTimer() 2790 b.StartTimer() 2791 for i := b.N - 1; i >= 0; i-- { 2792 altSetBit(z, z, i&512, 1) 2793 } 2794 } 2795 2796 func BenchmarkBigIntBitsetNegOrig(b *testing.B) { 2797 z := NewBigInt(-1) 2798 altSetBit(z, z, 512, 0) 2799 b.ResetTimer() 2800 b.StartTimer() 2801 for i := b.N - 1; i >= 0; i-- { 2802 altSetBit(z, z, i&512, 0) 2803 } 2804 } 2805 2806 func BenchmarkBigIntModInverse(b *testing.B) { 2807 p := new(BigInt).SetInt64(1) // Mersenne prime 2**1279 -1 2808 p.Lsh(p, 1279) 2809 p.Sub(p, bigOne) 2810 x := new(BigInt).Sub(p, bigOne) 2811 z := new(BigInt) 2812 for i := 0; i < b.N; i++ { 2813 z.ModInverse(x, p) 2814 } 2815 } 2816 2817 func BenchmarkBigIntSqrt(b *testing.B) { 2818 n, _ := new(BigInt).SetString("1"+strings.Repeat("0", 1001), 10) 2819 b.ResetTimer() 2820 t := new(BigInt) 2821 for i := 0; i < b.N; i++ { 2822 t.Sqrt(n) 2823 } 2824 } 2825 2826 // randBigInt returns a pseudo-random Int in the range [1<<(size-1), (1<<size) - 1]. 2827 func randBigInt(r *rand.Rand, size uint) *BigInt { 2828 n := new(BigInt).Lsh(bigOne, size-1) 2829 x := new(BigInt).Rand(r, n) 2830 return x.Add(x, n) // make sure result > 1<<(size-1) 2831 } 2832 2833 func benchmarkBigIntDiv(b *testing.B, aSize, bSize int) { 2834 var r = rand.New(rand.NewSource(1234)) 2835 aa := randBigInt(r, uint(aSize)) 2836 bb := randBigInt(r, uint(bSize)) 2837 if aa.Cmp(bb) < 0 { 2838 aa, bb = bb, aa 2839 } 2840 x := new(BigInt) 2841 y := new(BigInt) 2842 2843 b.ResetTimer() 2844 for i := 0; i < b.N; i++ { 2845 x.DivMod(aa, bb, y) 2846 } 2847 } 2848 2849 func BenchmarkBigIntDiv(b *testing.B) { 2850 sizes := []int{ 2851 10, 20, 50, 100, 200, 500, 1000, 2852 1e4, 1e5, 1e6, 1e7, 2853 } 2854 for _, i := range sizes { 2855 j := 2 * i 2856 b.Run(fmt.Sprintf("%d/%d", j, i), func(b *testing.B) { 2857 benchmarkBigIntDiv(b, j, i) 2858 }) 2859 } 2860 }