唯一分解定理+欧拉函数
唯一分解定理

(a,b)表示a,b的最大公约数
[a,b]表示a,b的最小公倍数
可以由此得到ab=gcd(a,b)*lcm(a,b)
欧拉函数

def euler_phi(n: int) -> int:
"""计算欧拉函数 φ(n)"""
res = n
i = 2
while i * i <= n:
if n % i == 0:
# i是n的一个质因子
res = res // i * (i - 1)
# 把i全部除干净,避免重复取同一个质因子
while n % i == 0:
n //= i
i += 1
# 如果剩下的n>1,说明余下的n是一个质数
if n > 1:
res = res // n * (n - 1)
return res
欧拉筛
def get_phi(n):
phi = list(range(n + 1)) # phi[i]=i初始化
is_prime = [True] * (n + 1)
primes = []
is_prime[0] = is_prime[1] = False
phi[1] = 1
for i in range(2, n + 1):
if is_prime[i]:
primes.append(i)
phi[i] = i - 1 #质数欧拉函数= i‑1
for p in primes:
if i * p > n:
break
is_prime[i * p] = False
if i % p == 0:
# i包含质因子p
phi[i * p] = phi[i] * p
break
else:
# i和p互质,积性函数 φ(a*b)=φ(a)*φ(b)
phi[i * p] = phi[i] * (p - 1)
return phi
浙公网安备 33010602011771号