數論2約數的求法以及GCD和LCM
阿新 • • 發佈:2021-01-13
約數
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
時間複雜度為O(log(a+b))
這裡給出模板:
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}