同餘與歐拉函數

1.同餘定理

定義1 :一般地,兩個整數a和b,除以大於1的自然數m所得的餘數相同,就稱a、b對於模m同餘,m在數學上被稱謂爲模(module)。記作:

a≡b(mod m)

讀作:a、b對於模m同餘

即:如果a與b除以m的餘數相同,那麼a與b的關係就是模m同餘關係。

 

同餘的其它定義形式

定義1:若m|(a-b),則稱a與b對模m同餘。

定義2:若a=mq+b,q∈Z,則稱a與b對模m同餘。

顯然,a≡0(mod m)等價於m|a

以上三種定義形式均爲餘數的定義,雖然表現形式不同,但實質是一致的。

例如:當a=8,b=5,m=3時,8和5除以3得到的餘數相等(均爲2),就可寫爲

8≡5(mod3)  或 3|(8-5) 或  8=3q+5

根據同餘定理,可得到同餘的基本性質

1.整除性

{\displaystyle a\equiv b{\pmod {m}}\Rightarrow c\cdot m=a-b,c\in \mathbb {Z} }a\equiv b{\pmod {m}}\Rightarrow c\cdot m=a-b,c\in \mathbb {Z}(即是說a和b之差是m的倍數
換句話說,{\displaystyle a\equiv b{\pmod {m}}\Rightarrow m\mid (a-b)}a\equiv b{\pmod {m}}\Rightarrow m\mid (a-b)

同餘可以用來檢驗一個數是否可以整除另外一個數。

2.傳遞性

{\displaystyle \left.{\begin{matrix}a\equiv b{\pmod {m}}\\b\equiv c{\pmod {m}}\end{matrix}}\right\}\Rightarrow a\equiv c{\pmod {m}}}\left.{\begin{matrix}a\equiv b{\pmod {m}}\\b\equiv c{\pmod {m}}\end{matrix}}\right\}\Rightarrow a\equiv c{\pmod {m}}

3.保持基本運算

{\displaystyle \left.{\begin{matrix}a\equiv b{\pmod {m}}\\c\equiv d{\pmod {m}}\end{matrix}}\right\}\Rightarrow \left\{{\begin{matrix}a\pm c\equiv b\pm d{\pmod {m}}\\ac\equiv bd{\pmod {m}}\end{matrix}}\right.}\left.{\begin{matrix}a\equiv b{\pmod {m}}\\c\equiv d{\pmod {m}}\end{matrix}}\right\}\Rightarrow \left\{{\begin{matrix}a\pm c\equiv b\pm d{\pmod {m}}\\ac\equiv bd{\pmod {m}}\end{matrix}}\right.

這性質更可進一步引申成爲:


{\displaystyle a\equiv b{\pmod {m}}\Rightarrow {\begin{cases}an\equiv bn{\pmod {m}},\forall n\in \mathbb {Z} \\a^{n}\equiv b^{n}{\pmod {m}},\forall n\in \mathbb {N} ^{0}\end{cases}}}a\equiv b{\pmod {m}}\Rightarrow {\begin{cases}an\equiv bn{\pmod {m}},\forall n\in \mathbb {Z} \\a^{n}\equiv b^{n}{\pmod {m}},\forall n\in \mathbb {N} ^{0}\end{cases}} ,( 但是{\displaystyle a^{n}\equiv b^{n}{\pmod {m}}}{\displaystyle a^{n}\equiv b^{n}{\pmod {m}}}不能推論{\displaystyle a\equiv b{\pmod {m}}}a\equiv b{\pmod {m}} )


4.放大縮小模數

{\displaystyle k}k爲正整數,{\displaystyle a\equiv b{\pmod {m}}}a\equiv b{\pmod {m}}當且僅當{\displaystyle ka\equiv kb{\pmod {km}}}{\displaystyle ka\equiv kb{\pmod {km}}}

除法原理一

{\displaystyle ka\equiv kb{\pmod {m}}}{\displaystyle ka\equiv kb{\pmod {m}}}{\displaystyle k,m}{\displaystyle k,m}互質,則{\displaystyle a\equiv b{\pmod {m}}}a\equiv b{\pmod {m}}


2.歐拉函數

 基本概念:數論中,對正整數n歐拉函數{\displaystyle \varphi (n)}\varphi (n)是小於n的正整數中與n互質的數的數目。

如:例如{\displaystyle \varphi (8)=4}\varphi (8)=4,因爲1,3,5,7均和8互質;\varphi (1)=1 ...

完全餘數集合:
定義小於 n 且和 n 互質的數構成的集合爲 Zn ,稱呼這個集合爲 n 的完全餘數集合。 顯然 |Zn| =φ(n) 。

性質:

1.對於質數 p ,φ(p) = p -1 。


2.對於兩個不同質數 p, q ,它們的乘積 n = p * q 滿足 φ(n) = (p -1) * (q -1)  。

這是因爲 Zn = {1, 2, 3,  ... , n - 1} - {p, 2p, ... , (q - 1) * p} - {q, 2q, ... , (p - 1) * q} , 則 φ(n) = (n - 1) - (q - 1) - (p - 1) = (p -1) * (q -1)  =φ(p) * φ(q) 。

歐拉定理 :
對於互質的正整數 a 和 n ,有 aφ(n)  ≡ 1 mod n 

歐拉公式:

( 1 ) pk 的歐拉函數

對於給定的一個素數 p , φ(p) = p -1。則對於正整數 n = pk

 φ(n) = pk - pk -1
  
證明:
 小於 pk 的正整數個數爲 pk - 1個,其中
 和 pk 不互質的正整數有{p * 1,p * 2,...,p * (pk - 1-1)} 共計 pk - 1 - 1 個
 所以 φ(n) = pk - 1 - (pk - 1 - 1) = pk - pk - 1

( 2 ) p * q 的歐拉函數

假設 p, q是兩個互質的正整數,則 p * q 的歐拉函數爲

φ(p * q) = φ(p) * φ(q), gcd(p, q) = 1 。

證明:
 令 n = p * q , gcd(p,q) = 1
 根據中國餘數定理,有
 Zn 和 Zp × Zq 之間存在一一映射
(我的想法是: a ∈ Zp , b ∈ Zq ⇔ b * p + a * q ∈ Zn 。)
 所以 n 的完全餘數集合的元素個數等於集合 Zp × Zq 的元素個數。
 而後者的元素個數爲 φ(p) * φ(q) ,所以有
 φ(p * q) = φ(p) * φ(q) 。


3.

任意一個整數 n 都可以表示爲其素因子的乘積爲:

      I
 n = ∏  piki (I 爲 n 的素因子的個數)
     i=1

根據前面兩個結論,很容易得出它的歐拉函數爲:


         I                      I
 Φ(n) = ∏  piki -1(pi -1) = n ∏ (1 - 1 / pi)
        i=1                    i=1

對於任意 n > 2,2 | Φ(n) ,因爲必存在  p-1 是偶數


歐拉函數模板:

模板題:HDU 1286 找新朋友

#include<cstdio>
#include<cmath>
int Eular(int n)  
{  
    int ans=1;  
    for (int i=2;i<=sqrt((double)n);i++)  
    {  
        if (n%i==0)  
        {  
            n/=i;  
            ans*=(i-1);  
            //若n有個因子是i的k次,根據歐拉公式有下面的代碼  
            while (n%i==0)   
            {  
                n/=i;  
                ans*=i;  
            }  
        }  
    }  
    if (n>1)     //若最後剩的數爲大於1的素數,根據歐拉公式再算進去   
        ans*=(n-1);  
    return ans;  
}  
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",Eular(n));
	}
	return 0;
}

參考:

歐拉函數&&歐拉公式

發佈了40 篇原創文章 · 獲贊 51 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章