• 线性素数筛+欧拉线性筛(证明)


    线性素数筛+欧拉线性筛(证明)

    线性素数筛

    int prime[MAXN], tag[MAXN];
    void Get_Prime()
    {
        Mem0(tag);
        int cnt = 0;
        for(int i = 2;i < MAXN;++i)
        {
            if(!tag[i])
                prime[cnt++] = i;
            for(int j = 0;j < cnt && i * prime[j] <= MAXN;++j)
            {
                tag[i * prime[j]] = 1;
                if(i % prime[j] == 0)
                    break;
            }
        }
    }
    

    解释tag[i * prime[j]] = 1;

    i是从小到大遍历,即所有的质数乘以大于或等于该数的数,所以所有的合数都会被筛掉且只会被筛掉一次

    解释if(i%prime[j]==0) break;

    相对于埃式筛,线性筛的实现是让每个数都被它的最小质因数筛去,且最小因数是质数,当跑到数字i时,我们筛掉的合数为i*prime[j] = k,这里把k分解成若干个质数的乘积,从小到大遍历所有的质数,知道k%prime[j]==0恒成立,由于prime是从小到大遍历的,所以prime[j]前面的质数一定与k互质,所以k一定被它的最小质因数筛去

    欧拉线性筛

    int phi[N], prime[N], vis[N], cnt;
    void Euler()
    {
        F(i, 2, N)
        {
            if(!vis[i])
            {
                prime[cnt++] = i;
                phi[i] = i - 1;
            }
            for(int j = 0;j < cnt && i * prime[j] < N;++j)
            {
                vis[i * prime[j]] = 1;
                if(i % prime[j] == 0)
                {
                    phi[i * prime[j]] = phi[i] * prime[j];break;
                }
                phi[i * prime[j]] = phi[i] * (prime[j] - 1);
            }
        }
        phi[1] = 1;//定义
    }
    

    有以下公式

    若x为质数,则phi[x] = x - 1

    若x%prime[j] == 0,phi[x * prime[j]] = phi[x] * prime[j]

    若x%prime[j] != 0,phi[x * prime[j]] = phi[x] * (prime[j] - 1)

    证明二、三:

    已知若i%prime[j] == 0,则prime[j]为i的质因数。下面欧拉函数的计算公式,其中p_i为x的质因数

    [varphi(x)=x prod_{i=1}^{n} (1- frac{1}{p_i}) ]

    设x的所有质因数为

    [{p_1,p_2,...,p_k} ]

    证明2:若x%prime[j] == 0,有

    [varphi(x* prime[j])= varphi(x) *prime[j] ]

    当x%prime[j]==0,且prime[j]为质数,所以prime[j]为x的某个质因数p_j,所以由欧拉函数的计算公式得

    [varphi(x*prime[j])=prime[j]*x prod_{i=1}^{k} (1- frac{1}{p_i})=prime[j]* varphi(x) ]

    证明3:若x%prime[j] != 0,有

    [varphi(x* prime[j])= varphi(x) *(prime[j]-1) ]

    当x%prime[j]!=0时,prime[j]为i*prime[j]的质因数p_{k+1},下面为i*prime[j]的质因数

    [p_1,p_2,...,p_k,p_{k+1}(p_{k+1}=prime[j]) ]

    由欧拉函数的计算公式得

    [varphi(x*prime[j])=prime[j]*x prod_{i=1}^{k} (1- frac{1}{p_i})*(1- frac{1}{p_{k+1}})=prime[j]* varphi(x)*(1-frac{1}{p_{k+1}}) =varphi(x)*(prime[j]-1) ]

  • 相关阅读:
    Servlet-获取页面的元素的值的方式以及区别
    Http请求-get和post的区别
    Servlet-xml配置简介以及url-pattern简介
    javaweb目录结构简介
    Servlet-生命周期简介
    tomcat-四种运行模式和三种部署模式(优化)
    命名空间System.IO
    Dictionary 字典
    导出-以虚拟表的形式获取数据源
    导入excel-uploadify+npoi
  • 原文地址:https://www.cnblogs.com/shuizhidao/p/10799703.html
Copyright © 2020-2023  润新知