Util.java Source code

Java tutorial

Introduction

Here is the source code for Util.java

Source

/*
 * @(#)MathUtil.java   1.0 Apr 26, 2008
 *
 *   The MIT License
 *
 *   Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>
 *
 *   Permission is hereby granted, free of charge, to any person obtaining a copy
 *   of this software and associated documentation files (the "Software"), to deal
 *   in the Software without restriction, including without limitation the rights
 *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *   copies of the Software, and to permit persons to whom the Software is
 *   furnished to do so, subject to the following conditions:
 *
 *   The above copyright notice and this permission notice shall be included in
 *   all copies or substantial portions of the Software.
 *
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *   THE SOFTWARE.
 */

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;

public class Util {
    protected static BigInteger BigIntegerZERO = BigInteger.ZERO;
    protected static BigInteger BigIntegerONE = BigInteger.ONE;
    protected static BigInteger BigIntegerTWO = BigInteger.valueOf(2);
    protected static BigInteger BigIntegerTHREE = BigInteger.valueOf(3);
    protected static BigInteger FactorialBreakpoint = BigInteger.valueOf(96);
    protected static BigDecimal BigDecimalZERO = BigDecimal.ZERO;
    protected static BigDecimal BigDecimalONE = BigDecimal.ONE;
    protected static BigDecimal BigDecimalTWO = new BigDecimal(2);
    protected static BigDecimal BigDecimalFOUR = new BigDecimal(4);

    public static BigInteger bitwiseGcd(BigInteger u, BigInteger v) {
        if (u.equals(BigInteger.ZERO))
            return v;
        if (v.equals(BigInteger.ZERO))
            return u;

        //      System.out.format("u=%s=%s\nu.getLowestSetBit()=%s\n%s>>%s=%s = %s\n", u, u.toString(2), u.getLowestSetBit(), u, u.getLowestSetBit(), u.shiftRight(u.getLowestSetBit()), u.shiftRight(u.getLowestSetBit()).toString(2));

        int uBit = u.getLowestSetBit();
        int vBit = v.getLowestSetBit();
        int k = (uBit <= vBit ? uBit : vBit);

        while (u.signum() > 0) {
            // first ensure that both are odd
            u = u.shiftRight(u.getLowestSetBit());
            v = v.shiftRight(v.getLowestSetBit());
            if (u.subtract(v).signum() >= 0) {
                u = (u.subtract(v)).shiftRight(1);
            } else {
                v = (v.subtract(u)).shiftRight(1);
            }
        }

        return v.shiftLeft(k);
    }
}