1. 程式人生 > >一篇不大正經的關於數論的總結(未完

一篇不大正經的關於數論的總結(未完

image 個數 return The 高斯 end alt http 約數和

頂函數(\(\lceil {x} \rceil\))、底函數(\(\lfloor {x} \rfloor\)):

常稱之為高斯(取整)函數。

定義:

頂函數:\(\geq {x}\)的最小整數。
底函數:\(\leq {x}\)的最大整數。
舉個例子:

\(1.\lceil {1.5} \rceil=2\)
\(2.\lfloor {1.5} \rfloor=1\)
\(3.\lceil {-1.5} \rceil=-1\)
\(4.\lfloor {-1.5} \rfloor =-2\)

帶余除法:

定義:

\(對於任意整數a,b(a\geq b,b\neq 0),\)\(存在q,r,滿足a=qb+r(0\leq r \leq |b|),且q,r唯一\)


我們把a叫做被除數,b叫做除數,q叫做商,r叫做余數。
可以證明\(q=\lfloor \left (\frac {a}{b}\right )\rfloor,r=a-b\lfloor \left(\frac {a}{b} \right)\rfloor\)(證明如下)

\(\because這個是很顯然的\)
\(\therefore q=\lfloor \left (\frac {a}{b}\right )\rfloor,r=a-b\lfloor \left(\frac {a}{b} \right)\rfloor\)

整除:

定義:如果\(a\)能把\(b\)除盡,余數為0,那麽就說是\(b\)
\(a\)整除,即\(a|b\)

整除的性質:

  • 自反性:對於任意\(n\),有\(n|n\)
  • 傳遞性:若\(a|b,b|c\),那麽\(a|c\)
  • 反對稱性:若\(a|b,b|a\),即\(a=b\)。(對稱性:若\(a\)滿足\(b\cdots\)關系,那麽\(b\)也滿足\(a\cdots\)關系)
  • \(b|a,c|b\),則\(c|a\)。(證明如下)

    \(\because b|a,c|b\)
    \(\therefore(所以必然存在兩個整數x,y)使得a=xb\)\(b=yc\)
    \(又\therefore a=xyc\)
    \(\because a/c=xy\)
    \(\therefore c|a\)

  • \(c|a,c|b\),則對任意數\(x,y\),必有\(c |(ax+by)。\)(證明如下)

    \(\because c|a,c|b\)
    \(\therefore (所以必然存在兩個整數p,q)使得a=pc\)\(b=qc\)
    \(又\therefore c |(pcx+qcy)\)
    \(c|c(px+qy)\)
    \(\because 兩邊都有c\)
    \(\therefore c(px+qy)是c的倍數\)
    \(又\therefore c|(ax+by)\)

  • \(b|a,a\neq 0\),則有\(|b| \leq |a|\)。(證明如下)

    \(\because b|a\)
    \(\therefore (所以必然存在一個整數q)使得a=qb\)
    \(又\therefore a是b的倍數,|b| \leq |a|\)

  • \(b|a,a\neq 0\),則\(\left( \frac ab \right)|a\)。(證明如下)

    \(\because b|a\)
    \(\therefore (所以必然存在一個整數q)使得a=qb\)
    \(又\therefore \left( \frac {a}{b} \right)=\left( \frac {qb}{b} \right)=q\)
    \(\because a是q的倍數\)
    \(\therefore q|a\)
    \(又\therefore \left(\frac{a}{b}\right)|a\)

  • \(b|a,c|a,b\bot c\),則\(bc|a\)。(舉例如下)

    \(1.當a=12,b=1,c=6時,1|12,6|12,1\bot12,6|12。\)
    \(2.當a=72,b=8,c=9時,8|72,9|72,8\bot9,72|72。(自反性:72|72)\)

  • \(a|b,b|a\),則\(|a|=|b|\)。(反對稱性)
  • \(a|b\),對任意整數\(c\),則\(a|bc\)。(證明如下)

    \(\because a|b\)
    \(\therefore b=xa,b是a的倍數\)
    \(又\therefore乘上任意整數c,bc依舊是a的倍數\)
    \(又\therefore a|bc\)

  • \(a|b\),對於任意整數\(m(m\neq0)\),則\(ma|mb\)。(證明如下)

    \(\because 這是顯然的\)
    \(\therefore ma|mb\)

    唯一分解定理(算術基本定理):

    \(n=p_1^{r_1}*p_2^{r_2}*\cdots\)
    其中\(p_i\)是質數,\(p_1=2,p_2=3 \cdots\)以此類推

    結論:

    \(p\)為質數,對於任意整數\(a\),則有\(p|a\)或者\((p,a)=1\)。(證明如下)

    \(\because p為質數\)
    $\therefore a要麽是p的倍數,要麽p\perp a。 $
    \(又\therefore p|a或者(p,a)=1\)

    約數和倍數:

    推論:

    在算術基本定理中,若\(N\)被唯一分解為\(N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}\),其中\(c_i\)是正整數,\(p_i\)是質數且滿足\(p_1<p_2<\cdots p_m\),則\(N\)的正整數集合可寫作\(:\)

    {\(p_1^{b_1}p_2^{b_2}\cdots p_m^{b_m}\)},其中\(0\leq b_i \leq c_i\)

    N的正約數個數為\(:\)
    \[(c_1+1)*(c_2+1)*\cdots*(c_m+1)=\prod_{i=1}^{m}(c_i+1)\]
    \(N\)的所有正約數之和為\(:\)
    \[(1+p_1+p_1^2+\cdots+p_1^{c_1})*\cdots*(1+p_m+p_m^2+\cdots+p_m^{c_m})=\prod_{i=1}^{m}(\sum_{j=0}^{c_i}(p_i)^{j})\]

    定義:

    \(a|b,a\)\(b\)的約數,\(b\)\(a\)的倍數,稱\(a\)\(b\)的因子(對於任何數\(n\),至少有兩個因子\(1\)\(n\)本身,稱它們為\(n\)的平凡因子,其他即為非平凡因子)。特別的,任何正整數都是\(0\)的約數。

    約數的求法:

    1.試除法:
    因為約數總是成對出現,所以只需要從\(1\) ~\(\sqrt{n}\)。時間復雜度\(:O(\sqrt{n})\)
#include"bits/stdc++.h"
#include<time.h>
using namespace std;

#define N 10086

int a[N];

int n;

int cnt=0;

int main(void) {
    ios::sync_with_stdio(false);
    cin>>n;

    //clock_t start = clock();
    
    for(int i=1; i<=sqrt(n); ++i) {
        if(n%i==0) {
            a[++cnt]=i;
            if(n/i!=i) a[++cnt]=n/i;
        }
    }
    for(int i=1; i<=cnt; ++i) cout<<a[i]<<" ";
    
    //clock_t ends = clock();
    
    //cout<<"\n Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
    
    return 0;
}
2.倍數法:

如果更改題意,給出\(l,r\),要求求\(l-r\)之間的每個數的正約數集合。那麽再用試除法,時間復雜度就為\(O(N\sqrt{N})\),變得有點惡心,特別是在\(N\)非常大的時候。譬如跑\(1-100000\)。消耗的時間如下:
技術分享圖片
運行代碼如下:

#include"bits/stdc++.h"
#include<time.h>
using namespace std;

#define N 10086

int a[N];

int n;

int cnt=0;

int l,r;

int main(void) {
    ios::sync_with_stdio(false);
    cin>>l>>r;

    clock_t start = clock();

    for(int j=l; j<=r; ++j) {
        memset(a,0,sizeof(a));
        cnt=0;
//      cin>>n;
        for(int i=1; i<=sqrt(j); ++i) {
            if(j%i==0) {
                a[++cnt]=i;
                if(j/i!=i) a[++cnt]=j/i;
            }
        }
        for(int i=1; i<=cnt; ++i) cout<<a[i]<<" ";
        cout<<"\n";
    }
    
    clock_t ends = clock();

    cout<<"\n Running time: "<<(double)(ends - start)/ CLOCKS_PER_SEC;
    return 0;
}

一篇不大正經的關於數論的總結(未完