互质
gcd(a,b) = 1
则a,b
互质,gcd(a,b,c) = 1
则两两互质
gcd(a,b) = gcd(a,c) = gcd(b,c) = 1
欧拉函数
定义:[1,N)
中与N
互质数的个数被称为欧拉函数,记作 υ(N)\upsilon(N)υ(N)
由算数基本定理知:N=p1c1∗p2c2∗p3c3∗……∗piciN = p_1^{c_1} * p_2^{c_2}*p_3^{c_3}*……*p_i^{c_i}N=p1c1∗p2c2∗p3c3∗……∗pici
-
先推倒
i=2 c1=1 c2=1
的情况,
质因子为p,q
,1~N
中除去p
的倍数,p,2p,3p,....,[n/p]*p
, 那么1~N
中有N/p
个p
的倍数, 同理q
也有N/q
个q
的倍数,那么 υ(N)=N−N/q−N/p\upsilon(N)=N-N/q-N/pυ(N)=N−N/q−N/p,此时我们忽略了p,q同时被除去的倍数(应该是根据容斥定理),例如
2*3 3*2
被计算2次,那么加上N/(p*q)
个被减去2次的数的个数 就是所求的欧拉函数,(p*q)
是p,q
的最小公倍数,p,q
的倍数一定是p*q
的倍数,所以除以p*q
所以 υ(N)=N−N/p−N/q+N/(p∗q)\upsilon(N)=N-N/p-N/q+N/(p*q)υ(N)=N−N/p−N/q+N/(p∗q)
υ(N)=N(1−1/q)(1−1/p)\upsilon(N)=N(1-1/q)(1-1/p)υ(N)=N(1−1/q)(1−1/p) -
放在
N
的全部质因子上的 欧拉函数 就为
υ(N)=N(1−1/p1)(1−1/p2)...(1−1/pi)\upsilon(N)=N(1-1/p_1)(1-1/p_2)...(1-1/p_i)υ(N)=N(1−1/p1)(1−1/p2)...(1−1/pi)
//试除法分解质因数来求 欧拉函数值
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
int ans = n;
for (int i=2; i<=sqrt(n); i++) {
if (n%i == 0) {
ans = ans / i * (i-1);
while (n%i==0) n /= i;
}
}
if (n>1) ans = ans / n * (n-1);
cout << ans;
return 0;
}
算数基本定理:
N=p1c1∗p2c2∗p3c3∗……∗piciN = p_1^{c_1} * p_2^{c_2}*p_3^{c_3}*……*p_i^{c_i}N=p1c1∗p2c2∗p3c3∗……∗pici ,其中p1,p2,..
都是互质的
那么: υ(a∗b)=υ(a)∗υ(b)\upsilon(a*b) = \upsilon(a)*\upsilon(b)υ(a∗b)=υ(a)∗υ(b) (从欧拉函数推导过程i=2
得来)
满足上述条件时, υ\upsilonυ 也叫积性函数
延伸出来的欧拉函数的2个性质:(如果d
是n
的约数,记作d|n
)
p
为质数,p|n
且 p2∣np^2|np2∣n , 得 p∣(n/p)p|(n/p)p∣(n/p)
带入欧拉函数然后得到 υ(n)=p∗υ(n/p)\upsilon(n) = p*\upsilon(n/p)υ(n)=p∗υ(n/p)
υ(n)=n∗(1−p1)(1−p2)...\upsilon(n)=n*(1-p_1)(1-p_2)...υ(n)=n∗(1−p1)(1−p2)...
υ(n/p)=n/p∗(1−p1)(1−p2)...\upsilon(n/p)=n/p*(1-p_1)(1-p_2)...υ(n/p)=n/p∗(1−p1)(1−p2)... ,然后相除p
为质数,p|n
且 p2!∣np^2 !|np2!∣n ,( p2p^2p2不是n的约数),此时p
与n/p
互质,由基本性质得 υ(n)=υ(n/p)∗υ(p)\upsilon(n)=\upsilon(n/p)*\upsilon(p)υ(n)=υ(n/p)∗υ(p) 以为p
是个质数,1~p
都与它互质,则 υ(p)=p−1\upsilon(p)=p-1υ(p)=p−1 ,
则 υ(n)=(p−1)∗υ(n/p)\upsilon(n)=(p-1)*\upsilon(n/p)υ(n)=(p−1)∗υ(n/p)