Java Code Examples for org.apache.commons.math3.exception.util.LocalizedFormats#GCD_OVERFLOW_32_BITS

The following examples show how to use org.apache.commons.math3.exception.util.LocalizedFormats#GCD_OVERFLOW_32_BITS . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p, int q) throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}
 
Example 2
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p,
                      int q)
    throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}
 
Example 3
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * <p>
 * Gets the greatest common divisor of the absolute value of two numbers,
 * using the "binary gcd" method which avoids division and modulo
 * operations. See Knuth 4.5.2 algorithm B. This algorithm is due to Josef
 * Stein (1961).
 * </p>
 * Special cases:
 * <ul>
 * <li>The invocations
 * {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 * {@code gcd(Integer.MIN_VALUE, 0)} and
 * {@code gcd(0, Integer.MIN_VALUE)} throw an
 * {@code ArithmeticException}, because the result would be 2^31, which
 * is too large for an int value.</li>
 * <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 * {@code gcd(x, 0)} is the absolute value of {@code x}, except
 * for the special cases above.
 * <li>The invocation {@code gcd(0, 0)} is the only one which returns
 * {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor, never negative.
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(final int p, final int q) {
    int u = p;
    int v = q;
    if ((u == 0) || (v == 0)) {
        if ((u == Integer.MIN_VALUE) || (v == Integer.MIN_VALUE)) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(u) + FastMath.abs(v);
    }
    // keep u and v negative, as negative integers range down to
    // -2^31, while positive numbers can only be as large as 2^31-1
    // (i.e. we can't necessarily negate a negative number without
    // overflow)
    /* assert u!=0 && v!=0; */
    if (u > 0) {
        u = -u;
    } // make u negative
    if (v > 0) {
        v = -v;
    } // make v negative
    // B1. [Find power of 2]
    int k = 0;
    while ((u & 1) == 0 && (v & 1) == 0 && k < 31) { // while u and v are
                                                        // both even...
        u /= 2;
        v /= 2;
        k++; // cast out twos.
    }
    if (k == 31) {
        throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                          p, q);
    }
    // B2. Initialize: u and v have been divided by 2^k and at least
    // one is odd.
    int t = ((u & 1) == 1) ? v : -(u / 2)/* B3 */;
    // t negative: u was odd, v may be even (t replaces v)
    // t positive: u was even, v is odd (t replaces u)
    do {
        /* assert u<0 && v<0; */
        // B4/B3: cast out twos from t.
        while ((t & 1) == 0) { // while t is even..
            t /= 2; // cast out twos
        }
        // B5 [reset max(u,v)]
        if (t > 0) {
            u = -t;
        } else {
            v = t;
        }
        // B6/B3. at this point both u and v should be odd.
        t = (v - u) / 2;
        // |u| larger: t positive (replace u)
        // |v| larger: t negative (replace v)
    } while (t != 0);
    return -u * (1 << k); // gcd is u*2^k
}
 
Example 4
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p,
                      int q)
    throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}
 
Example 5
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * <p>
 * Gets the greatest common divisor of the absolute value of two numbers,
 * using the "binary gcd" method which avoids division and modulo
 * operations. See Knuth 4.5.2 algorithm B. This algorithm is due to Josef
 * Stein (1961).
 * </p>
 * Special cases:
 * <ul>
 * <li>The invocations
 * {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 * {@code gcd(Integer.MIN_VALUE, 0)} and
 * {@code gcd(0, Integer.MIN_VALUE)} throw an
 * {@code ArithmeticException}, because the result would be 2^31, which
 * is too large for an int value.</li>
 * <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 * {@code gcd(x, 0)} is the absolute value of {@code x}, except
 * for the special cases above.
 * <li>The invocation {@code gcd(0, 0)} is the only one which returns
 * {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor, never negative.
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(final int p, final int q) {
    int u = p;
    int v = q;
    if ((u == 0) || (v == 0)) {
        if ((u == Integer.MIN_VALUE) || (v == Integer.MIN_VALUE)) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(u) + FastMath.abs(v);
    }
    // keep u and v negative, as negative integers range down to
    // -2^31, while positive numbers can only be as large as 2^31-1
    // (i.e. we can't necessarily negate a negative number without
    // overflow)
    /* assert u!=0 && v!=0; */
    if (u > 0) {
        u = -u;
    } // make u negative
    if (v > 0) {
        v = -v;
    } // make v negative
    // B1. [Find power of 2]
    int k = 0;
    while ((u & 1) == 0 && (v & 1) == 0 && k < 31) { // while u and v are
                                                        // both even...
        u /= 2;
        v /= 2;
        k++; // cast out twos.
    }
    if (k == 31) {
        throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                          p, q);
    }
    // B2. Initialize: u and v have been divided by 2^k and at least
    // one is odd.
    int t = ((u & 1) == 1) ? v : -(u / 2)/* B3 */;
    // t negative: u was odd, v may be even (t replaces v)
    // t positive: u was even, v is odd (t replaces u)
    do {
        /* assert u<0 && v<0; */
        // B4/B3: cast out twos from t.
        while ((t & 1) == 0) { // while t is even..
            t /= 2; // cast out twos
        }
        // B5 [reset max(u,v)]
        if (t > 0) {
            u = -t;
        } else {
            v = t;
        }
        // B6/B3. at this point both u and v should be odd.
        t = (v - u) / 2;
        // |u| larger: t positive (replace u)
        // |v| larger: t negative (replace v)
    } while (t != 0);
    return -u * (1 << k); // gcd is u*2^k
}
 
Example 6
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p,
                      int q)
    throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}
 
Example 7
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p,
                      int q)
    throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}
 
Example 8
Source File: ArithmeticUtils.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Computes the greatest common divisor of the absolute value of two
 * numbers, using a modified version of the "binary gcd" method.
 * See Knuth 4.5.2 algorithm B.
 * The algorithm is due to Josef Stein (1961).
 * <br/>
 * Special cases:
 * <ul>
 *  <li>The invocations
 *   {@code gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)},
 *   {@code gcd(Integer.MIN_VALUE, 0)} and
 *   {@code gcd(0, Integer.MIN_VALUE)} throw an
 *   {@code ArithmeticException}, because the result would be 2^31, which
 *   is too large for an int value.</li>
 *  <li>The result of {@code gcd(x, x)}, {@code gcd(0, x)} and
 *   {@code gcd(x, 0)} is the absolute value of {@code x}, except
 *   for the special cases above.</li>
 *  <li>The invocation {@code gcd(0, 0)} is the only one which returns
 *   {@code 0}.</li>
 * </ul>
 *
 * @param p Number.
 * @param q Number.
 * @return the greatest common divisor (never negative).
 * @throws MathArithmeticException if the result cannot be represented as
 * a non-negative {@code int} value.
 * @since 1.1
 */
public static int gcd(int p, int q) throws MathArithmeticException {
    int a = p;
    int b = q;
    if (a == 0 ||
        b == 0) {
        if (a == Integer.MIN_VALUE ||
            b == Integer.MIN_VALUE) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        return FastMath.abs(a + b);
    }

    long al = a;
    long bl = b;
    boolean useLong = false;
    if (a < 0) {
        if(Integer.MIN_VALUE == a) {
            useLong = true;
        } else {
            a = -a;
        }
        al = -al;
    }
    if (b < 0) {
        if (Integer.MIN_VALUE == b) {
            useLong = true;
        } else {
            b = -b;
        }
        bl = -bl;
    }
    if (useLong) {
        if(al == bl) {
            throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                              p, q);
        }
        long blbu = bl;
        bl = al;
        al = blbu % al;
        if (al == 0) {
            if (bl > Integer.MAX_VALUE) {
                throw new MathArithmeticException(LocalizedFormats.GCD_OVERFLOW_32_BITS,
                                                  p, q);
            }
            return (int) bl;
        }
        blbu = bl;

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

    return gcdPositive(a, b);
}