需要证明质因数分解的一部分

Needs a proof in a part of prime factorisation

根据 topcoder Link,我们需要计算数字的平方根以列出其所有质因数...现在我可以在下面的代码中证明我们做对了在for循环中..但我无法弄清楚为什么剩余的数字将是质数,即在我们退出循环后 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"); 
 } 

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

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

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

最初,该过程继续搜索小于其平方根的 n 的最小因数。 如果没有,则 n 是质数。所以打印出 n 因为它是一个最小的质因数!

如果你找到一个最小的因子,那么它一定是质数。如果不是,则它是复合的并且具有较小的质因数 - 矛盾。

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

最后我们 n 保留了那个残基。 所以现在我们想要 r 的最小质因数。 我们知道最小的质因数是 i。为什么?因为如果 r 的质因数小于 i 那么 i 就不是 n 的最小质因数。

所以我们可以继续搜索i+1到sqrt(r),通过对r的尝试划分来找到n的下一个最小质因数。 如果我们没有找到任何并且 r>1,那么 r 是最后一个质因数。

通过归纳进行。

在每一轮淘汰之后(进入 while(n%i==0) 循环)我们得到一个我们知道没有质因数的数字 <=i.