需要在素数因子分解的一部分中进行证明

时间:2015-02-11 08:46:47

标签: math proof prime-factoring number-theory

根据topcoder Link,我们需要计算直到数字的平方根来列出它的所有素数因子......现在我能够在下面的代码中证明我们做得正确直到我们在for loop ..但是我无法弄清楚为什么剩下的数字将是素数,即在我们离开循环之后if(n> 1)printf("%d",n);是什么让我烦恼..!你能不能给我一个正式的证据和例子......

 void factor(int n) 
 { 
   int i; 
   for(i=2;i<=(int)sqrt(n);i++) 
   { 
     while(n % i == 0) 
     { 
       printf("%d ",i); 
       n /= i; 
     } 
   } 
   if (n > 1) printf("%d",n); 
   printf("\n"); 
 } 

2 个答案:

答案 0 :(得分:1)

最初,该过程继续搜索小于其平方根的n的最小因子。 如果它没有,那么n是素数。因此打印出n,因为它是最小的一个主要因素!

如果找到最小的因子,那么它必须是素数。如果不是,它是复合的并且具有较小的素因子 - 矛盾。

找到最小的素数因子将n除以该因子以消除它(记住它可能是n == i*i*i*...i*r其中i是素因子而r是残差)。这就是while(n%i==0)循环中发生的事情。

最后,我们n持有该残留物。 所以现在我们想要r的最小素数因子。 我们知道最小的素因子是i。为什么?因为如果r的素因子小于i,那么我不是n的最小素因子。

因此我们可以通过r的试验分区来搜索i + 1到sqrt(r),以找到n的下一个最小素因子。 如果我们找不到任何且r> 1,那么r是最后的素因子。

继续归纳。

在每轮淘汰之后(进入while(n%i==0)循环内),我们知道一个数字没有素因子&lt; = i。

答案 1 :(得分:0)

粗略地说,对于i的每个因素n,都有一个辅助因子i',即i*i'=n,即n/i。不失一般性假设i=min{i,i'}。然后i<=sqrt(n)<=i'成立。实施旨在仅在忽略i的同时找到i';仅i的搜索空间就足够了。

因素i的每次出现都会被n /= i语句取消,这意味着n被因子i'取代。这里有两个案例需要考虑。在第一种情况下,该因子是素数,这意味着在连续迭代中不会找到任何因子。在第二种情况下,因子是复合的;这意味着它的因子小于sqrt(i')<sqrt(n)

但是,此因子必须大于i,因为i循环已消除while的所有出现。这意味着剩余因子位于i+1sqrt(n)之间,这将在连续迭代中找到。