判斷質數和用算數基本定理分解質因數


超級詳細的基礎算法和數據結構合集:
https://blog.csdn.net/GD_ONE/article/details/104061907

摘要

本文主要講解如何判斷一個數是質數,和如何對一個數分解質因數。本文是很基礎的也很重要的數學知識。

質數

質數又稱爲素數,是指大於1的並且除了1和它本身外,沒有其他因數的自然數。

判斷一個數是否是質數

假設該數爲n, 我們只需要判斷[2, n\sqrt{n}]內是否有n的因子。如果有,則n爲合數,否則,n爲質數。

public static Boolean isprime(int n){
    if(n == 1) return false;
    for(int i = 2; i <= n / i; i++){
        if(n % i == 0){
            return false;
        }
    }
    return true;
}

注意:以上代碼中,for循環的結束條件是 i <= n/i,相當於i <= sqrt(n),兩種寫法都可以,只不過調用sqrt()函數會慢一些,因爲for循環每次循環都會調用該函數。另外,不能寫成i * i <= n
因爲當n很接近int的最大值時,i*i可能會溢出。

分解質因數

根據算術基本定理又稱唯一分解定理,對於任何一個合數, 我們都可以用幾個質數的冪的乘積來表示。
即: N=p1k1p2k2...pnknN = p_1^{k_1}*p_2^{k_2}*... *p_n^{k_n}p1<p2<...<pnp_1<p_2<...<p_n
如:
12=22312 =2^2*3
20=22520 = 2^2*5
30=23530 = 2*3*5

接下來我們利用這個公式分解質因數。
設一個質數爲p.如果n%p == 0,那麼p就是n的一個質因數,接下來就是求p的指數,我們讓n = n/p, 這樣就從n中剔除了一個p,接着重複上述兩步,直到n%p != 0

代碼:

public static void prime(int n){
    for(int i = 2; i <= n / i; i++){
        int a = 0, b = 0;
        while(n % i == 0){
            a = i;
            n /= i;
            b++;
        }
        if(b > 0)
            System.out.println(a + " " + b);
    }
    if(n > 1) System.out.println(n + " " + 1);
}

注意:以上代碼中for循環的結束條件也是i <= n / i,因爲根據公式,最多隻可能有一個質因數是大於n\sqrt{n},因爲有兩個的話,乘積肯定超過n了。所以當for循環結束後判斷n是否大於1,如果大於就說明有一個大於n\sqrt{n}的質因數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章