欧拉函数学习小记 [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; }