我需要检查x是否可以除以y。在其他情况下,我不需要实际剩余。
我正在使用" mod"运算符。
if (X.mod(Y).equals(BigInteger.ZERO))
{
do something
}
现在,我只有在x被y排除时才感兴趣,我不需要其他情况下的实际剩余。
固定股息时,找到一种更快的方法来检查可划分。更确切地说,在进行Lucas-Lehmer测试之前,要检查大量(潜在的素数(。
我只是想知道,我们可以根据X&amp的最后一两个数字做出一些假设(向前看(。是的,我们可以决定是否去国防部(当没有机会获取零时(。
java BigInteger
s(就像1980年以来的大多数计算机中的大多数数字一样(是二进制的,因此可以通过查看最后一个'digits'(二进制数字=位(来优化的唯一优化的modulo是2的幂,而2的唯一功率为2 1 。BigInteger.testBit(0)
直接测试。但是,大多数生成大量应成为素数的软件都是用于密码学(例如RSA,Rabin,DH,DSA(,并确保首先不要测试候选者。参见例如FIPS186-4 A.1.1.2(或更早(。
由于您的实际目标没有标题中所述,而是要测试一个(大(整数是否不能被几个小素数的任何 - 通常,任何常见的倍数,最好至少,但对于不同的素数,是lcm - 并使用欧几里得的算法计算其GCD。如果GCD为1,则产品中的 no 质量因素很常见,从而将候选者分开。这需要几个BigInteger DivideAndreMainderer的操作,但它可以在一个FWOOP中处理您的所有测试。
一种中间方式是"束"几个小刺激物,其产品小于2 31 或2 63 ,以BigInteger.mod
(或.remainder
(为.intValue()
或CC_4(.longValue()
分别使用int
或long
操作来测试(如果非零(,则分别由每个小素数分解,这些操作比BigInteger
的速度快得多。如果需要,重复几束。BigInteger.probablePrime
及相关例程对最多95位的候选者确实可以做到这一点(Primes 3..41(,在此之上,它认为Erastostosthenes式的筛子更有效。(无论哪种情况,后跟Miller-Rabin 和 Lucas-Lehmer。(
在Java中测量类似的内容时,请记住,如果您执行某种方法"很多",那么"很多"的确切定义可能会有所不同,并且很难固定,所有常见的JVM都会jit汇编代码,从根本上改变性能。如果您是做很多事情,请务必衡量编译的性能,如果您不是做很多,则表现通常并不重要。这里有许多关于java中" Microbench(S("中有关陷阱的现有问题。
有算法可以检查划分性,但它是复数的,每种算法涵盖了一组特定的数字,例如可分配3,可分配为4等。可以找到某些算法的列表,例如在维基百科。没有一般的高性能算法可以用于任何给定的数字,否则发现它是著名的,并且每个可分配的逐个划分都可以使用。