数论——欧拉函数

欧拉函数

  1. 定义:在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目.
  2. 引理:在这里插入图片描述

证明用容斥原理

例题

给定 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=p1a1p2a2pmam,则:
ϕ ( 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×p1p11×p2p21××pmpm1
输入格式
第一行包含整数 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)
筛法求欧拉函数
  1. 算法思路:

在筛质数的同时,质数的欧拉函数为 f ( n ) = n − 1 f(n) = n - 1 f(n)=n1,在将合数筛出时计算合数的欧拉函数

给定一个正整数 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,mN+,且 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缩系的元素个数。

总结

梦回密码学,欧拉函数还是挺简单的,质数是最基础的。

posted @   chanxe  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示