欧拉函数及定理浅谈
什么是
φ
\varphi
φ(欧拉函数)
φ
(
x
)
\varphi(x)
φ(x)是指在
1
→
x
−
1
1 \rightarrow x-1
1→x−1中与x互质的数。
我们先不说它有什么用处,先来讲一讲求法。
少量或数据较大的求法
⟶
\longrightarrow
⟶ 时间复杂度
O
(
n
)
O(\sqrt{n})
O(n)
代码如下:
int phi(int x)
{
int res = x;
for (int i = 2;i * i <= x; i++)
if (x % i == 0)
{
res = res / i * (i - 1);
while (x % i == 0) x /= i;
}
if (x > 1)
res = res / x * (x - 1);
return res;
}
大量较小的数据的方法:欧拉筛
→
\rightarrow
→时间复杂度
O
(
n
)
O(n)
O(n)
其思路便是在欧拉筛质数的时候顺便求出
φ
\varphi
φ
代码如下:
const int N = 1e6 + 5, M = 7.85e4;
int prime[M], phi[N], cnt;
void Euler()
{
for (int i = 1;i < N; i++)
phi[i] = i;
for (int i = 2;i < N; i++)
{
if (phi[i] == i)
prime[++cnt] = i, phi[i] = i - 1;
for (int j = 1;j <= cnt and i * prime[j] < N; j++)
if (i % prime[j])
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
else
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
return;
}
欧拉函数的作用
在这里为了更方便的解释欧拉函数的作用,我们先引入一个概念
欧拉定理
对于
g
c
d
(
a
,
b
)
=
1
gcd(a, b) = 1
gcd(a,b)=1的
a
,
b
a, b
a,b两个数
有:
a
φ
(
b
)
≡
1
(
m
o
d
b
)
a^{\varphi(b)}\equiv1(mod\ b)
aφ(b)≡1(mod b)
再介绍一个欧拉定理的特殊情况
→
\rightarrow
→费马小定理
费马小定理
当
p
p
p是质数的时候,且
a
a
a不是
p
p
p的倍数时
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1} \equiv 1\ (mod\ p)
ap−1≡1 (mod p)
在这里,我们可以知道
φ
(
p
)
=
p
−
1
\varphi(p) = p - 1
φ(p)=p−1
故而
a
φ
(
p
)
=
a
p
−
1
a^{\varphi(p)}=a^{p-1}
aφ(p)=ap−1
所以我们可以说费马小定理是欧拉定理的一个特殊情况
那么如果当
g
c
d
(
a
,
b
)
≠
1
gcd(a, b) \neq 1
gcd(a,b)=1的情况呢
这个时候我们有结论:
a
c
≡
a
c
m
o
d
φ
(
m
)
,
g
c
d
(
a
,
m
)
=
1
a^c\equiv a^{c\ mod\ \varphi(m)}, gcd(a, m) = 1
ac≡ac mod φ(m),gcd(a,m)=1
a
c
≡
a
c
,
g
c
d
(
a
,
m
)
≠
1
,
c
<
φ
(
m
)
a^c\equiv a^c, gcd(a, m) \neq 1, c < \varphi(m)
ac≡ac,gcd(a,m)=1,c<φ(m)
a
c
≡
a
c
m
o
d
φ
(
m
)
+
φ
(
m
)
,
g
c
d
(
a
,
m
)
≠
1
,
c
≥
φ
(
m
)
a^c\equiv a^{c\ mod\ \varphi(m)+\varphi(m)}, gcd(a, m)\neq1,c\geq\varphi(m)
ac≡ac mod φ(m)+φ(m),gcd(a,m)=1,c≥φ(m)
我们便可以用这个来降幂