Judagrali系列

本文介绍了一种利用Java面向对象编程和BigInteger类解决数学难题的方法,具体目标是找到Judagrali数列中的特定素数N,其中N等于Q的位数,而Q=(2^p)-1且P为素数。文章详细阐述了如何通过继承构建P、Q和N类,并使用PrimeGenerator生成素数。

前一段时间,以下问题是泛滥的编程论坛。

找出第四个素数N,使得N = NumberOfDigits(Q),其中N是素数,Q是
素数AND(其中Q =(2 ^ p)-1),其中P是素数。
我们正在寻找Judagrali系列中的第2、3、4素数N及其
相应的Q和P值。
提示:
1第四个N对应一个非常大的Q。
计算。
2计算效率很重要。
3必须使用面向对象和继承。 即N是素数和子集
Q的(子类),Q也是素数,P的子集也是素数。

显然在面试中有人问过。

这些提示是完整的赠品。

1第四个N对应一个非常大的Q。

计算。

这很简单。 无论我们用来存储Q的任何变量都需要能够存储大整数(我将使用java.math.BigInteger)。

2计算效率很重要。

我将仅使用java.math.BigDecimal的nextProbablePrime方法生成素数。

3必须使用面向对象和继承。 即N是素数和子集

Q的(子类),Q也是素数,P的子集也是素数。

从P和Q之间的关系开始,P只是一个(素数)数。


class P {
     BigInteger value;
        public P(BigInteger p) {
          value = p;
        }
     public P() {}
}

如您所见,P根本没有意思。 它只是将BigInteger值存储在一个值变量中。 唯一重要的是它必须仅存储质数。 isJudagrali方法仅测试value是否为质数。

现在,将Q和P的关系指定为Q =(2 ^ p)-1。根据该关系,如果我们有P,则可以轻松获得Q。 但是,要使该Q成为我们序列的有效数字,它(Q)也必须是质数。 它也必须是质数的事实意味着Q类可以扩展P。从P继承的isJudagrali方法在这里仍然适用。 关系Q =(2 ^ p)-1在Q的构造函数中很容易实现。

class Q extends P {
    public Q() {}
    public Q(P p) {
        value = BigInteger.ONE.shiftLeft(p.value.intValue())
   .subtract(BigInteger.ONE);
    }
}
我只是做了一些转变以实现(2 ^ p)。 没有什么邪恶的!

最后一个难题是N。

N是一个Q,因此我们将其扩展为Q。它还应保留给定Q的位数。

构造函数可以再次为我们强制执行该操作:

class N extends Q {
    public N(Q q) {
        value = numDigits(q.value);
    }
    public BigInteger numDigits (BigInteger num) {
         String s = ""+ num;
         return new BigInteger(""+s.length());
    }
}

我将用于此的质数生成器仅来自BigInteger类

class PrimeGenerator {
    BigInteger current = BigInteger.ONE;
    public BigInteger next() {
       current = current.nextProbablePrime();
       return current;
    }
}

主程序没有太多事情要做。 它只是从质数生成器中获取素数,构造一个P及其对应的Q值。 如果满足Q和P关系,则可以构造

如果N是有效的Judagrali,则它将打印出P,Q,N值,直到已打印出其中的4个值为止。


public static void main(String[] args) {
 PrimeGenerator g = new PrimeGenerator();
 int count = 0;
 while (count < 4) {      
  P p = new P(g.next());
  Q q = new Q(p);
  if(q.isJudagrali()) {
    N n = new N(q );
    if(n.isJudagrali()) {
      System.out.println("P :" +p.value + " Q: "+q.value + "  N :"+n.value);
      count++;
    }
  }
 }
} 
无需测试P是否为素数,因为希望我们的素数生成器是正确的!

From: https://bytes.com/topic/algorithms/insights/857844-judagrali-series

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值