2010-05-19 2 views
2

PHP에서 가장 큰 소수 요소를 찾기 위해 프로그램을 작성했습니다. 꽤 빨리로드되기 때문에 꽤 최적화 된 것 같습니다. 그러나 문제가 있습니다. 매우 큰 숫자의 주요 요인을 계산하지 않습니다. 여기에 프로그램입니다 :PHP에서 가장 큰 소수 요소

function is_even($s) {  
    $sk_sum = 0;   
    for($i = 1; $i <= $s; $i++) {   
     if($s % $i == 0) { $sk_sum++; }   
    } 
    if($sk_sum == 2) {   
     return true;    
    }   
} 

$x = 600851475143; $i = 2; //x is number  
while($i <= $x) { 
    if($x % $i == 0) { 
     if(is_even($i)) { 
      $sk = $i; $x = $x/$i; 
     } 
    } 
    $i++; 
} 
echo $sk; 
+0

나는'is_even'을'is_prime'으로 이름을 바꾸고 함수의 마지막 줄에서 false를 반환하도록합니다. 또한 루프에 $ i = 1 또는 $ i = $ s를 포함 할 필요가 없으며 다른 숫자로 나눌 수있는 경우 false를 반환 할 수 있습니다. – catchmeifyoutry

답변

7

PHP에서 넘칠 수없는 최대 정수는 PHP_INT_MAX 상수로 저장됩니다.

PHP에서는이 값보다 큰 정수로 작업 할 수 없습니다.

은 사용, PHP의 미리 정의 된 상수를 모두 보려면 :

<?php 
echo '<pre>'; 
print_r(get_defined_constants()); 
echo '</pre>'; 
?> 

PHP_INT_MAX 아마 2,147,483,647의 값을 갖는다.

PHP에서 임의의 정밀도를 처리하려면 GMP 또는 BC Math PHP 확장을 참조하십시오.

0

글쎄, 모든 언어는 (동안 일반적으로 같은) 제한 자신의있다, 그래서 당신이 PHP의 한계를 초과하는 경우, 당신은 어떤 더 얻을 수 없습니다. 최대 정수는 9E18입니다.

+1

물론 한계를 확장 할 수 있습니다. 임의로 큰 숫자를 MAX_INT보다 작은 숫자의 배열로 저장하고 표준 연산자를 제공하는 클래스 (또는 라이브러리 찾기)를 작성하면됩니다. – tloach

+1

PHP에서 임의로 큰 숫자를 처리하는 GMP 및 BC 수학 확장에 대한 링크는 내 대답을 참조하십시오. – Dolph

+0

당신이 제안하는 것이 좋은 해결 방법입니다. 그러나 주어진 제한을 초과 할 수는 없습니다. –

5

Prime testingSieving을 읽어야합니다.

특히, 각 약수가 소수인지 테스트 할 필요가 없습니다.

다음과 같은 것이 더 빠를 것입니다.

while($i <= $x) 
{ 
    while ($x % $i == 0) 
    { 
     $sk = $i; 
     $x = $x/$i; 
    } 
    $i++; 
} 

$ i가 SQRT ($의 X)에 도달 할 때 당신은 또한 당신의 외부 루프를 중지 할 수 있습니다, 당신은 아직 다음 제수를 발견하지 않은 경우 당신은 $ x는 소수 알고있다.