Project Euler -- 3 Largest prime factor

Problem 3


Largest prime factor

The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?


求最大素因子
顾名思义,就是求素数,判断是否为给定数的因子.

于是解题思路出现,从2开始求素数,每得到一个素数(注意:偶数无需判断),就与给定数求余,若余数为零,则为因子,商作为新的给定数,重复.
当给定数为1时,循环结束.
实现后如愿得到结果.

再想,当倒数第二个因子得到后,最后一个因子再无因子,但循环仍要继续,直到循环变量为最后一个因子.
可以想到,在这个过程中,程序只是在无意义的判断素合性.
优化1出现,每次将商作为新的给定数,判断该给定数是否为素数,若为素数,则循环应结束.
效果很明显,运行时间从3ms下降到1ms.
简单分析,这其中对较大给定数进行了多次检验,但与最后一个因子之前的无效过程相比,运算明显减小.

再想,求解素数这个过程是朴素的试除.
假想,如果采用了Miller-Rabin素数检测方法,那么,仔细想想,其实效率不会有很大提高,原因是,虽然过程中有素数检测部分,但总体上是
一个求素数序列的过程,对于求素数,MR表现并不比试除好多少.

对于Miller-Rabin和Pollard的rho启发方法,之后练习.


code:

package org.lzim.euler;

/**
 * Created by ManD on 2015/5/7.
 */

/**
 * Problem 3
 * Largest prime factor
 * The prime factors of 13195 are 5, 7, 13 and 29.
 * What is the largest prime factor of the number 600851475143 ?
 */
public class three {
    /*  暴力试探素因子           runtime average : 3ms   */
    /*  加:判断商是否为素数       runtime average : 1ms   */
    public static boolean isPrime(long num){
        int ii=(int)Math.sqrt(num);
        int j =2;
        while (j<ii) {
            if (num%j == 0) break;
            j++;
        }
        return j == ii;
    }
    public static void main() {
        long term = 600851475143L;
        long t1 = System.currentTimeMillis();
        for (int i = 3; term != 1; i+=2) { // 去除偶数
            if ((isPrime(i)) && (term % i == 0)) {
                System.out.println(i);
                term /= i;
                if (isPrime(term)) {
                    System.out.println(term);
                    break;
                }
            }
        }
        long t2 = System.currentTimeMillis();
        System.out.println("\nIt run "+(t2 - t1)+" ms");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章