/** * Performs Karatsuba "squaring" on two BigIntegers * * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. * * @param Math_BigInteger $y * @return Math_BigInteger * @access private */ function _karatsubaSquare() { $m = count($this->value) >> 1; if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { return $this->_square(); } $x1 = new Math_BigInteger(); $x0 = new Math_BigInteger(); $x1->value = array_slice($this->value, $m); $x0->value = array_slice($this->value, 0, $m); $z2 = $x1->_karatsubaSquare(); $z0 = $x0->_karatsubaSquare(); $z1 = $x1->add($x0); $z1 = $z1->_karatsubaSquare(); $z1 = $z1->subtract($z2->add($z0)); $z2->value = array_merge(array_fill(0, 2 * $m, 0), $z2->value); $z1->value = array_merge(array_fill(0, $m, 0), $z1->value); $xx = $z2->add($z1); $xx = $xx->add($z0); return $xx; }