質因數分解及代碼:


每個合數都可以寫成幾個質數相乘的形式,這幾個質數就都叫做這個合數的質因數如果一個質數是某個數的因數,那么就說這個質數是這個數的質因數。而這個因數一定是一個質數。

定義

質因數(或 質因子)在 數論里是指能整除給定正 整數質數兩個沒有共同質因子的正整數稱為互質。因 為1沒有質因子,1與任何正整數(包括1本身)都是互質正整數的因數分解可將正整數表示為一連串的質因子相乘,質因子如重復可以指數表示。根據算術基本定理 任何正整數皆有獨一無二的質因子分解式。只有一個質因子的正整數為質數。

例子

  • 1沒有質因子。
  • 5只有1個質因子,5本身。(5是質數。)
  • 6的質因子是2和3。(6 = 2 × 3)
  • 2、4、8、16等只有1個質因子:2(2是質數,4 = 2,8 = 2,如此類推。)
  • 10有2個質因子:2和5。(10 = 2 × 5)
就是一個數的 約數,並且是 質數,比如8=2×2×2,2就是8的質因數。12=2×2×3,2和3就是12的質因數。把一個式子以12=2×2×3的形式表示,叫做 分解質因數。16=2×2×2×2,2就是16的質因數, 把一個合數寫成幾個質數相乘的形式表示,這也是分解質因數[1]
分解質因數的方法是先用一個合數的最小質因數去除這個合數,得出的數若是一個質數,就寫成這個合數相乘形式;若是一個合數就繼續按原來的方法,直至最后是一個質數 。
分解質因數的有兩種表示方法,除了大家最常用知道的“短除分解法”之外,還有一種方法就是“塔形分解法”。
分解質因數對解決一些 自然數乘積的問題有很大的幫助,同時又為求 最大公約數最小公倍數做了重要的鋪墊。

計算方法

短除法
求一個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法,和除法的性質差不多,還可以用來求多個個數的公因式
最大公因數的一種方法,也可用來求 最小公倍數
求幾個數最大公因數的方法,開始時用觀察比較的方法,即:先把每個數的因數找出來,然后再找出公因數,最后在公因數中找出最大公因數。
 
例如:求12與18的最大公因數。
12的因數有:1、2、3、4、6、12。
18的因數有:1、2、3、6、9、18。
12與18的 公因數有:1、2、3、6。
12與18的最大公因數是6。
這種方法對求兩個以上數的最大公因數,特別是數目較大的數,顯然是不方便的。於是又采用了給每個數分別分解質因數的方法。
12=2×2×3
18=2×3×3
12與18都可以分成幾種形式不同的乘積,但分成質因數連乘積就只有以上一種,而且不能再分解了。所分出的質因數無疑都能 整除原數,因此這些質因數也都是原數的約數。從分解的結果看,12與18都有 公約數2和3,而它們的乘積2×3=6,就是 12與18的最大公約數。
采用分解質因數的方法,也是采用短除的形式,只不過是分別短除,然后再找 公約數和最大公約數。如果把這兩個數合在一起短除,則更容易找出 公約數和最大公約數。
從短除中不難看出,12與18都有 公約數2和3,它們的乘積2×3=6就是12與18的最大公約數。與前邊分別分解質因數相比較,可以發現:不僅結果相同,而且 短除法 豎式左邊就是這兩個數的公共質因數,而兩個數的最大公約數,就是這兩個數的公共質因數的連乘積。
實際應用中,是把需要計算的兩個或多個數放置在一起,進行短除。
在計算多個數的最小公倍數時,對其中任意兩個數存在的約數都要算出,其它無此約數的數則原樣落下。最后把所有約數和最終剩下無法 約分的數連乘即得到最小公倍數。
只含有1個質因數的數一定是 虧數
(短除法詳解:
短除符號就是除號倒過來。短除就是在除法中寫 除數的地方寫兩個數共有的 質因數,然后落下兩個數被公有質因數整除的商,之后再除,以此類推,直到結果 互質為止(兩個數互質)。
而在用短除計算多個數時,對其中任意兩個數存在的因數都要算出,其它沒有這個因數的數則原樣落下。直到剩下每兩個都是 互質關系。
求最大公因數 乘一邊,求最小公倍數 乘一圈。
公約數:亦稱“公 因數”。是幾個整數同時均能整除的整數。如果一個整數同時是幾個整數的約數,稱這個整數為它們的“公約數”;公約數中最大的稱為最大公約數。)
在用短除計算多個數時,對其中任意兩個數存在的因數都要算出,其它沒有這個因數的數則原樣落下。直到剩下每兩個都是互質關系。求最大公約數遍乘左邊所有數公共的因數,求最小公倍數遍乘一圈。這種方法對求兩個以上數的最大公因數,特別是數目較大的數,顯然是不方便的。於是又采用了給每個數分別 分解質因數 的方法
 
Pollard Rho因數分解
1975年,John M. Pollard提出了第二種因數分解的方法,Pollard Rho快速因數分解。該算法時間復雜度為O(n^(1/4))。
 
分解質因數代碼:
將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
程序分析:對n進行分解質因數,應先找到一個最小的質數k,然后按下述步驟完成: 
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數你n,
 重復執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。
#include "stdio.h"
#include "conio.h"
main()
{
  int n,i;
  printf("\nplease input a number:\n");
  scanf("%d",&n);
  printf("%d=",n);
  for(i=2;i<=n;i++)
    while(n!=i)
    {
      if(n%i==0)
      {
        printf("%d*",i);
        n=n/i;
      }
      else
        break;
    }
  printf("%d",n);
  getch();
}

另一種形式:

//返回質因數數組  
Integer[] decPrime(int n) {  
    List<Integer> list = new ArrayList<Integer>();  
    for (int i=2;i <= n;i++){  
        while(n != i){  
            if(n%i != 0){  
                break;//不能整除肯定不是因數,能夠整除在這里一定是質數。因為所有的2,3,5,7  
                      //都被除完之后。剩下的因數只能是奇數,且是質數。  
            }  
            list.add(Integer.valueOf(i));  
            n = n/i;  
        }  
    }  
    list.add(Integer.valueOf(n));  
    return list.toArray(new Integer[list.size()]);  
}  

 另外代碼:

。我們用所有正整數試驗一下,從2開始進行試除,逐步增加除數的值,去尋找一個可以整除n的數。在Eratosthenes篩法的討論中,我們知道如果n是一個復合數,那么它就會有一個素數 。算法9.3所示的就是這種方法的偽代碼。這個算法有兩個偱環路徑,外部的和內部的。外部循環求唯一因數,內部循環求一個因數的多個復本。例如, ,外部循環求出因數2和3。內部循環求出2是一個多因數。

void trial_divisio_fac(int n)
{
    int a=2;
    while(a*a<=n)
    {
        while(n%a==0)
        {
            cout<<a<<ends;
            n=n/a;
        }
        a++;
    }
    if(n>1) cout<<n;//n沒有因數
}

上面的代碼解釋比較清楚。為什么這種方法可以得到素數。

因為我們在內層循環中,已經把當前a的所有倍數都去除了。這跟埃斯托尼算法是一樣的

 

復雜度 如果 ,這種情況下試除法通常都是很有效的。但是如果用來分解更大的整數,試除法就變得非常低效甚至不可用了。這種算法的復雜度是隨着n的增加呈指數級別增長的。

試除法整數分解算法中最簡單和最容易理解的算法。

給定一個合數n(這里,n是待分解的整數),試除法看成是用小於等於\sqrt{n}的每個素數去試除待分解的整數。如果找到一個數能夠整除除盡,這個數就是待分解整數的因子。

).

例9.29

運用試除算法求1233的因數。

1233=3^2*137.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM