【数论】欧拉函数(基本性质、递推法、公式法、线性筛法)

欧拉函数

  • 欧拉函数 φ ( n ) \varphi(n) φ(n) :不超过 n n n 且与 n n n 互素的正整数的个数, n ∈ N ∗ n\in N^* nN
  • p p p 是素数 ⇔ φ ( p ) = p − 1 \Leftrightarrow\varphi(p)=p-1 φ(p)=p1
  • p p p 是素数, a ∈ N ∗ ⇒ φ ( p a ) = p a − p a − 1 a\in N^*\Rightarrow \varphi\left(p^{a}\right)=p^{a}-p^{a-1} aNφ(pa)=papa1
    • 证明:与 p a p^a pa 不互素的只有 p , 2 p , 3 p , ⋯   , p k − 1 p p,2p,3p,\cdots,p^{k-1}p p,2p,3p,,pk1p ,等比求和减去即可
  • 任意正整数 n n n 的素数幂分解 n = p 1 a 1 ⋅ p 2 a 2 ⋯ p s a s ⇒ φ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p s ) n=p_{1}^{a_{1}} \cdot p_{2}^{a_2} \cdots p_{s}{ }^{a_{s}}\Rightarrow \varphi(n)=n \cdot\left(1-\frac{1}{p_{1}}\right) \cdot\left(1-\frac{1}{p_{2}}\right) \cdots\left(1-\frac{1}{p_{s}}\right) n=p1a1p2a2psasφ(n)=n(1p11)(1p21)(1ps1)
    • 证明:上一定理还可写成 φ ( p a ) = p a ( 1 − 1 p ) \varphi\left(p^{a}\right)=p^{a}(1-\frac{1}{p}) φ(pa)=pa(1p1) ,由欧拉函数是积性函数可得上式。
    • 推论:当 n n n 为奇数时, 有 φ ( 2 n ) = φ ( n ) \varphi(2 n)=\varphi(n) φ(2n)=φ(n)
  • n > 2 , n ∈ N ∗ ⇒ φ ( n ) n>2,n\in N^*\Rightarrow \varphi(n) n>2,nNφ(n) 是偶数
  • n ∈ N ∗ , ∑ d ∣ n φ ( d ) = n n\in N^*,\sum_{d\mid n}\varphi(d)=n nN,dnφ(d)=n
  • 欧拉定理: m m m 是一正整数, a a a 是一个整数且 ( a , m ) = 1 (a, m)=1 (a,m)=1, 那么 a φ ( m ) ≡ a^{\varphi(m)} \equiv aφ(m) 1 (   m o d   m ) 1(\bmod m) 1(modm)
  • x m o d    p = 0 ⇒ φ ( x p ) = φ ( x ) ⋅ p x\mod p=0\Rightarrow \varphi(xp)=\varphi(x)\cdot p xmodp=0φ(xp)=φ(x)p ,证明如下:
    • [ 1 , x ] [1,x] [1,x] 中与 x x x 不互质的数 y y y y + x y+x y+x x x x 仍不互质, y + c x , c ≤ p y+cx,c\leq p y+cx,cp 仍与 x x x 不互质,即 [ 1 , x ] [1,x] [1,x] 区间中与 x x x 不互质的数在 + c x +cx +cx 后仍不互质。前面素数性质可证 [ 1 , x ] [1,x] [1,x] 中与 x x x 互质的数在 + c x +cx +cx 后仍互质。所以可得上述结论。

注:以下均来自kuangbin的模板

分解质因数法

int Euler(int n)
{
    getFactors(n); // 前面提过的分解质因数
    int ret = n;
    for (int i = 0; i < fatCnt; i++)
        ret = ret / factor[i][0] * (factor[i][0] - 1);
    return ret;
}

递推法

φ ( i ) \varphi(i) φ(i) 先置为 i i i ,把 k i ki ki 的原始 φ \varphi φ 乘上这个 i i i 做出的贡献。

过程中, φ \varphi φ 没有赋值说明是素数

int euler[N];
void getEuler()
{
    memset(euler, 0, sizeof(euler));
    euler[1] = 1;
    for (int i = 2; i < N; i++)
        if (!euler[i])
            for (int j = i; j < N; j += i)
            {
                if (!euler[j])
                    euler[j] = j;
                euler[j] = euler[j] / i * (i - 1);
            }
}

求单个欧拉函数

找素因子,用公式

int euler(int n)
{
    int ans = n;
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)
        {
            ans -= ans / i;
            while (n % i == 0)
                n /= i;
        }
    if (n > 1)
        ans -= ans / n;
    return ans;
}

线性筛

bool check[N + 10];
int phi[N + 10];
int prime[N + 10];
int tot; //素数的个数
void phi_and_prime_table(int N)
{
    memset(check, false, sizeof(check));
    phi[1] = 1;
    tot = 0;
    for (int i = 2; i <= N; i++)
    {
        if (!check[i])
        {
            prime[tot++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; j < tot; j++)
        {
            if (i * prime[j] > N)
                break;
            check[i * prime[j]] = true;
            if (i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j]; // 利用性质
                break;
            }
            else
                phi[i * prime[j]] = phi[i] * (prime[j] - 1); // 积性函数
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值