1. 程式人生 > 其它 >數論2約數的求法以及GCD和LCM

數論2約數的求法以及GCD和LCM

技術標籤:演算法學習gcd數學

約數

1.定義:若整數n除以d的餘數為0,即d能整除n,則稱d為n的約數,n是d的倍數,記為d|n。

算數基本定理的推論:

任何一個大於1的自然數 N,如果N不為質數,那麼N可以唯一分解成有限個質數的乘積N=P1^a1 * P2^a2 * P3^a3…* Pn ^an,這裡P1<P2<P3…<Pn均為質數,其中指數ai是正整數.

那麼正約數的個數為(a1+1) * (a2+1) … (an+1)
所有正約數的和為:(1+p1+p1^ 2+…+ p1^c1)* … *(1+pn+pn^ 2+…+ pn^cn)

求一個數的約數的集合:
1.試除法,時間複雜度為O(n根號n),由於太過簡單便不多加贅述

2.倍數法:反過來考慮,某個數d,其中以d為約數的數即為d的倍數,這樣時間複雜度是O(nlogn),方法有點類似篩法

二.最大公約數(GCD)以及最小公倍數(LCM)
關於定義也不多加贅述
有這樣一個性質:兩個數的乘積等於其最大公約數乘最小公倍數

關於最大公約數的求法,最為常用的便是歐幾里得演算法,即對於任意兩個整數a,b,如果b不為0,那麼gcd(a,b)=gcd(b,a mod b)
證明:1.如果 a<b,那麼gcd(b,a mod b)=gcd(b,a)恆成立
2.如果a>=b,那不妨設a=qb+r,其中 0<=r<b,則r=a mod b,那麼對於任何a與b的公約數d,有d|a,d|(q

b),故d|(a-q*b)即d|r,因此d也是b和r的約數,因此對於所有約數,都滿足該性質,故它們的最大公約數也相同
時間複雜度為O(log(a+b))
這裡給出模板:

 int gcd(int a,int b)
 {
      return b?gcd(b,a%b):a;
 }