前言
很早之前就已經接觸過歐拉函數這個知識,不久之前也學習了利用篩法求1到n之間的所有歐拉函數值。里面用到了一些歐拉函數的性質。出於好奇心,我特意學習歐拉函數性質的一些證明,今天在此分享給大家。
歐拉函數
說到歐拉函數 \(\phi\) ,首先要明確的就是它的定義:
1、歐拉函數是定義在正整數集合上的函數;
2、\(\phi(1)=1\) ;
3、當 \(n\geq 2\) 時,\(\phi(n)\) 表示小於 \(n\) 且與 \(n\) 互質的正整數(包括 \(1\))個數。
$\quad $ 比如 \(\phi(2)=1, \phi(3)=2, \phi(4)=2\) 。
歐拉函數有幾個重要的性質,下面我就詳細地講解與證明。
歐拉函數的性質
性質一
若 \(n\) 為質數,\(\phi(n)=n-1\) 。
這個性質很好證明,因為對於質數 \(n\) ,從 \(1\) 到 \((n-1)\) 中的所有整數都與 \(n\) 互質。
性質二
當 \(gcd(m,n)=1\) 時, \(\phi(mn)=\phi(m)\phi(n)\) 。特別的,若 \(m,n\) 都為質數, \(\phi(mn)=(m-1)(n-1)\) 。
這條性質的證明需要用到中國剩余定理,可以證明 \(\phi\) 為積性函數(指對於所有互質的整數 \(a\) 和 \(b\) 有性質 \(f(ab)=f(a)f(b)\) 的數論函數)。
同樣的,用數學歸納法可證,若 \(m_1,m_2,\cdots ,m_n\) 之間兩兩互質,則
性質三
若 \(n=p^k\) ,其中 \(p\) 為質數,則 \(\phi(n)=p^k-p^{k-1}=p^k(1-\frac{1}{p})\) 。
這條性質證明很簡單,因為只有 \(p\) 的倍數之外,即 \(1\times p, 2\times p ,\cdots,(p^{k-1}-1)\times p\) ,其余小於 \(n\) 的所有正整數都與 \(n\) 互質。
可以看出,性質一是 \(k=1\) 時的一個特例。
性質四
對於任意一個正整數 \(n\) ,都可以唯一地表示成若干質數乘積的形式,即\(n=\prod_{i=1}^m{p_i^{k_i}}\) (\(p_i\) 為質數),則
這條可以根據性質二,由於 \(p_i\) 為質數,所以任意 \(p_i^{k_i}\) 與 \(p_j^{k_j}\) 之間兩兩互質,可得
再根據性質三,可繼續化簡為
性質五
若正整數 \(i\%p=0\) ,\(p\) 為質數,則 \(\phi(i\cdot p)=\phi(i) \cdot p\) 。
此條性質便是篩法求歐拉函數的數學基礎,有了性質四,此條性質就很好證明了。
設 \(i=\prod\limits_{j=1}^m{p_j^{k_j}}\) ,則 \(\phi(i)=i\prod\limits_{j=1}^m{(1-\frac{1}{p_j})}\) 。
由於 \(i\%p=0\) 且 \(p\) 為質數 ,所以 \(p\) 必然為 \(p_1\) 到 \(p_m\) 中的某一個數,所以 \(i\cdot p\) 的所有質因數依然為 \(p_1,p_2, \cdots,p_n\) ,因此
性質六
小於 \(n\) 且與 \(n\) 互質的數之和為 \(n\cdot\frac{\phi(n)}{2}\) 。
證明這條性質只需證明若 \(gcd(n,i)=1\) ,則 \(gcd(n,n-i)=1\) ,這個用反證法即可證明。
證明了這個,就可得小於 \(n\) 且與 \(n\) 互質的數是兩兩關於 \(\frac{n}{2}\) 對稱的,共有 \(\frac{\phi(n)}{2}\) 對這樣的數 ,得證。
性質七
說到歐拉函數,不得不提大名鼎鼎的歐拉定理,即
對於互質的兩個數 \(a,m\) ,有 \(a^{\phi(m)}\equiv 1(mod\ m)\) 。
費馬小定理是歐拉定理的一個特殊情況,即
若 \(p\) 為質數,則 \(a^{p-1}\equiv 1(mod\ p)\) 。
這條定理證明有些復雜,等我以后有空再證。
今天准備去證明一下歐拉定理。
設 \(x_1,x_2,\cdots,x_{\phi(m)}\) 為 \(1\) 到 \(m-1\) 之間與 \(m\) 互質的所有整數,它們模 \(m\) 后兩兩不同且與 \(m\) 互質(廢話)。
然后我們證明 \(ax_1,ax_2,\cdots,ax_{\phi(m)}\) 也有這兩個性質。
1、首先證明 \(ax_1,ax_2,\cdots,ax_{\phi(m)}\) 模 \(m\) 后兩兩不同:
反證法,假設 \(ax_i \equiv ax_j(mod\ m)\ (i < j)\) ,則 \(a(x_j-x_i) \equiv 0(mod\ m)\) ,即 \(a(x_j-x_i)\) 是 \(m\) 的倍數,而 \(a\) 與 \(m\) 互質, \(x_j-x_i\) 也不可能是 \(m\) 的倍數,所以 \(a(x_j-x_i)\) 一定不是 \(m\) 的倍數 ,矛盾,得證。
2、然后再證明 \(ax_1,ax_2,\cdots,ax_{\phi(m)}\) 模 \(m\) 后的值皆與 \(m\) 互質。
設 \(r=ax_i\ mod\ m\) ,則 \(ax_i=pm+r\ (p \geq 0)\) ,因為 \(a,x_i\) 都與 \(m\) 互質,所以 \(ax_i\) 與 \(m\) 互質,所以 \(gcd(pm+r,m)=1\) ,由歐幾里得輾轉相減法可得 \(gcd(r,m)=1\) ,得證。
由上述兩條證明,我們可以發現 \(ax_1,ax_2,\cdots,ax_{\phi(m)}\) 模 \(m\) 后與 \(x_1,x_2,\cdots,x_{\phi(m)}\) 一一對應(不一定按照順序),所以我們可得:
兩邊消去,
歐拉定理由此得證。
篩法求歐拉函數
有了上述理論知識,再回到線性篩法求歐拉函數本身,代碼也就不難理解了。
最后就貼一段代碼吧。
void get_eulers(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!com[i])
{
primes[cnt++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < cnt && i * primes[j] <= n; j++)
{
com[primes[j] * i] = 1;
if (i % primes[j] == 0)
{
phi[primes[j] * i] = phi[i] * primes[j];
break;
}
//pj一定是pj * i的最小質因子,而且pj還不包含在i的質因子當中
phi[primes[j] * i] = phi[i] * (primes[j] - 1);
}
}
}
后記
花了半天,歐拉函數的一些性質的總結終於講述結束了,感覺本蒟蒻的思維又得到了提升。爆贊!