public function getNegativeEncoder()
    {
        if ($this->negativeEncoder !== null) {
            return $this->negativeEncoder;
        }

        if ($this->isExtensionLoaded('gmp')) {
            return $this->negativeEncoder = new GmpNegativeEncoder();
        }

        if ($this->isExtensionLoaded('bcmath') && ! $this->is32Bit()) {
            return $this->negativeEncoder = new BcNegativeEncoder();
        }

        return $this->negativeEncoder = new InvalidNegativeEncoder();
    }