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

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

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

定義:

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

\(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\)ui

整除:

定義:若是\(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\)。(證實以下)spa

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

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

    \(\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)\)blog

  • \(b|a,a\neq 0\),則有\(|b| \leq |a|\)。(證實以下)ci

    \(\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;
}

若是更改題意,給出\(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;
}

這個時候就要用到另外一種方法。即:
2.倍數法:
對於任意數\(x\)\(1-N\)中以\(x\)爲約數的數就是\(x,2x,3x\cdots \lfloor N/x \rfloor*x\)。時間複雜度爲\(O(N \lg N)\)
消耗時間以下:

代碼以下:

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

#define N 100860

vector<int> a[N];

int n;

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

    clock_t start = clock();

    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n/i; ++j)
            a[i*j].push_back(i);
    for(int i=1; i<=n; ++i) {
        for(int j=0; j<a[i].size(); ++j) {
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    }

    clock_t ends = clock();

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

GCD和LCM:

定義:

1.設\(a\)\(b\)是兩個整數,若是\(d|a\)\(d|b\),則稱\(d\)\(a\)\(b\)的公因子。
2.設\(a\)\(b\)是兩個不全爲\(0\)的整數,能使\(d|a\)\(d|b\)成立的最大整數\(d\),稱它爲\(a\)\(b\)的最大公因子,或最大公約數,即\(gcd(a,b)\)
3.設\(a\)\(b\)是兩個不全爲\(0\)的整數,能使\(a|d\)\(b|d\)成立的最小整數\(d\),稱它爲\(a\)\(b\)的最小公因子,即\(lcm(a,b)\)

例題:

若是咱們把\(A\)分解成了\(2^{a_1}3^{a_2}5^{a_3}\cdots\),把\(B\)分解成了\(2^{b_1}3^{b_2}5^{b_3}\cdots\)如何快速求\(gcd(A,B)\)。(解以下)

\(\because 假設d=gcd(A,B)\)
\(\therefore d|A,d|B,d最大\)
\(d=2^{p_1}3^{p_2}5^{p_3}\cdots\)
\(\therefore p_1 \leq a_1,p_1 \leq b_1\)
\(p_2 \leq a_2,p_2 \leq b_2\)
\(\cdots\)
\(p_1=min(a_1,b_1),p_2=min(a_2,b_2),\cdots\)
\(又\therefore d=2^{min(a_1,b_1)}3^{min(a_2,b_2)}\cdots\)

2.如何快速求\(lcm(A,B)\)。(解以下)

\(把min換成max便可\)
\(\because 設c=lcm(A,B)\)
\(\therefore c=2^{max(a_1,b_1)}3^{max(a_2,b_2)}\cdots\)

\(gcd(A,B)*lcm(A,B)=A*B=c*d\)

歐幾里得算法:

即展轉相除法。時間複雜度爲\(O(\lg n)\)
\(gcd\)(給出\(a,b\)):

\(引理:若a>b,則gcd(a,b)=gcd(a-b,b)\)
\(證:1.顯然a-b,b的公因數也是a,b的公因數。\)
\(2.a,b的公因數也確定是a-b,b的公因數。\)
\(3.a,b的公因數集合與a,b的如出一轍,最大的固然也同樣。(更相減損術)\)
\(因此解得gcd(a,b)=gcd(a, a\bmod b)=gcd(a\bmod b,b)\) \(↰\)

\(↑\)

再證實一下上面的式子?\(↑\)

\(設c(a,b)表示a,b的全部公因數的集合,則gcd(a,b)是r(a,b)中最大的。\)
\(先嚐試證實:a>b時,gcd(a,b)=gcd(a,a-b)(過程在上面)\)
\(要證這個,只需證r(a,b)=r(a,a-b)\)
\(假設d是a,b的公因數\)
\((那麼必然存在兩個整數p,q)使得a=pd,b=qd→d(p-q)=a-b\)
\(a,b的公因數確定是a,a-b的公因數,反之成立\)
\(gcd(a,b)=gcd(a,a\bmod b)(一直減一個數,餘下的即是a\bmod b的餘數)\)
\(舉例:\)
\(a=20,b=3\)
\(即gcd(20,3)→(17,3)→(14,3)→(11,3)→(8,3)→(5,3)→(2,3)\)

Code:

inline int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
    //return b==0 ? a : gcd(b,a%b);     
}

一條性質:
\(f[n]\)爲斐波那契數列的第\(n\)項,則有\(gcd(f[a],f[b])=f(gcd[a,b])\)

計算\(lcm\)
\(lcm=a/gcd(a,b)*b\)
錯誤作法:
\(lcm=a*b/gcd(a,b)\)(會爆int)

互質:

\(gcd(a,b)=1\),那麼\(a\perp b\)

基本定理:

1.對於任意兩個質數\(n,m\)\(n\perp m\)
2.對於任意兩個相鄰的整數\(n,m\)\(n\perp m\)
3.若\(a=1\),對於任意一個天然數\(m\)\(a\perp m\)
4.一個質數\(m\),一個合數\(n\),若\(n\)不是\(m\)的倍數,\(n\perp m\)

同餘:

定義:

若兩個整數\(a,b\),且它們的差\(a-b\)可以被某個天然數\(m\)所整除,則稱\(a\)\(b\)對模\(m\)同餘。記做\(a\equiv b(\bmod m)\),若\(m\)的值能夠由上下文推出時,簡寫爲\(a\equiv b\)

性質:

1.自反性:\(a\equiv a\)
2.對稱性:若\(a\equiv b\),則%b\equiv a%。
3.傳遞性:若\(a\equiv b,b\equiv c\),則\(a\equiv c\)
4.同加性:若\(a\equiv b\),則\(a+c\equiv b+c\)
5.同乘性:(1)若\(a\equiv b\),則\(a*c\equiv b*c\)
(2)若\(a\equiv b,c\equiv d\),則\(a*c\equiv b*d\)
6.同冪性:若\(a\equiv b\),則\(a^n\equiv b^n\)
7.同餘式相加:若\(a\equiv b,c\equiv d\),則\(a\pm c\equiv b\pm d\)
8.同餘式相乘:若\(a\equiv b,c\equiv d\),則\(ac\equiv bd\)
以上性質都是很顯然的。

容斥原理:

基本思想:

在計算的時候,老是會有遺漏或者是重複計算的部分,爲了使重複計算的部分不被重複計算,能夠先算出全部可能,而後再把重複計算的部分減去。

舉例:

假設某虎有\(A\)個妹子,cgp有\(B\)個妹子,他們想要知道他們一共有多少個不一樣的妹子(每一個人都有不少,總會有相同妹子)。
先用兩個圓圈表示出每一個人所擁有的妹子。

then。

那麼紅色的部分表明的是兩我的都有的妹子。
如何計算他們倆一共有多少種不一樣的妹子?
就須要先把他倆所擁有的妹子加起來,而後再減去紅色的部分都有的妹子,就是所求。
\(A\cup B=A+B-A\cap B\)
那麼再假設某虎依舊有\(A\)個妹子,cgp依舊也有\(B\)個妹子,忽然sjp來了,sjp也有妹子,sjp忽然也對這產生興趣,因而某虎有\(A\)個妹子,cgp有\(B\)個妹子,sjp有\(C\)個妹子,他們想要知道他們一共有多少種不一樣的妹子(每一個人都有不少,總會有相同妹子)。
那麼咱們先用三個圓圈表示出每一個人所擁有的妹子。

then。

那麼藍色的部分表明的是三我的都有的妹子,綠色的部分表明的是某虎和cgp都有的妹子,橙色的部分表明的是cgp和sjp都有的妹子,紫色部分表明的是某虎和sjp都有的妹子。
那麼如何計算他們仨一共有多少種不一樣的妹子?
就須要先把他們仨所擁有的妹子都加起來,而後再減去綠色的,紫色的,橙色的部分相同的妹子,最後再加上藍色的部分的妹子,就是所求。
\(A\cup B\cup C=A+B+C-A\cap B-A\cap C-B\cap C+A\cap B\cap C\)

相關文章
相關標籤/搜索