2013-02-08 3 views
1

숫자의 소수 요소 배열을 생성했습니다. 이것은 어려운 부분입니다. 그러나 동일한 수의 약수 목록을 만들려면 모든 주요 요소를 가능한 모든 방법으로 결합해야합니다. 내가 PHP로하기 위해 고심하고있는 것.PHP 배열 제품 조합

는 예를 들어 I는 배열 가지고 수가 156,456위한

2 
2 
2 
3 
3 
41 
53 

을 ...; 그들을 모두 모으고 번호로 돌아 가라. 내가해야 할 일은 모든 듀오를 함께 번식하는 것입니다. 2x2, 2x3, 2x53 등등 그리고 마지막으로 6 개 7 블록을 곱할 때까지 모든 3 개를 같이 사용합니다.

이렇게 많은 수의 4, 6, 8, 9, 12 등의 모든 제수를 가진 매우 큰 배열을 얻을 수 있습니다. 나는 내가 원하는 제수의 배열에 위의 배열을 얻는 것처럼 보일 수 없다. 배열의 모든 가능한 요소의 조합을 곱하는 경우입니다. PHP 함수가 있습니까? 지금까지 검색 결과가 없습니다.

+0

중복을 제거하기 위해 [array_unique] (http://php.net/array_unique)를 사용하십시오. – MarcDefiant

+0

공식적인 PHP 기능은 없습니다. 당신은 자신의 알고리즘을 작성해야합니다. 또는 오픈 소스 구현을 찾아보십시오. –

+0

누구나 올바른 방향으로 한 지점을 줄 수 있습니까? 내 추측에 따르면 배열에 몇 개의 요소가 있는지 알아 내서 루프를 돌릴 수 있습니다. 위의 경우 6 개의 루프를 사용하여 어디에서 듀오를 가져 왔는지, 그래도 구현 방법을 모르겠다. – user1967034

답변

1

http://mathcentral.uregina.ca/QQ/database/QQ.02.06/joe1.html이 페이지를 읽은 후 제대로 작동하지 않을 수도 있습니다. 가장 효율적인 솔루션이 아니며 32 비트 시스템에서는 count($primes) <= 32으로 제한됩니다. 당신이 더 필요한 경우 자유롭게 사용할 느낌 Bitset :

이 다음 약수로 결과
$primes = Array(2, 2, 2, 3, 3, 41, 53); 
$num_primes = count($primes); // 7, if this is over 32, it won't work on 32bit systems 
$divisors = Array(); 

// number of possible combinations 
$limit = pow(2, $num_primes) - 1; // 127 

// count a number up and use the binary 
// representation to say which index is 
// part of the current divisor 
for($number = 0; $number <= $limit; $number++) { 
    $divisor = 1; 
    // only multiply activated bits in $number to the divisor 
    for($i = 0; $i < $num_primes; $i++) { 
     $divisor *= ($number >> $i) & 1 ? $primes[$i] : 1; 
    } 
    $divisors[] = $divisor; 
} 

echo implode(", ", array_unique($divisors)); 

: 당신은 모든 가능한 서로 각각의 주요 요인을 곱하면 필요한 모든 약수를 찾으려면

1, 2, 4, 8, 3, 6, 12, 24, 9, 18, 36, 72, 41, 82, 164, 328, 123, 246, 492, 
984, 369, 738, 1476, 2952, 53, 106, 212, 424, 159, 318, 636, 1272, 477, 
954, 1908, 3816, 2173, 4346, 8692, 17384, 6519, 13038, 26076, 52152, 19557, 
39114, 78228, 156456 

콤비네이션. 이렇게하려면 가능한 조합의 수를 계산합니다 ($limit). 지금이 한계에 번호를 계산하면 이진 표현은 다음과 같은 :

7 bit 
<-----> 
0000000 0 
0000001 1 
0000010 2 
0000011 3 
0000100 4 
0000101 5 
0000110 6 
0000111 7 
0001000 8 
0001001 9 
... 
1111110 126 
1111111 127 

$number의 현재 이진 표현이 $primes의 인덱스는 현재 $divisor을 계산하는 데 사용되는 나타냅니다. 이를 더 잘 나타내려면 $number = 5, 즉 0000101을 이진수로 사용하십시오. $divisor에 대한 계산은 2 * 1 * 2 * 1 * 1 * 1 * 1 = 4이됩니다. 첫 번째와 세 번째 비트 만 설정되므로 배열의 첫 번째와 세 번째 요소 만 계산에 사용됩니다.

조금 더 명확하게되기를 바랍니다.

+0

내가 말할 수있는 것은 무엇입니까? 첫 번째 숫자가 32 개 이상의 주요 계승으로 무엇인지 알아볼 것입니다. 그렇지 않으면 질문에 매우 잘 대답했습니다. 고맙습니다. – user1967034

+0

... 실제로 2^33 여야합니다. 8,589,934,592는 내가 갈 필요가있는만큼 높고 문제는 해결됩니다. – user1967034