1 回答
TA贡献1802条经验 获得超5个赞
首先,p² + 3pq + q² = r²使用三重嵌入式 for 循环来实现这个等式是没有意义的,这导致复杂度为O(n) = n^3. 这可以仅使用两个 for 循环来完成,因为如果我们知道 和 的值,p可以使用等式计算。qr
for (BigInteger p: possiblePValues) {
for (BigInteger q: possibleQValues) {
BigInteger r = p.pow(2).add(q.pow(2)).add(p.multiply(q).multiply(new BigInteger("3")))
// decide if sqrt(r) is prime
}
}
现在,如果我们将预先计算的素数保存在一个Hashmap例子中,我们可以r通过查找立即确定是否是素数。
关于并行化:您的方法是错误的,因为您只是为一些需要相对较短的时间才能完成的操作生成线程。线程管理的开销可能比计算方程本身的操作花费的时间更长。我猜这就是为什么多线程版本的运行时间更长的原因。关于如何并行化两个嵌入式 for 循环没有黄金法则。我的方法是根据您拥有的核心数量将第一个循环分成更小的块并创建一些间隔。例如,如果我们有 100 个素数和 4 个线程,则第一个线程将采用p索引从 0 到 24 的值,第二个线程将采用索引从 25 到 49 的值,依此类推。第二个 for 循环应该在每个线程中从 0 运行到 100。使用这种方法,您可以计算所有可能的r价值观。
添加回答
举报