数论——欧拉函数
欧拉函数
- 定义:在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目.
- 引理:
证明用容斥原理
例题
给定 n 个正整数 ai,请你求出每个数的欧拉函数。
欧拉函数的定义
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
若在算数基本定理中,
N
=
p
1
a
1
p
2
a
2
…
p
m
a
m
N= p_1^{a1} p_2^{a_2}…p_m^{a_m}
N=p1a1p2a2…pmam,则:
ϕ
(
N
)
=
N
×
p
1
−
1
p
1
×
p
2
−
1
p
2
×
…
×
p
m
−
1
p
m
ϕ(N) = N×\frac{p_1−1}{p1}×\frac{p_2−1}{p2}×…×\frac{p_m−1}{pm}
ϕ(N)=N×p1p1−1×p2p2−1×…×pmpm−1
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。
数据范围
1≤n≤100,
1≤ai≤2×10^9
输入样例:
3
3
6
8
输出样例:
2
2
4
n = int(input())
for i in range(n) :
a = int(input())
res = a
i = 2
while i <= a // i :
if a % i == 0 :
res = res // i * (i - 1)
while a % i == 0 :
a //= i
i += 1
if a > 1 :
res = res // a * (a - 1)
print(res)
筛法求欧拉函数
- 算法思路:
在筛质数的同时,质数的欧拉函数为 f ( n ) = n − 1 f(n) = n - 1 f(n)=n−1,在将合数筛出时计算合数的欧拉函数
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。
数据范围
1≤n≤106
输入样例:
6
输出样例:
12
N = 100010
prime = []
eula = [0] * N
st = [True] * N
def sum_eula(x) :
for i in range(1, x + 1) :
if i == 1 :
eula[i] = 1
continue
if st[i] :
prime.append(i)
eula[i] = i - 1
for j in prime :
if i * j > x :
break
st[i * j] = False
if i % j == 0 :
eula[i * j] = j * eula[i]
break
eula[i * j] = (j - 1) * eula[i]
res = 0
for i in range(1, x + 1) :
res += eula[i]
return res
n = int(input())
print(sum_eula(n))
欧拉定理
设 a , m ∈ N + a, m \in N^+ a,m∈N+,且 g c d ( a , m ) = 1 gcd(a, m) = 1 gcd(a,m)=1,则我们有: a Ψ ( m ) ≡ 1 ( m o d m ) a^{\varPsi(m)}\equiv 1(mod\ m) aΨ(m)≡1(mod m)
其中 Ψ ( m ) \varPsi(m) Ψ(m)称为对模m缩系的元素个数。
总结
梦回密码学,欧拉函数还是挺简单的,质数是最基础的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库