github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/math/big/int.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file implements signed multi-precision integers. 6 7 package big 8 9 import ( 10 "fmt" 11 "io" 12 "math/rand" 13 "strings" 14 ) 15 16 // An Int represents a signed multi-precision integer. 17 // The zero value for an Int represents the value 0. 18 // 19 // Operations always take pointer arguments (*Int) rather 20 // than Int values, and each unique Int value requires 21 // its own unique *Int pointer. To "copy" an Int value, 22 // an existing (or newly allocated) Int must be set to 23 // a new value using the Int.Set method; shallow copies 24 // of Ints are not supported and may lead to errors. 25 type Int struct { 26 neg bool // sign 27 abs nat // absolute value of the integer 28 } 29 30 var intOne = &Int{false, natOne} 31 32 // Sign returns: 33 // 34 // -1 if x < 0 35 // 0 if x == 0 36 // +1 if x > 0 37 // 38 func (x *Int) Sign() int { 39 if len(x.abs) == 0 { 40 return 0 41 } 42 if x.neg { 43 return -1 44 } 45 return 1 46 } 47 48 // SetInt64 sets z to x and returns z. 49 func (z *Int) SetInt64(x int64) *Int { 50 neg := false 51 if x < 0 { 52 neg = true 53 x = -x 54 } 55 z.abs = z.abs.setUint64(uint64(x)) 56 z.neg = neg 57 return z 58 } 59 60 // SetUint64 sets z to x and returns z. 61 func (z *Int) SetUint64(x uint64) *Int { 62 z.abs = z.abs.setUint64(x) 63 z.neg = false 64 return z 65 } 66 67 // NewInt allocates and returns a new Int set to x. 68 func NewInt(x int64) *Int { 69 return new(Int).SetInt64(x) 70 } 71 72 // Set sets z to x and returns z. 73 func (z *Int) Set(x *Int) *Int { 74 if z != x { 75 z.abs = z.abs.set(x.abs) 76 z.neg = x.neg 77 } 78 return z 79 } 80 81 // Bits provides raw (unchecked but fast) access to x by returning its 82 // absolute value as a little-endian Word slice. The result and x share 83 // the same underlying array. 84 // Bits is intended to support implementation of missing low-level Int 85 // functionality outside this package; it should be avoided otherwise. 86 func (x *Int) Bits() []Word { 87 return x.abs 88 } 89 90 // SetBits provides raw (unchecked but fast) access to z by setting its 91 // value to abs, interpreted as a little-endian Word slice, and returning 92 // z. The result and abs share the same underlying array. 93 // SetBits is intended to support implementation of missing low-level Int 94 // functionality outside this package; it should be avoided otherwise. 95 func (z *Int) SetBits(abs []Word) *Int { 96 z.abs = nat(abs).norm() 97 z.neg = false 98 return z 99 } 100 101 // Abs sets z to |x| (the absolute value of x) and returns z. 102 func (z *Int) Abs(x *Int) *Int { 103 z.Set(x) 104 z.neg = false 105 return z 106 } 107 108 // Neg sets z to -x and returns z. 109 func (z *Int) Neg(x *Int) *Int { 110 z.Set(x) 111 z.neg = len(z.abs) > 0 && !z.neg // 0 has no sign 112 return z 113 } 114 115 // Add sets z to the sum x+y and returns z. 116 func (z *Int) Add(x, y *Int) *Int { 117 neg := x.neg 118 if x.neg == y.neg { 119 // x + y == x + y 120 // (-x) + (-y) == -(x + y) 121 z.abs = z.abs.add(x.abs, y.abs) 122 } else { 123 // x + (-y) == x - y == -(y - x) 124 // (-x) + y == y - x == -(x - y) 125 if x.abs.cmp(y.abs) >= 0 { 126 z.abs = z.abs.sub(x.abs, y.abs) 127 } else { 128 neg = !neg 129 z.abs = z.abs.sub(y.abs, x.abs) 130 } 131 } 132 z.neg = len(z.abs) > 0 && neg // 0 has no sign 133 return z 134 } 135 136 // Sub sets z to the difference x-y and returns z. 137 func (z *Int) Sub(x, y *Int) *Int { 138 neg := x.neg 139 if x.neg != y.neg { 140 // x - (-y) == x + y 141 // (-x) - y == -(x + y) 142 z.abs = z.abs.add(x.abs, y.abs) 143 } else { 144 // x - y == x - y == -(y - x) 145 // (-x) - (-y) == y - x == -(x - y) 146 if x.abs.cmp(y.abs) >= 0 { 147 z.abs = z.abs.sub(x.abs, y.abs) 148 } else { 149 neg = !neg 150 z.abs = z.abs.sub(y.abs, x.abs) 151 } 152 } 153 z.neg = len(z.abs) > 0 && neg // 0 has no sign 154 return z 155 } 156 157 // Mul sets z to the product x*y and returns z. 158 func (z *Int) Mul(x, y *Int) *Int { 159 // x * y == x * y 160 // x * (-y) == -(x * y) 161 // (-x) * y == -(x * y) 162 // (-x) * (-y) == x * y 163 if x == y { 164 z.abs = z.abs.sqr(x.abs) 165 z.neg = false 166 return z 167 } 168 z.abs = z.abs.mul(x.abs, y.abs) 169 z.neg = len(z.abs) > 0 && x.neg != y.neg // 0 has no sign 170 return z 171 } 172 173 // MulRange sets z to the product of all integers 174 // in the range [a, b] inclusively and returns z. 175 // If a > b (empty range), the result is 1. 176 func (z *Int) MulRange(a, b int64) *Int { 177 switch { 178 case a > b: 179 return z.SetInt64(1) // empty range 180 case a <= 0 && b >= 0: 181 return z.SetInt64(0) // range includes 0 182 } 183 // a <= b && (b < 0 || a > 0) 184 185 neg := false 186 if a < 0 { 187 neg = (b-a)&1 == 0 188 a, b = -b, -a 189 } 190 191 z.abs = z.abs.mulRange(uint64(a), uint64(b)) 192 z.neg = neg 193 return z 194 } 195 196 // Binomial sets z to the binomial coefficient of (n, k) and returns z. 197 func (z *Int) Binomial(n, k int64) *Int { 198 // reduce the number of multiplications by reducing k 199 if n/2 < k && k <= n { 200 k = n - k // Binomial(n, k) == Binomial(n, n-k) 201 } 202 var a, b Int 203 a.MulRange(n-k+1, n) 204 b.MulRange(1, k) 205 return z.Quo(&a, &b) 206 } 207 208 // Quo sets z to the quotient x/y for y != 0 and returns z. 209 // If y == 0, a division-by-zero run-time panic occurs. 210 // Quo implements truncated division (like Go); see QuoRem for more details. 211 func (z *Int) Quo(x, y *Int) *Int { 212 z.abs, _ = z.abs.div(nil, x.abs, y.abs) 213 z.neg = len(z.abs) > 0 && x.neg != y.neg // 0 has no sign 214 return z 215 } 216 217 // Rem sets z to the remainder x%y for y != 0 and returns z. 218 // If y == 0, a division-by-zero run-time panic occurs. 219 // Rem implements truncated modulus (like Go); see QuoRem for more details. 220 func (z *Int) Rem(x, y *Int) *Int { 221 _, z.abs = nat(nil).div(z.abs, x.abs, y.abs) 222 z.neg = len(z.abs) > 0 && x.neg // 0 has no sign 223 return z 224 } 225 226 // QuoRem sets z to the quotient x/y and r to the remainder x%y 227 // and returns the pair (z, r) for y != 0. 228 // If y == 0, a division-by-zero run-time panic occurs. 229 // 230 // QuoRem implements T-division and modulus (like Go): 231 // 232 // q = x/y with the result truncated to zero 233 // r = x - y*q 234 // 235 // (See Daan Leijen, ``Division and Modulus for Computer Scientists''.) 236 // See DivMod for Euclidean division and modulus (unlike Go). 237 // 238 func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int) { 239 z.abs, r.abs = z.abs.div(r.abs, x.abs, y.abs) 240 z.neg, r.neg = len(z.abs) > 0 && x.neg != y.neg, len(r.abs) > 0 && x.neg // 0 has no sign 241 return z, r 242 } 243 244 // Div sets z to the quotient x/y for y != 0 and returns z. 245 // If y == 0, a division-by-zero run-time panic occurs. 246 // Div implements Euclidean division (unlike Go); see DivMod for more details. 247 func (z *Int) Div(x, y *Int) *Int { 248 y_neg := y.neg // z may be an alias for y 249 var r Int 250 z.QuoRem(x, y, &r) 251 if r.neg { 252 if y_neg { 253 z.Add(z, intOne) 254 } else { 255 z.Sub(z, intOne) 256 } 257 } 258 return z 259 } 260 261 // Mod sets z to the modulus x%y for y != 0 and returns z. 262 // If y == 0, a division-by-zero run-time panic occurs. 263 // Mod implements Euclidean modulus (unlike Go); see DivMod for more details. 264 func (z *Int) Mod(x, y *Int) *Int { 265 y0 := y // save y 266 if z == y || alias(z.abs, y.abs) { 267 y0 = new(Int).Set(y) 268 } 269 var q Int 270 q.QuoRem(x, y, z) 271 if z.neg { 272 if y0.neg { 273 z.Sub(z, y0) 274 } else { 275 z.Add(z, y0) 276 } 277 } 278 return z 279 } 280 281 // DivMod sets z to the quotient x div y and m to the modulus x mod y 282 // and returns the pair (z, m) for y != 0. 283 // If y == 0, a division-by-zero run-time panic occurs. 284 // 285 // DivMod implements Euclidean division and modulus (unlike Go): 286 // 287 // q = x div y such that 288 // m = x - y*q with 0 <= m < |y| 289 // 290 // (See Raymond T. Boute, ``The Euclidean definition of the functions 291 // div and mod''. ACM Transactions on Programming Languages and 292 // Systems (TOPLAS), 14(2):127-144, New York, NY, USA, 4/1992. 293 // ACM press.) 294 // See QuoRem for T-division and modulus (like Go). 295 // 296 func (z *Int) DivMod(x, y, m *Int) (*Int, *Int) { 297 y0 := y // save y 298 if z == y || alias(z.abs, y.abs) { 299 y0 = new(Int).Set(y) 300 } 301 z.QuoRem(x, y, m) 302 if m.neg { 303 if y0.neg { 304 z.Add(z, intOne) 305 m.Sub(m, y0) 306 } else { 307 z.Sub(z, intOne) 308 m.Add(m, y0) 309 } 310 } 311 return z, m 312 } 313 314 // Cmp compares x and y and returns: 315 // 316 // -1 if x < y 317 // 0 if x == y 318 // +1 if x > y 319 // 320 func (x *Int) Cmp(y *Int) (r int) { 321 // x cmp y == x cmp y 322 // x cmp (-y) == x 323 // (-x) cmp y == y 324 // (-x) cmp (-y) == -(x cmp y) 325 switch { 326 case x == y: 327 // nothing to do 328 case x.neg == y.neg: 329 r = x.abs.cmp(y.abs) 330 if x.neg { 331 r = -r 332 } 333 case x.neg: 334 r = -1 335 default: 336 r = 1 337 } 338 return 339 } 340 341 // CmpAbs compares the absolute values of x and y and returns: 342 // 343 // -1 if |x| < |y| 344 // 0 if |x| == |y| 345 // +1 if |x| > |y| 346 // 347 func (x *Int) CmpAbs(y *Int) int { 348 return x.abs.cmp(y.abs) 349 } 350 351 // low32 returns the least significant 32 bits of x. 352 func low32(x nat) uint32 { 353 if len(x) == 0 { 354 return 0 355 } 356 return uint32(x[0]) 357 } 358 359 // low64 returns the least significant 64 bits of x. 360 func low64(x nat) uint64 { 361 if len(x) == 0 { 362 return 0 363 } 364 v := uint64(x[0]) 365 if _W == 32 && len(x) > 1 { 366 return uint64(x[1])<<32 | v 367 } 368 return v 369 } 370 371 // Int64 returns the int64 representation of x. 372 // If x cannot be represented in an int64, the result is undefined. 373 func (x *Int) Int64() int64 { 374 v := int64(low64(x.abs)) 375 if x.neg { 376 v = -v 377 } 378 return v 379 } 380 381 // Uint64 returns the uint64 representation of x. 382 // If x cannot be represented in a uint64, the result is undefined. 383 func (x *Int) Uint64() uint64 { 384 return low64(x.abs) 385 } 386 387 // IsInt64 reports whether x can be represented as an int64. 388 func (x *Int) IsInt64() bool { 389 if len(x.abs) <= 64/_W { 390 w := int64(low64(x.abs)) 391 return w >= 0 || x.neg && w == -w 392 } 393 return false 394 } 395 396 // IsUint64 reports whether x can be represented as a uint64. 397 func (x *Int) IsUint64() bool { 398 return !x.neg && len(x.abs) <= 64/_W 399 } 400 401 // SetString sets z to the value of s, interpreted in the given base, 402 // and returns z and a boolean indicating success. The entire string 403 // (not just a prefix) must be valid for success. If SetString fails, 404 // the value of z is undefined but the returned value is nil. 405 // 406 // The base argument must be 0 or a value between 2 and MaxBase. 407 // For base 0, the number prefix determines the actual base: A prefix of 408 // ``0b'' or ``0B'' selects base 2, ``0'', ``0o'' or ``0O'' selects base 8, 409 // and ``0x'' or ``0X'' selects base 16. Otherwise, the selected base is 10 410 // and no prefix is accepted. 411 // 412 // For bases <= 36, lower and upper case letters are considered the same: 413 // The letters 'a' to 'z' and 'A' to 'Z' represent digit values 10 to 35. 414 // For bases > 36, the upper case letters 'A' to 'Z' represent the digit 415 // values 36 to 61. 416 // 417 // For base 0, an underscore character ``_'' may appear between a base 418 // prefix and an adjacent digit, and between successive digits; such 419 // underscores do not change the value of the number. 420 // Incorrect placement of underscores is reported as an error if there 421 // are no other errors. If base != 0, underscores are not recognized 422 // and act like any other character that is not a valid digit. 423 // 424 func (z *Int) SetString(s string, base int) (*Int, bool) { 425 return z.setFromScanner(strings.NewReader(s), base) 426 } 427 428 // setFromScanner implements SetString given an io.BytesScanner. 429 // For documentation see comments of SetString. 430 func (z *Int) setFromScanner(r io.ByteScanner, base int) (*Int, bool) { 431 if _, _, err := z.scan(r, base); err != nil { 432 return nil, false 433 } 434 // entire content must have been consumed 435 if _, err := r.ReadByte(); err != io.EOF { 436 return nil, false 437 } 438 return z, true // err == io.EOF => scan consumed all content of r 439 } 440 441 // SetBytes interprets buf as the bytes of a big-endian unsigned 442 // integer, sets z to that value, and returns z. 443 func (z *Int) SetBytes(buf []byte) *Int { 444 z.abs = z.abs.setBytes(buf) 445 z.neg = false 446 return z 447 } 448 449 // Bytes returns the absolute value of x as a big-endian byte slice. 450 // 451 // To use a fixed length slice, or a preallocated one, use FillBytes. 452 func (x *Int) Bytes() []byte { 453 buf := make([]byte, len(x.abs)*_S) 454 return buf[x.abs.bytes(buf):] 455 } 456 457 // FillBytes sets buf to the absolute value of x, storing it as a zero-extended 458 // big-endian byte slice, and returns buf. 459 // 460 // If the absolute value of x doesn't fit in buf, FillBytes will panic. 461 func (x *Int) FillBytes(buf []byte) []byte { 462 // Clear whole buffer. (This gets optimized into a memclr.) 463 for i := range buf { 464 buf[i] = 0 465 } 466 x.abs.bytes(buf) 467 return buf 468 } 469 470 // BitLen returns the length of the absolute value of x in bits. 471 // The bit length of 0 is 0. 472 func (x *Int) BitLen() int { 473 return x.abs.bitLen() 474 } 475 476 // TrailingZeroBits returns the number of consecutive least significant zero 477 // bits of |x|. 478 func (x *Int) TrailingZeroBits() uint { 479 return x.abs.trailingZeroBits() 480 } 481 482 // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z. 483 // If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. If m != 0, y < 0, 484 // and x and m are not relatively prime, z is unchanged and nil is returned. 485 // 486 // Modular exponentiation of inputs of a particular size is not a 487 // cryptographically constant-time operation. 488 func (z *Int) Exp(x, y, m *Int) *Int { 489 // See Knuth, volume 2, section 4.6.3. 490 xWords := x.abs 491 if y.neg { 492 if m == nil || len(m.abs) == 0 { 493 return z.SetInt64(1) 494 } 495 // for y < 0: x**y mod m == (x**(-1))**|y| mod m 496 inverse := new(Int).ModInverse(x, m) 497 if inverse == nil { 498 return nil 499 } 500 xWords = inverse.abs 501 } 502 yWords := y.abs 503 504 var mWords nat 505 if m != nil { 506 mWords = m.abs // m.abs may be nil for m == 0 507 } 508 509 z.abs = z.abs.expNN(xWords, yWords, mWords) 510 z.neg = len(z.abs) > 0 && x.neg && len(yWords) > 0 && yWords[0]&1 == 1 // 0 has no sign 511 if z.neg && len(mWords) > 0 { 512 // make modulus result positive 513 z.abs = z.abs.sub(mWords, z.abs) // z == x**y mod |m| && 0 <= z < |m| 514 z.neg = false 515 } 516 517 return z 518 } 519 520 // GCD sets z to the greatest common divisor of a and b and returns z. 521 // If x or y are not nil, GCD sets their value such that z = a*x + b*y. 522 // 523 // a and b may be positive, zero or negative. (Before Go 1.14 both had 524 // to be > 0.) Regardless of the signs of a and b, z is always >= 0. 525 // 526 // If a == b == 0, GCD sets z = x = y = 0. 527 // 528 // If a == 0 and b != 0, GCD sets z = |b|, x = 0, y = sign(b) * 1. 529 // 530 // If a != 0 and b == 0, GCD sets z = |a|, x = sign(a) * 1, y = 0. 531 func (z *Int) GCD(x, y, a, b *Int) *Int { 532 if len(a.abs) == 0 || len(b.abs) == 0 { 533 lenA, lenB, negA, negB := len(a.abs), len(b.abs), a.neg, b.neg 534 if lenA == 0 { 535 z.Set(b) 536 } else { 537 z.Set(a) 538 } 539 z.neg = false 540 if x != nil { 541 if lenA == 0 { 542 x.SetUint64(0) 543 } else { 544 x.SetUint64(1) 545 x.neg = negA 546 } 547 } 548 if y != nil { 549 if lenB == 0 { 550 y.SetUint64(0) 551 } else { 552 y.SetUint64(1) 553 y.neg = negB 554 } 555 } 556 return z 557 } 558 559 return z.lehmerGCD(x, y, a, b) 560 } 561 562 // lehmerSimulate attempts to simulate several Euclidean update steps 563 // using the leading digits of A and B. It returns u0, u1, v0, v1 564 // such that A and B can be updated as: 565 // A = u0*A + v0*B 566 // B = u1*A + v1*B 567 // Requirements: A >= B and len(B.abs) >= 2 568 // Since we are calculating with full words to avoid overflow, 569 // we use 'even' to track the sign of the cosequences. 570 // For even iterations: u0, v1 >= 0 && u1, v0 <= 0 571 // For odd iterations: u0, v1 <= 0 && u1, v0 >= 0 572 func lehmerSimulate(A, B *Int) (u0, u1, v0, v1 Word, even bool) { 573 // initialize the digits 574 var a1, a2, u2, v2 Word 575 576 m := len(B.abs) // m >= 2 577 n := len(A.abs) // n >= m >= 2 578 579 // extract the top Word of bits from A and B 580 h := nlz(A.abs[n-1]) 581 a1 = A.abs[n-1]<<h | A.abs[n-2]>>(_W-h) 582 // B may have implicit zero words in the high bits if the lengths differ 583 switch { 584 case n == m: 585 a2 = B.abs[n-1]<<h | B.abs[n-2]>>(_W-h) 586 case n == m+1: 587 a2 = B.abs[n-2] >> (_W - h) 588 default: 589 a2 = 0 590 } 591 592 // Since we are calculating with full words to avoid overflow, 593 // we use 'even' to track the sign of the cosequences. 594 // For even iterations: u0, v1 >= 0 && u1, v0 <= 0 595 // For odd iterations: u0, v1 <= 0 && u1, v0 >= 0 596 // The first iteration starts with k=1 (odd). 597 even = false 598 // variables to track the cosequences 599 u0, u1, u2 = 0, 1, 0 600 v0, v1, v2 = 0, 0, 1 601 602 // Calculate the quotient and cosequences using Collins' stopping condition. 603 // Note that overflow of a Word is not possible when computing the remainder 604 // sequence and cosequences since the cosequence size is bounded by the input size. 605 // See section 4.2 of Jebelean for details. 606 for a2 >= v2 && a1-a2 >= v1+v2 { 607 q, r := a1/a2, a1%a2 608 a1, a2 = a2, r 609 u0, u1, u2 = u1, u2, u1+q*u2 610 v0, v1, v2 = v1, v2, v1+q*v2 611 even = !even 612 } 613 return 614 } 615 616 // lehmerUpdate updates the inputs A and B such that: 617 // A = u0*A + v0*B 618 // B = u1*A + v1*B 619 // where the signs of u0, u1, v0, v1 are given by even 620 // For even == true: u0, v1 >= 0 && u1, v0 <= 0 621 // For even == false: u0, v1 <= 0 && u1, v0 >= 0 622 // q, r, s, t are temporary variables to avoid allocations in the multiplication 623 func lehmerUpdate(A, B, q, r, s, t *Int, u0, u1, v0, v1 Word, even bool) { 624 625 t.abs = t.abs.setWord(u0) 626 s.abs = s.abs.setWord(v0) 627 t.neg = !even 628 s.neg = even 629 630 t.Mul(A, t) 631 s.Mul(B, s) 632 633 r.abs = r.abs.setWord(u1) 634 q.abs = q.abs.setWord(v1) 635 r.neg = even 636 q.neg = !even 637 638 r.Mul(A, r) 639 q.Mul(B, q) 640 641 A.Add(t, s) 642 B.Add(r, q) 643 } 644 645 // euclidUpdate performs a single step of the Euclidean GCD algorithm 646 // if extended is true, it also updates the cosequence Ua, Ub 647 func euclidUpdate(A, B, Ua, Ub, q, r, s, t *Int, extended bool) { 648 q, r = q.QuoRem(A, B, r) 649 650 *A, *B, *r = *B, *r, *A 651 652 if extended { 653 // Ua, Ub = Ub, Ua - q*Ub 654 t.Set(Ub) 655 s.Mul(Ub, q) 656 Ub.Sub(Ua, s) 657 Ua.Set(t) 658 } 659 } 660 661 // lehmerGCD sets z to the greatest common divisor of a and b, 662 // which both must be != 0, and returns z. 663 // If x or y are not nil, their values are set such that z = a*x + b*y. 664 // See Knuth, The Art of Computer Programming, Vol. 2, Section 4.5.2, Algorithm L. 665 // This implementation uses the improved condition by Collins requiring only one 666 // quotient and avoiding the possibility of single Word overflow. 667 // See Jebelean, "Improving the multiprecision Euclidean algorithm", 668 // Design and Implementation of Symbolic Computation Systems, pp 45-58. 669 // The cosequences are updated according to Algorithm 10.45 from 670 // Cohen et al. "Handbook of Elliptic and Hyperelliptic Curve Cryptography" pp 192. 671 func (z *Int) lehmerGCD(x, y, a, b *Int) *Int { 672 var A, B, Ua, Ub *Int 673 674 A = new(Int).Abs(a) 675 B = new(Int).Abs(b) 676 677 extended := x != nil || y != nil 678 679 if extended { 680 // Ua (Ub) tracks how many times input a has been accumulated into A (B). 681 Ua = new(Int).SetInt64(1) 682 Ub = new(Int) 683 } 684 685 // temp variables for multiprecision update 686 q := new(Int) 687 r := new(Int) 688 s := new(Int) 689 t := new(Int) 690 691 // ensure A >= B 692 if A.abs.cmp(B.abs) < 0 { 693 A, B = B, A 694 Ub, Ua = Ua, Ub 695 } 696 697 // loop invariant A >= B 698 for len(B.abs) > 1 { 699 // Attempt to calculate in single-precision using leading words of A and B. 700 u0, u1, v0, v1, even := lehmerSimulate(A, B) 701 702 // multiprecision Step 703 if v0 != 0 { 704 // Simulate the effect of the single-precision steps using the cosequences. 705 // A = u0*A + v0*B 706 // B = u1*A + v1*B 707 lehmerUpdate(A, B, q, r, s, t, u0, u1, v0, v1, even) 708 709 if extended { 710 // Ua = u0*Ua + v0*Ub 711 // Ub = u1*Ua + v1*Ub 712 lehmerUpdate(Ua, Ub, q, r, s, t, u0, u1, v0, v1, even) 713 } 714 715 } else { 716 // Single-digit calculations failed to simulate any quotients. 717 // Do a standard Euclidean step. 718 euclidUpdate(A, B, Ua, Ub, q, r, s, t, extended) 719 } 720 } 721 722 if len(B.abs) > 0 { 723 // extended Euclidean algorithm base case if B is a single Word 724 if len(A.abs) > 1 { 725 // A is longer than a single Word, so one update is needed. 726 euclidUpdate(A, B, Ua, Ub, q, r, s, t, extended) 727 } 728 if len(B.abs) > 0 { 729 // A and B are both a single Word. 730 aWord, bWord := A.abs[0], B.abs[0] 731 if extended { 732 var ua, ub, va, vb Word 733 ua, ub = 1, 0 734 va, vb = 0, 1 735 even := true 736 for bWord != 0 { 737 q, r := aWord/bWord, aWord%bWord 738 aWord, bWord = bWord, r 739 ua, ub = ub, ua+q*ub 740 va, vb = vb, va+q*vb 741 even = !even 742 } 743 744 t.abs = t.abs.setWord(ua) 745 s.abs = s.abs.setWord(va) 746 t.neg = !even 747 s.neg = even 748 749 t.Mul(Ua, t) 750 s.Mul(Ub, s) 751 752 Ua.Add(t, s) 753 } else { 754 for bWord != 0 { 755 aWord, bWord = bWord, aWord%bWord 756 } 757 } 758 A.abs[0] = aWord 759 } 760 } 761 negA := a.neg 762 if y != nil { 763 // avoid aliasing b needed in the division below 764 if y == b { 765 B.Set(b) 766 } else { 767 B = b 768 } 769 // y = (z - a*x)/b 770 y.Mul(a, Ua) // y can safely alias a 771 if negA { 772 y.neg = !y.neg 773 } 774 y.Sub(A, y) 775 y.Div(y, B) 776 } 777 778 if x != nil { 779 *x = *Ua 780 if negA { 781 x.neg = !x.neg 782 } 783 } 784 785 *z = *A 786 787 return z 788 } 789 790 // Rand sets z to a pseudo-random number in [0, n) and returns z. 791 // 792 // As this uses the math/rand package, it must not be used for 793 // security-sensitive work. Use crypto/rand.Int instead. 794 func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int { 795 z.neg = false 796 if n.neg || len(n.abs) == 0 { 797 z.abs = nil 798 return z 799 } 800 z.abs = z.abs.random(rnd, n.abs, n.abs.bitLen()) 801 return z 802 } 803 804 // ModInverse sets z to the multiplicative inverse of g in the ring ℤ/nℤ 805 // and returns z. If g and n are not relatively prime, g has no multiplicative 806 // inverse in the ring ℤ/nℤ. In this case, z is unchanged and the return value 807 // is nil. 808 func (z *Int) ModInverse(g, n *Int) *Int { 809 // GCD expects parameters a and b to be > 0. 810 if n.neg { 811 var n2 Int 812 n = n2.Neg(n) 813 } 814 if g.neg { 815 var g2 Int 816 g = g2.Mod(g, n) 817 } 818 var d, x Int 819 d.GCD(&x, nil, g, n) 820 821 // if and only if d==1, g and n are relatively prime 822 if d.Cmp(intOne) != 0 { 823 return nil 824 } 825 826 // x and y are such that g*x + n*y = 1, therefore x is the inverse element, 827 // but it may be negative, so convert to the range 0 <= z < |n| 828 if x.neg { 829 z.Add(&x, n) 830 } else { 831 z.Set(&x) 832 } 833 return z 834 } 835 836 // Jacobi returns the Jacobi symbol (x/y), either +1, -1, or 0. 837 // The y argument must be an odd integer. 838 func Jacobi(x, y *Int) int { 839 if len(y.abs) == 0 || y.abs[0]&1 == 0 { 840 panic(fmt.Sprintf("big: invalid 2nd argument to Int.Jacobi: need odd integer but got %s", y)) 841 } 842 843 // We use the formulation described in chapter 2, section 2.4, 844 // "The Yacas Book of Algorithms": 845 // http://yacas.sourceforge.net/Algo.book.pdf 846 847 var a, b, c Int 848 a.Set(x) 849 b.Set(y) 850 j := 1 851 852 if b.neg { 853 if a.neg { 854 j = -1 855 } 856 b.neg = false 857 } 858 859 for { 860 if b.Cmp(intOne) == 0 { 861 return j 862 } 863 if len(a.abs) == 0 { 864 return 0 865 } 866 a.Mod(&a, &b) 867 if len(a.abs) == 0 { 868 return 0 869 } 870 // a > 0 871 872 // handle factors of 2 in 'a' 873 s := a.abs.trailingZeroBits() 874 if s&1 != 0 { 875 bmod8 := b.abs[0] & 7 876 if bmod8 == 3 || bmod8 == 5 { 877 j = -j 878 } 879 } 880 c.Rsh(&a, s) // a = 2^s*c 881 882 // swap numerator and denominator 883 if b.abs[0]&3 == 3 && c.abs[0]&3 == 3 { 884 j = -j 885 } 886 a.Set(&b) 887 b.Set(&c) 888 } 889 } 890 891 // modSqrt3Mod4 uses the identity 892 // (a^((p+1)/4))^2 mod p 893 // == u^(p+1) mod p 894 // == u^2 mod p 895 // to calculate the square root of any quadratic residue mod p quickly for 3 896 // mod 4 primes. 897 func (z *Int) modSqrt3Mod4Prime(x, p *Int) *Int { 898 e := new(Int).Add(p, intOne) // e = p + 1 899 e.Rsh(e, 2) // e = (p + 1) / 4 900 z.Exp(x, e, p) // z = x^e mod p 901 return z 902 } 903 904 // modSqrt5Mod8 uses Atkin's observation that 2 is not a square mod p 905 // alpha == (2*a)^((p-5)/8) mod p 906 // beta == 2*a*alpha^2 mod p is a square root of -1 907 // b == a*alpha*(beta-1) mod p is a square root of a 908 // to calculate the square root of any quadratic residue mod p quickly for 5 909 // mod 8 primes. 910 func (z *Int) modSqrt5Mod8Prime(x, p *Int) *Int { 911 // p == 5 mod 8 implies p = e*8 + 5 912 // e is the quotient and 5 the remainder on division by 8 913 e := new(Int).Rsh(p, 3) // e = (p - 5) / 8 914 tx := new(Int).Lsh(x, 1) // tx = 2*x 915 alpha := new(Int).Exp(tx, e, p) 916 beta := new(Int).Mul(alpha, alpha) 917 beta.Mod(beta, p) 918 beta.Mul(beta, tx) 919 beta.Mod(beta, p) 920 beta.Sub(beta, intOne) 921 beta.Mul(beta, x) 922 beta.Mod(beta, p) 923 beta.Mul(beta, alpha) 924 z.Mod(beta, p) 925 return z 926 } 927 928 // modSqrtTonelliShanks uses the Tonelli-Shanks algorithm to find the square 929 // root of a quadratic residue modulo any prime. 930 func (z *Int) modSqrtTonelliShanks(x, p *Int) *Int { 931 // Break p-1 into s*2^e such that s is odd. 932 var s Int 933 s.Sub(p, intOne) 934 e := s.abs.trailingZeroBits() 935 s.Rsh(&s, e) 936 937 // find some non-square n 938 var n Int 939 n.SetInt64(2) 940 for Jacobi(&n, p) != -1 { 941 n.Add(&n, intOne) 942 } 943 944 // Core of the Tonelli-Shanks algorithm. Follows the description in 945 // section 6 of "Square roots from 1; 24, 51, 10 to Dan Shanks" by Ezra 946 // Brown: 947 // https://www.maa.org/sites/default/files/pdf/upload_library/22/Polya/07468342.di020786.02p0470a.pdf 948 var y, b, g, t Int 949 y.Add(&s, intOne) 950 y.Rsh(&y, 1) 951 y.Exp(x, &y, p) // y = x^((s+1)/2) 952 b.Exp(x, &s, p) // b = x^s 953 g.Exp(&n, &s, p) // g = n^s 954 r := e 955 for { 956 // find the least m such that ord_p(b) = 2^m 957 var m uint 958 t.Set(&b) 959 for t.Cmp(intOne) != 0 { 960 t.Mul(&t, &t).Mod(&t, p) 961 m++ 962 } 963 964 if m == 0 { 965 return z.Set(&y) 966 } 967 968 t.SetInt64(0).SetBit(&t, int(r-m-1), 1).Exp(&g, &t, p) 969 // t = g^(2^(r-m-1)) mod p 970 g.Mul(&t, &t).Mod(&g, p) // g = g^(2^(r-m)) mod p 971 y.Mul(&y, &t).Mod(&y, p) 972 b.Mul(&b, &g).Mod(&b, p) 973 r = m 974 } 975 } 976 977 // ModSqrt sets z to a square root of x mod p if such a square root exists, and 978 // returns z. The modulus p must be an odd prime. If x is not a square mod p, 979 // ModSqrt leaves z unchanged and returns nil. This function panics if p is 980 // not an odd integer. 981 func (z *Int) ModSqrt(x, p *Int) *Int { 982 switch Jacobi(x, p) { 983 case -1: 984 return nil // x is not a square mod p 985 case 0: 986 return z.SetInt64(0) // sqrt(0) mod p = 0 987 case 1: 988 break 989 } 990 if x.neg || x.Cmp(p) >= 0 { // ensure 0 <= x < p 991 x = new(Int).Mod(x, p) 992 } 993 994 switch { 995 case p.abs[0]%4 == 3: 996 // Check whether p is 3 mod 4, and if so, use the faster algorithm. 997 return z.modSqrt3Mod4Prime(x, p) 998 case p.abs[0]%8 == 5: 999 // Check whether p is 5 mod 8, use Atkin's algorithm. 1000 return z.modSqrt5Mod8Prime(x, p) 1001 default: 1002 // Otherwise, use Tonelli-Shanks. 1003 return z.modSqrtTonelliShanks(x, p) 1004 } 1005 } 1006 1007 // Lsh sets z = x << n and returns z. 1008 func (z *Int) Lsh(x *Int, n uint) *Int { 1009 z.abs = z.abs.shl(x.abs, n) 1010 z.neg = x.neg 1011 return z 1012 } 1013 1014 // Rsh sets z = x >> n and returns z. 1015 func (z *Int) Rsh(x *Int, n uint) *Int { 1016 if x.neg { 1017 // (-x) >> s == ^(x-1) >> s == ^((x-1) >> s) == -(((x-1) >> s) + 1) 1018 t := z.abs.sub(x.abs, natOne) // no underflow because |x| > 0 1019 t = t.shr(t, n) 1020 z.abs = t.add(t, natOne) 1021 z.neg = true // z cannot be zero if x is negative 1022 return z 1023 } 1024 1025 z.abs = z.abs.shr(x.abs, n) 1026 z.neg = false 1027 return z 1028 } 1029 1030 // Bit returns the value of the i'th bit of x. That is, it 1031 // returns (x>>i)&1. The bit index i must be >= 0. 1032 func (x *Int) Bit(i int) uint { 1033 if i == 0 { 1034 // optimization for common case: odd/even test of x 1035 if len(x.abs) > 0 { 1036 return uint(x.abs[0] & 1) // bit 0 is same for -x 1037 } 1038 return 0 1039 } 1040 if i < 0 { 1041 panic("negative bit index") 1042 } 1043 if x.neg { 1044 t := nat(nil).sub(x.abs, natOne) 1045 return t.bit(uint(i)) ^ 1 1046 } 1047 1048 return x.abs.bit(uint(i)) 1049 } 1050 1051 // SetBit sets z to x, with x's i'th bit set to b (0 or 1). 1052 // That is, if b is 1 SetBit sets z = x | (1 << i); 1053 // if b is 0 SetBit sets z = x &^ (1 << i). If b is not 0 or 1, 1054 // SetBit will panic. 1055 func (z *Int) SetBit(x *Int, i int, b uint) *Int { 1056 if i < 0 { 1057 panic("negative bit index") 1058 } 1059 if x.neg { 1060 t := z.abs.sub(x.abs, natOne) 1061 t = t.setBit(t, uint(i), b^1) 1062 z.abs = t.add(t, natOne) 1063 z.neg = len(z.abs) > 0 1064 return z 1065 } 1066 z.abs = z.abs.setBit(x.abs, uint(i), b) 1067 z.neg = false 1068 return z 1069 } 1070 1071 // And sets z = x & y and returns z. 1072 func (z *Int) And(x, y *Int) *Int { 1073 if x.neg == y.neg { 1074 if x.neg { 1075 // (-x) & (-y) == ^(x-1) & ^(y-1) == ^((x-1) | (y-1)) == -(((x-1) | (y-1)) + 1) 1076 x1 := nat(nil).sub(x.abs, natOne) 1077 y1 := nat(nil).sub(y.abs, natOne) 1078 z.abs = z.abs.add(z.abs.or(x1, y1), natOne) 1079 z.neg = true // z cannot be zero if x and y are negative 1080 return z 1081 } 1082 1083 // x & y == x & y 1084 z.abs = z.abs.and(x.abs, y.abs) 1085 z.neg = false 1086 return z 1087 } 1088 1089 // x.neg != y.neg 1090 if x.neg { 1091 x, y = y, x // & is symmetric 1092 } 1093 1094 // x & (-y) == x & ^(y-1) == x &^ (y-1) 1095 y1 := nat(nil).sub(y.abs, natOne) 1096 z.abs = z.abs.andNot(x.abs, y1) 1097 z.neg = false 1098 return z 1099 } 1100 1101 // AndNot sets z = x &^ y and returns z. 1102 func (z *Int) AndNot(x, y *Int) *Int { 1103 if x.neg == y.neg { 1104 if x.neg { 1105 // (-x) &^ (-y) == ^(x-1) &^ ^(y-1) == ^(x-1) & (y-1) == (y-1) &^ (x-1) 1106 x1 := nat(nil).sub(x.abs, natOne) 1107 y1 := nat(nil).sub(y.abs, natOne) 1108 z.abs = z.abs.andNot(y1, x1) 1109 z.neg = false 1110 return z 1111 } 1112 1113 // x &^ y == x &^ y 1114 z.abs = z.abs.andNot(x.abs, y.abs) 1115 z.neg = false 1116 return z 1117 } 1118 1119 if x.neg { 1120 // (-x) &^ y == ^(x-1) &^ y == ^(x-1) & ^y == ^((x-1) | y) == -(((x-1) | y) + 1) 1121 x1 := nat(nil).sub(x.abs, natOne) 1122 z.abs = z.abs.add(z.abs.or(x1, y.abs), natOne) 1123 z.neg = true // z cannot be zero if x is negative and y is positive 1124 return z 1125 } 1126 1127 // x &^ (-y) == x &^ ^(y-1) == x & (y-1) 1128 y1 := nat(nil).sub(y.abs, natOne) 1129 z.abs = z.abs.and(x.abs, y1) 1130 z.neg = false 1131 return z 1132 } 1133 1134 // Or sets z = x | y and returns z. 1135 func (z *Int) Or(x, y *Int) *Int { 1136 if x.neg == y.neg { 1137 if x.neg { 1138 // (-x) | (-y) == ^(x-1) | ^(y-1) == ^((x-1) & (y-1)) == -(((x-1) & (y-1)) + 1) 1139 x1 := nat(nil).sub(x.abs, natOne) 1140 y1 := nat(nil).sub(y.abs, natOne) 1141 z.abs = z.abs.add(z.abs.and(x1, y1), natOne) 1142 z.neg = true // z cannot be zero if x and y are negative 1143 return z 1144 } 1145 1146 // x | y == x | y 1147 z.abs = z.abs.or(x.abs, y.abs) 1148 z.neg = false 1149 return z 1150 } 1151 1152 // x.neg != y.neg 1153 if x.neg { 1154 x, y = y, x // | is symmetric 1155 } 1156 1157 // x | (-y) == x | ^(y-1) == ^((y-1) &^ x) == -(^((y-1) &^ x) + 1) 1158 y1 := nat(nil).sub(y.abs, natOne) 1159 z.abs = z.abs.add(z.abs.andNot(y1, x.abs), natOne) 1160 z.neg = true // z cannot be zero if one of x or y is negative 1161 return z 1162 } 1163 1164 // Xor sets z = x ^ y and returns z. 1165 func (z *Int) Xor(x, y *Int) *Int { 1166 if x.neg == y.neg { 1167 if x.neg { 1168 // (-x) ^ (-y) == ^(x-1) ^ ^(y-1) == (x-1) ^ (y-1) 1169 x1 := nat(nil).sub(x.abs, natOne) 1170 y1 := nat(nil).sub(y.abs, natOne) 1171 z.abs = z.abs.xor(x1, y1) 1172 z.neg = false 1173 return z 1174 } 1175 1176 // x ^ y == x ^ y 1177 z.abs = z.abs.xor(x.abs, y.abs) 1178 z.neg = false 1179 return z 1180 } 1181 1182 // x.neg != y.neg 1183 if x.neg { 1184 x, y = y, x // ^ is symmetric 1185 } 1186 1187 // x ^ (-y) == x ^ ^(y-1) == ^(x ^ (y-1)) == -((x ^ (y-1)) + 1) 1188 y1 := nat(nil).sub(y.abs, natOne) 1189 z.abs = z.abs.add(z.abs.xor(x.abs, y1), natOne) 1190 z.neg = true // z cannot be zero if only one of x or y is negative 1191 return z 1192 } 1193 1194 // Not sets z = ^x and returns z. 1195 func (z *Int) Not(x *Int) *Int { 1196 if x.neg { 1197 // ^(-x) == ^(^(x-1)) == x-1 1198 z.abs = z.abs.sub(x.abs, natOne) 1199 z.neg = false 1200 return z 1201 } 1202 1203 // ^x == -x-1 == -(x+1) 1204 z.abs = z.abs.add(x.abs, natOne) 1205 z.neg = true // z cannot be zero if x is positive 1206 return z 1207 } 1208 1209 // Sqrt sets z to ⌊√x⌋, the largest integer such that z² ≤ x, and returns z. 1210 // It panics if x is negative. 1211 func (z *Int) Sqrt(x *Int) *Int { 1212 if x.neg { 1213 panic("square root of negative number") 1214 } 1215 z.neg = false 1216 z.abs = z.abs.sqrt(x.abs) 1217 return z 1218 }