ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-06 14:06:01  阅读:231  来源: 互联网

标签:prime phi 筛法 int 互质 varphi 欧拉 递推 euler


文章目录

欧拉函数

  • 欧拉函数 φ ( n ) \varphi(n) φ(n) :不超过 n n n 且与 n n n 互素的正整数的个数, n ∈ N ∗ n\in N^* n∈N∗
  • p p p 是素数 ⇔ φ ( p ) = p − 1 \Leftrightarrow\varphi(p)=p-1 ⇔φ(p)=p−1
  • 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} a∈N∗⇒φ(pa)=pa−pa−1
    • 证明:与 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,⋯,pk−1p ,等比求和减去即可
  • 任意正整数 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=p1a1​​⋅p2a2​​⋯ps​as​⇒φ(n)=n⋅(1−p1​1​)⋅(1−p2​1​)⋯(1−ps​1​)
    • 证明:上一定理还可写成 φ ( p a ) = p a ( 1 − 1 p ) \varphi\left(p^{a}\right)=p^{a}(1-\frac{1}{p}) φ(pa)=pa(1−p1​) ,由欧拉函数是积性函数可得上式。
    • 推论:当 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,n∈N∗⇒φ(n) 是偶数
  • n ∈ N ∗ , ∑ d ∣ n φ ( d ) = n n\in N^*,\sum_{d\mid n}\varphi(d)=n n∈N∗,∑d∣n​φ(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,c≤p 仍与 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); // 积性函数
        }
    }
}

标签:prime,phi,筛法,int,互质,varphi,欧拉,递推,euler
来源: https://blog.csdn.net/default012/article/details/123309503

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有