@Override
    public Complex product(final Complex factor) {
        if (factor == null)
            throw new NullPointerException("The factor is not properly specified.");
        if (Complex.isNaN(factor) || Complex.isNaN(this))
            return Complex.NaN;
        if ((Complex.isInfinite(factor) && Complex.isOrigin(this)) ||
                (Complex.isInfinite(this) && Complex.isOrigin(factor)))
            return Complex.NaN;
        if (Complex.isInfinite(factor) || Complex.isInfinite(this))
            return Complex.Infinity;
        return Complex.Cartesian(this._real * factor._real -
                this._imaginary * factor._imaginary,
                this._real * factor._imaginary +
                this._imaginary * factor._real);
    }