def gcd()

in core/src/main/scala/com/spotify/featran/transformers/PolynomialExpansion.scala [200:243]


  def gcd(p: Int, q: Int): Int =
    if (p == 0 || q == 0) {
      require(p != Int.MinValue && q != Int.MinValue, s"overflow: gcd($p, $q) is 2^31")
      abs(p + q)
    } else {
      var a = p
      var b = q
      var al = a.toLong
      var bl = b.toLong
      var useLong = false
      if (a < 0) {
        if (a == Int.MinValue) {
          useLong = true
        } else {
          a = -a
        }
        al = -al
      }
      if (b < 0) {
        if (b == Int.MinValue) {
          useLong = true
        } else {
          b = -b
        }
        bl = -bl
      }
      if (useLong) {
        require(al != bl, s"overflow: gcd($p, $q) is 2^31")
      }
      var blbu = bl
      bl = al
      al = blbu % al
      if (al == 0) {
        require(bl <= Int.MaxValue, s"overflow: gcd($p, $q) is 2^31")
        bl.toInt
      } else {
        blbu = bl

        // Now "al" and "bl" fit in an "int".
        b = al.toInt
        a = (blbu % al).toInt
        gcdPositive(a, b)
      }
    }