【数论】欧拉函数(基本性质、递推法、公式法、线性筛法)
作者:互联网
文章目录
欧拉函数
- 欧拉函数 φ ( n ) \varphi(n) φ(n) :不超过 n n n 且与 n n n 互素的正整数的个数, n ∈ N ∗ n\in N^* n∈N∗
- p p p 是素数 ⇔ φ ( p ) = p − 1 \Leftrightarrow\varphi(p)=p-1 ⇔φ(p)=p−1
-
p
p
p 是素数,
a
∈
N
∗
⇒
φ
(
p
a
)
=
p
a
−
p
a
−
1
a\in N^*\Rightarrow \varphi\left(p^{a}\right)=p^{a}-p^{a-1}
a∈N∗⇒φ(pa)=pa−pa−1
- 证明:与 p a p^a pa 不互素的只有 p , 2 p , 3 p , ⋯ , p k − 1 p p,2p,3p,\cdots,p^{k-1}p p,2p,3p,⋯,pk−1p ,等比求和减去即可
- 任意正整数
n
n
n 的素数幂分解
n
=
p
1
a
1
⋅
p
2
a
2
⋯
p
s
a
s
⇒
φ
(
n
)
=
n
⋅
(
1
−
1
p
1
)
⋅
(
1
−
1
p
2
)
⋯
(
1
−
1
p
s
)
n=p_{1}^{a_{1}} \cdot p_{2}^{a_2} \cdots p_{s}{ }^{a_{s}}\Rightarrow \varphi(n)=n \cdot\left(1-\frac{1}{p_{1}}\right) \cdot\left(1-\frac{1}{p_{2}}\right) \cdots\left(1-\frac{1}{p_{s}}\right)
n=p1a1⋅p2a2⋯psas⇒φ(n)=n⋅(1−p11)⋅(1−p21)⋯(1−ps1)
- 证明:上一定理还可写成 φ ( p a ) = p a ( 1 − 1 p ) \varphi\left(p^{a}\right)=p^{a}(1-\frac{1}{p}) φ(pa)=pa(1−p1) ,由欧拉函数是积性函数可得上式。
- 推论:当 n n n 为奇数时, 有 φ ( 2 n ) = φ ( n ) \varphi(2 n)=\varphi(n) φ(2n)=φ(n)
- n > 2 , n ∈ N ∗ ⇒ φ ( n ) n>2,n\in N^*\Rightarrow \varphi(n) n>2,n∈N∗⇒φ(n) 是偶数
- n ∈ N ∗ , ∑ d ∣ n φ ( d ) = n n\in N^*,\sum_{d\mid n}\varphi(d)=n n∈N∗,∑d∣nφ(d)=n
- 欧拉定理: m m m 是一正整数, a a a 是一个整数且 ( a , m ) = 1 (a, m)=1 (a,m)=1, 那么 a φ ( m ) ≡ a^{\varphi(m)} \equiv aφ(m)≡ 1 ( m o d m ) 1(\bmod m) 1(modm)
-
x
m
o
d
p
=
0
⇒
φ
(
x
p
)
=
φ
(
x
)
⋅
p
x\mod p=0\Rightarrow \varphi(xp)=\varphi(x)\cdot p
xmodp=0⇒φ(xp)=φ(x)⋅p ,证明如下:
- [ 1 , x ] [1,x] [1,x] 中与 x x x 不互质的数 y y y , y + x y+x y+x 与 x x x 仍不互质, y + c x , c ≤ p y+cx,c\leq p y+cx,c≤p 仍与 x x x 不互质,即 [ 1 , x ] [1,x] [1,x] 区间中与 x x x 不互质的数在 + c x +cx +cx 后仍不互质。前面素数性质可证 [ 1 , x ] [1,x] [1,x] 中与 x x x 互质的数在 + c x +cx +cx 后仍互质。所以可得上述结论。
注:以下均来自kuangbin的模板
分解质因数法
int Euler(int n)
{
getFactors(n); // 前面提过的分解质因数
int ret = n;
for (int i = 0; i < fatCnt; i++)
ret = ret / factor[i][0] * (factor[i][0] - 1);
return ret;
}
递推法
将 φ ( i ) \varphi(i) φ(i) 先置为 i i i ,把 k i ki ki 的原始 φ \varphi φ 乘上这个 i i i 做出的贡献。
过程中, φ \varphi φ 没有赋值说明是素数
int euler[N];
void getEuler()
{
memset(euler, 0, sizeof(euler));
euler[1] = 1;
for (int i = 2; i < N; i++)
if (!euler[i])
for (int j = i; j < N; j += i)
{
if (!euler[j])
euler[j] = j;
euler[j] = euler[j] / i * (i - 1);
}
}
求单个欧拉函数
找素因子,用公式
int euler(int n)
{
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
ans -= ans / i;
while (n % i == 0)
n /= i;
}
if (n > 1)
ans -= ans / n;
return ans;
}
线性筛
bool check[N + 10];
int phi[N + 10];
int prime[N + 10];
int tot; //素数的个数
void phi_and_prime_table(int N)
{
memset(check, false, sizeof(check));
phi[1] = 1;
tot = 0;
for (int i = 2; i <= N; i++)
{
if (!check[i])
{
prime[tot++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < tot; j++)
{
if (i * prime[j] > N)
break;
check[i * prime[j]] = true;
if (i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j]; // 利用性质
break;
}
else
phi[i * prime[j]] = phi[i] * (prime[j] - 1); // 积性函数
}
}
}
标签:prime,phi,筛法,int,互质,varphi,欧拉,递推,euler 来源: https://blog.csdn.net/default012/article/details/123309503