gpt4 book ai didi

java - 如何将此代码从 long 转换为 BigInteger

转载 作者:行者123 更新时间:2023-12-02 09:28:04 25 4
gpt4 key购买 nike

这是一个获取素数的代码,我已经尽可能地提高了它的效率,但问题是我无法将它转换为BigInteger,因为不能容纳那么多信息;这里是代码:

public class p3{
static long perfectNumber;
static long mersenne;

public static void main(String[] args) {
long p = 2;
while (true) {
if( p % 2 == 0&&p!=2){
p++;
}
else{
if (isPrime(p) == true) {
mersenne = (long) (Math.pow(2, p) - 1);
if (isPrime(mersenne) == true) {
perfectNumber = (long) Math.pow(2, (p - 1)) * mersenne;
System.out.println(perfectNumber);
}
}
p+=1;
}
}
}
private static boolean isPrime(long testPrime) {
for (long i = 3; i < Math.sqrt(testPrime); i += 2) {
if (testPrime % i == 0) {
return false;
}
}
return true;
}
}

最佳答案

I've tried to use BigInteger but code is not working, as I can't use BigInteger exponents with pow

你不需要。指数不需要几乎与梅森素数和完美数一样大。他们可以有自己独立的 isPrime() 测试。事实上,它们需要是 int,而不是 long,才能满足 BigInteger.pow()

以下是您所要求的,但可能不是您想要的。由于时间限制,我怀疑您会在原始代码之外获得超过一个额外的完美数字,这就是为什么 @WJS 将您推向不同的方向。

import java.math.BigInteger; 

public class p3 {
static BigInteger TWO = new BigInteger("2");
static BigInteger THREE = new BigInteger("3");

public static void main(String[] args) {
int p = 2;

while (true) {
if (isPrime(p)) {
BigInteger mersenne = TWO.pow(p).subtract(BigInteger.ONE);

if (isPrime(mersenne)) {
System.out.println(TWO.pow(p - 1).multiply(mersenne));
}
}

p += (p == 2) ? 1 : 2;
}
}

private static boolean isPrime(BigInteger number) {
if (number.mod(TWO).equals(BigInteger.ZERO)) {
return number.equals(TWO);
}

for (BigInteger i = THREE; number.compareTo(i.multiply(i)) >= 0; i = i.add(TWO)) {
if (number.mod(i).equals(BigInteger.ZERO)) {
return false;
}
}

return true;
}

private static boolean isPrime(int number) {
if (number % 2 == 0) {
return number == 2;
}

for (int i = 3; number >= i * i; i += 2) {
if (number % i == 0) {
return false;
}
}

return true;
}
}

输出

> java p3
6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
2658455991569831744654692615953842176

您的原始代码输出 0 代替上面的最终数字(37 位)。因此,当前的问题确实是 long 无法容纳足够的信息。但超出这一点,您就无法使用上述算法进行足够快的计算。

如果我们对上面的代码做一些简单的事情,比如替换这一行:

 if (isPrime(mersenne)) {

与:

if (mersenne.isProbablePrime(10)) {

代码会输出前 20 个完美数字,然后速度会变得缓慢。根据您的需要调整 isProbablePrime()certainty参数。

关于java - 如何将此代码从 long 转换为 BigInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com