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");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章