在数论中,对于正整数n,欧拉函数是小于n的正整数(1 <= n )中与n互质的数的数目(特殊的 : φ(1)=1)。此函数以其首名研究者欧拉命名(Euler's totient function),它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。
根据唯一分解定理可知,对于任意正整数 N 都可以拆分成若质数相乘的形式 如:N = p1 ^ q1 * p2 ^ q2 * ······pn ^ qn
(实例: 12 = 2 ^ 2 * 3 ^ 1 )
欧拉函数:
φ(N) = N * (1 - 1 / p1) * (1 - 1 / p2) * ······ * (1 - 1 / pn).
这里的p1,p2,都是其质因数,如 φ(12) = 12 * (1 - 1 / 2) * (1 - 1 / 3) = 4 (对于1 - 12 之间与12互质的数为:1, 5, 7, 11 ).
拿12举例子吧,12有两种质因子(2 和 3),[1, 12]中有 的是是2的倍数,所以有(1 -
)的不是2的倍数(1,3,5,7,9,11),在这不是2的倍数的6个数种有
的数是3的倍数(3,9),所以有(1 -
)的数不是3的倍数。所以既不是2的倍数,也不是3的倍数的数的个数为:12 * (1 -
) * (1 -
) = 4 (4个数为 :1, 5,7,11)。这类似于素数筛,但这里是把是N的质因子的倍数的数都去除,剩下的就是与N互质的了。(由于算的是其质因子的倍数,所以是“均匀分布”的,意思是说 2 是其质因子 那么[1, N]就有
个数是2的倍数,其他质因子同理)
证明:由于N是质数,所以φ(N) = N * (1 - ) = N - 1
证明:φ(N) = N * (1 - ) = p^k * (1 -
) = p^k - p^(k - 1)
首先说下什么是积性函数
积 性 函 数:若m, n互质且满足f(m * n) = f(m) * f(n) 时,f 是积性函数
完全积性函数:若对任意正整数 f(m * n) = f(m) * f(n) 都成立时,f 是完全积性函数
φ(m * n) = m * n * (1 - ) * (1 -
) = m * (1 -
) * n * (1 -
) = φ(n) * φ(m) (n 与 m 互质)
且当:m = 2 && n 是奇数时,φ(2 * n) = 2 * n * (1 - ) * X = n * X = φ(n)
证明:
有个基本结论:gcd(n, m) == 1 所以 gcd(n, n - m) == 1 (n > m)
先证明该基本结论:
假设 gcd(n, n - m) = k
所以可令:
n = a * k ······ ①
n - m = b * k ······ ②
① - ②:m = (a - b) * k
所以 gcd(n, m) = gcd(a*k, (a - b)*k)
又因为 gcd(n, m) = 1 所以 k = 1
所以每一个对n互质的数都对应一个n - m与之互质,所以φ( N )是偶数
证明:
由上面证明知:gcd(n, m) == 1 所以 gcd(n, n - m) == 1 (n > m)
与n互质的一个数为m,所以另一个与n互质的数应该为 n - m,所以与n互质的平均数是 n / 2 ,所以总和为:φ ( N ) * N / 2 且 ( N > 1)
/*********** n 的phi值 ******************/
//时间复杂度为:sqrt(n)
int phi(int n)
{
int ans = n;
for(int i = 2; i * i <= n; i++){
if(n % i == 0){ //i是其质因数
ans = ans / i * (i - 1); //先除后乘,防止溢出
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
/*********** 1 - n 每个数的phi值 ******************/
//基本类似于素数筛,时间复杂度为:nloglogn
int phi[MAXN];
void phi_table(int n)
{
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for(int i = 2; i <= n; i++){
if(!phi[i]){
//这里完全相同于素数筛,phi[i]如果为0,那么i是质数
for(int j = i; j <= n; j += i)
{
if(!phi[j]) phi[j] = j; //为了下一行代码,让phi[j]有值
phi[j] = phi[j] / i * (i - 1);
// i是j的一个质因子,所以先把这个质因子带入欧拉函数算了,之后再有就再算了
}
}
}
}
证明可参照:https://www.cnblogs.com/wangxiaodai/p/9758242.html
当a与m互质时,通过欧拉定理可得:
所以a的逆元是: ,当m与a互质时。