地板和欧几里德大整数划分

时间:2015-03-22 12:48:05

标签: java biginteger integer-division

Java的BigInteger类提供截断的除法(商和余数)。以此为出发点,实现地板和欧几里德划分(商和余数)的最简单,最有效的方法是什么?

2 个答案:

答案 0 :(得分:3)

根据:https://stackoverflow.com/a/4110620/4701236这应该是非常有效的。请注意,这是针对C而不是Java的效率进行测试,但是看到差异相当小,我不希望它们在Java中很大(实现之间的差异,而不是C和Java之间的差异),因为当前的Java编译器优化了很多。 / p>

public BigInteger euclidianDivision(BigInteger a,BigInteger b){
    return (a - (a<0 ? b-1 : 0)).divide(b)
}

public BigInteger flooredDivision(BigInteger a,BigInteger b){
    return (a + ( ((x<0) != (y<0))? b-1 : 0)).divide(b)
}

public BigInteger secondFlooredDivision(BigInteger a,BigInteger b){
    return (a + ( ((a ^ b) < 0)? b-1 : 0)).divide(b)
}

secondFlooredDivision假设负数的二进制表示,所以我建议你使用另一个。目前无法测试此代码,因此如果有人可以运行它并纠正可能的语法错误(我将其写为伪代码)。

答案 1 :(得分:3)

基于Soronbe的答案,以下是正确Java语法的实现(不包括floored divison的第二个变体):

public BigInteger euclidianDivision(BigInteger a, BigInteger b) {
    return
        a.subtract(
            a.compareTo(BigInteger.ZERO) < 0 ?
                b.subtract(BigInteger.ONE) :
                    BigInteger.ZERO
        ).divide(b)
}

public BigInteger flooredDivision(BigInteger a, BigInteger b) {
    return
        a.add(
            (a.compareTo(BigInteger.ZERO) < 0) != (b.compareTo(BigInteger.ZERO) < 0) ?
                b.subtract(BigInteger.ONE) :
                    BigInteger.ZERO
        ).divide(b);
}

<强>更新 为了根据三个除法算法计算余数,其中两个已经在BigInteger中实现(mod用于欧几里德除法,remainder用于截断除法。要获得地板部门的剩余部分,您可以使用以下实施:

public BigInteger flooredRemainder(BigInteger a, BigInteger b) {
    return
        a.mod(b).subtract(
            b.compareTo(BigInteger.ZERO) < 0 ? BigInteger.ONE : BigInteger.ZERO
        );
}