2013-05-08 2 views
3

병렬 소수 분해 알고리즘에 대한 접근 방법은 누구나 알 수 있습니까?병렬 기본 분해

알고리즘의 어느 단계에서 스레드로 나누어야하는지 알 수 없습니다. 병렬 분해 방법을 어떻게 생각합니까? 그것은 것 같다

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; 
    } 
+0

당신은 병렬 우선 분해가 무엇이고, 무엇을하기로되어 있는지 설명 할 수 있습니까? – Infested

+2

처음에는 소수 인 다수의 수를 확인할 수 있습니다. – Dariusz

+1

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. –

답변

0

이이 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) 년에 시작부터 거기에 반대에서 가면 더 나은 성능을 가지고 있습니다 의사 코드에서는 다음과 같은 일을 할 수 있어야 하나.

+0

실제로 프레임 워크가 필요하지 않습니다. 그는 발견 된 각 요소에 대해 새 스레드를 생성 한 다음 모든 요소를 ​​수집하기 위해 일종의 동기화 된 개체가 필요합니다. –

+0

왜 요인에 대한 스레드를 만들고 싶습니까? 그것은 소수이므로 더 이상 계산할 것이 없습니다 .. 왜 스레드가 필요합니까? – Ohad

+0

당신은 factor에 대한 쓰레드가 필요 없다. 쓰레드 풀링 (fork/join 프레임 워크가 내장되어있다.)을 사용할 수있다. 기본적으로 요인을 찾는 작업을 해할 수 있습니다. 새로운 것을 발견하면, 수영장으로 두 가지 새로운 요인을 던져 추가로 분해하십시오. –