大整数的底除法和欧几里得除法
Floored and Euclidean division of big integers
Java 的 BigInteger class 提供截断除法(商和余数)。以此为起点,实现底数和欧几里德除法(商和余数)的最简单和最有效的方法是什么?
根据: 这应该是非常有效的。请注意,这是在 C 而不是 Java 中测试效率的,但看到差异相当小,我不希望它们在 Java 中很大(实现之间的差异,而不是 C 和 [=16= 之间的差异) ]) 因为当前的 Java 编译器优化了很多。
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对负数的二进制表示做了假设,所以我建议你使用另一个。目前无法测试此代码,所以如果有人可以 运行 它并更正可能的语法错误(我将其写为伪代码)。
根据 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
);
}
Java 的 BigInteger class 提供截断除法(商和余数)。以此为起点,实现底数和欧几里德除法(商和余数)的最简单和最有效的方法是什么?
根据: 这应该是非常有效的。请注意,这是在 C 而不是 Java 中测试效率的,但看到差异相当小,我不希望它们在 Java 中很大(实现之间的差异,而不是 C 和 [=16= 之间的差异) ]) 因为当前的 Java 编译器优化了很多。
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对负数的二进制表示做了假设,所以我建议你使用另一个。目前无法测试此代码,所以如果有人可以 运行 它并更正可能的语法错误(我将其写为伪代码)。
根据 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
);
}