ruye07

导航

唯一分解定理+欧拉函数

唯一分解定理

image

(a,b)表示a,b的最大公约数

[a,b]表示a,b的最小公倍数

可以由此得到ab=gcd(a,b)*lcm(a,b)

欧拉函数

image

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

posted on 2026-09-02 17:28  ruye07  阅读(6)  评论(0)    收藏  举报