【发布时间】:2019-09-12 13:47:51
【问题描述】:
一种绝对有效的方法是从 0 开始,直到找到 200 位素数。为了做到这一点,我编写了这个方法:
var primeList = arrayListOf(BigInteger("2"))
fun findNextPrime(num : BigInteger): BigInteger {
val n = num + BigInteger.ONE
val sqrt = sqrt(num)
for (bigInteger in primeList) {
if(bigInteger > sqrt){
return n
}
if(n % bigInteger == BigInteger.ZERO){
return findNextPrime(num + BigInteger.ONE)
}
}
return n;
}
我将找到的数字添加到 primeList 并仅检查小于 squareRoot 的数字。即使这是我能写的最快的算法,但在找到一百万位数字后需要很长时间。只有 7 位数字。我会可能会死到 200 位数。(即使我的笔记本电脑是 i7 第 8 代)。所以我使用的下一件事是:
n = 2 * 3 * 5 *... + 1
嗯,n 是素数,使用这种方法获得高位数字非常快,但没有什么能确定准确地达到 200 位数字。我得到了 198 和 201 位数字。但没有 200 代码很简单,但我还是发布吧:
var all = BigInteger.ONE
primeList.forEach {
all *= it
}
all++
println(all.toString().length)
【问题讨论】:
-
btw
all += all * it不计算 primeList 的乘积 -
kotlin 中有序列的概念。你应该调查一下。另外第200个价格是1217,不是那么大,所以你可以用整数。
-
well n is prime?一般来说,这不是真的。并非所有 primorials 与素数相差 1。要获得 200 位长的素数,唯一可行的方法是生成该大小的随机奇数并测试它们的素数。换句话说——为他们钓鱼 -
我刚刚对跨越 200 位数的两个原始素数候选者进行了米勒-拉宾测试。两者都是合数。
标签: java math kotlin primes prime-factoring