欧拉函数学习小记 [FINISHED]

(1)定义: 一个数n的欧拉函数一个数$\phi(n)$,表示$[1,n]$中与$n$互质的数的个数。比如$\phi(1)=1, \phi(2)=1,\phi(3)=2,\phi(4)=2$

(2)计算方法: 设$p_{1}<p_{2}<..<p_{k}$是$n$的$k$个质因数,$phi(n)=n\prod_{i=1}^{k}\frac{p_{k}-1}{p_{k}}$。比如$phi(12)=12*\frac{2-1}{2}*\frac{3-1}{3}=4,(1,5,7,11)$
(3)性质:若$k,m$互质,则有:$k^{\phi(n)}\equiv 1(mod\ n)$。比如$2^{\phi(7)}=2^6=64\equiv 1(mod\ 7),3^{\phi(7)}=3^6=729\equiv 1(mod\ 7)$

计算一个数字的欧拉函数
template <typename TYPE,
          typename = std::enable_if_t<std::is_integral<TYPE>::value>>
TYPE Euler(TYPE n) {
  TYPE ans = n;
  for (TYPE i = 2; i <= n / i; ++i) {
    if (n % i == 0) {
      ans = ans / i * (i - 1);
      while (n % i == 0) {
        n /= i;
      }
    }
  }
  if (n > 1) {
    ans = ans / n * (n - 1);
  }
  return ans;
}  

计算$n$之内所有数字的欧拉函数
template <typename TYPE,
          typename = std::enable_if_t<std::is_integral<TYPE>::value>>
std::vector<TYPE> Eulers(TYPE n) {
  std::vector<TYPE> result(n + 1);
  result[1] = 1;
  for (TYPE i = 2; i <= n; ++i) {
    if (result[i] != 0) {
      continue;
    }
    for (TYPE j = i; j <= n; j += i) {
      if (result[j] == 0) {
        result[j] = j;
      }
      result[j] = result[j] / i * (i - 1);
    }
  }
  return result;
}

 

  

posted @ 2013-11-27 23:30  朝拜明天19891101  阅读(267)  评论(0编辑  收藏  举报