【问题标题】:Parallel prime factorization [duplicate]并行素数分解
【发布时间】:2013-05-08 13:43:14
【问题描述】:

有谁知道并行素数分解算法的方法是什么?

我不知道应该在算法的哪个阶段将其划分为线程.. 我如何以并行方式考虑素数分解?

考虑以下一个线程代码:

    public static void  primeFactorization(ArrayList<Integer> factors, int num){
        //factors is an array to save the factorization elements
        //num is the number to be factorized 
        int limit = num/2+1;

        if(isPrime(num))
            factors.add(num);

        else{
            while(num%2==0){
                factors.add(2);
                num=num/2;
            }

           for (int i=3; i<limit; i+=2){
               while (isPrime(i) && num%i==0){
                   factors.add(i);
                    num = num/i;
               }
           }
       }
    }

    private static boolean isPrime(int x) {
          int top = (int)Math.sqrt(x);
          for (int i = 2; i <= top; i++)
             if ( x % i == 0 )
                return false;
          return true;
    }

【问题讨论】:

  • 你能解释一下什么是并行素数分解,它应该做什么?
  • 您可以一次检查多个数字是否为素数,首先。
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • 您会希望 for 循环的每次迭代都在自己的线程中。
  • 无需为自己辩解。你可以问尽可能多的问题。

标签: java


【解决方案1】:

看起来这对于Fork/Join Framework 来说可能是一个非常好的用途。似乎您应该能够通过递归传递您找到的新因子来使用它。试着看看RecursiveAction。在伪代码中,您应该能够执行以下操作:

public void getFactors(List<Integer> factors, int num){
    if(you can find a factor){
        add the two factors to the pool to be factored further
    }
    else{
        factors.add(num);
    }  
}

附带说明,如果您从中间 (num/2) 开始并从那里开始而不是从 1 开始,它可能会有更好的性能。

【讨论】:

  • 其实它甚至不需要框架。他只需要为找到的每个因子生成一个新线程,然后使用某种同步对象来收集所有因子。
  • 我为什么要为一个因子创建一个线程?这是一个素数,所以没有什么可以计算的了。为什么它需要一个线程?
  • 您不需要线程作为因子,您可以使用线程池(fork/join 框架内置)。你基本上可以分解寻找因素的任务。当你找到一个新因素时,将这两个新因素都投入池中以进一步分解。
  • 我刚刚有了一个想法……每个自然数只有一个因式分解……我可以通过创建 4 个线程来利用这个事实,每个线程将检查不同范围内的可除素数数字..第一个线程将寻找 2 到 50 之间的素数.. 等等...然后我找到的所有这些素数都将是我的因式分解..
  • 我不确定这是要走的路。您需要小心不要包含重复的值。例如,一个线程可能会发现 2*25=50,而另一个线程也可能会发现 25*2=50。使用某种形式的线程池可能更安全,其中每个因素都被添加到池中以进一步分解。这样可以避免包含重复数字的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多