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");
}
}