歐拉函數

歐拉函數

概念:歐拉函數是小於x的整數中與x互質的數的個數,一般用φ(x)表示。特殊的,φ(1)=1。

通式 : φ(x)=xi=1n(11pi), φ(1)=1\varphi(x) = x\prod^{n}_{i = 1}(1 - \frac{1}{p_i}), \ \varphi(1) = 1
其中p1,p2,.....pnp_1, p_2,.....p_n爲x的所有質因數(每個質因數只有一個),x爲正整數

那麼如何理解上面的式子呢?(
對於一個質因數pip_i,因爲x以內pip_i的倍數是均勻分佈的,所以x以內有1pi\frac{1}{p_i}的概率是pip_i的倍數
那麼有11pi1 - \frac{1}{p_i}的數不是pip_i的倍數。
對於pjp_j,同理,有11pj1-\frac{1}{p_j}不是pjp_j的倍數,所以有(11pi)(11pj)(1 - \frac{1}{p_i}) * (1-\frac{1}{p_j})的數既不是pip_i的倍數,又不是pjp_j的倍數,最後就有ni=1(11pi)\prod{n}{i = 1}(1-\frac{1}{p_i})的數與x互質,個數自然就是xni=1(11pi)x\prod{n}{i = 1}(1-\frac{1}{p_i})
舉個例子,令x = 12。
12以內有12\frac{1}{2}的數是2的倍數,那麼有1121-\frac{1}{2}的數不是2的倍數(1,3,,5,,7,,9,11)
這6個數又有13\frac{1}{3}的數是3的倍數,只剩下(112)(113)(1-\frac{1}{2}) * (1-\frac{1}{3})的數既不是2的倍數,也不是3的倍數(1,5,7,11)
這樣剩下來的12(112)(113)=412 *(1-\frac{1}{2}) *(1-\frac{1}{3}) = 4,即有4個數與12互質。

實現代碼:
(1)直接求不超過n的互質的個數

int euler(int n) {
    int ans = n;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            ans = ans / i * (i - 1); //先進行除法防止溢出(ans = ans * (1 - 1 / p(i)))
            while (n % i == 0)  n /= i;
        }
    }
    if (n ^ 1)  // n != 1
        ans = ans / n * (n - 1);
    return ans;
}

(2)求[1,n]之間每個數的質因數的個數

const int size = 1e6;
int euler[size];
void Init()	{
	memset(euler, 0, sizeof(euler));
	euler[1]=1;
	for(int i = 2; i < size; i++)
		if(!euler[i])	{
			for(int j = i; j < size; j += i)	{
				if(!euler[j])
					euler[j] = j;
              euler[j] = euler[j] / i * (i - 1);//先進行除法是爲了防止中間數據的溢出
          }
      }   
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章