ICode9

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

积性函数筛法

2020-02-24 19:55:23  阅读:176  来源: 互联网

标签:函数 筛法 积性 times 素数 low 线性


积性函数筛法

很多常用的数论函数都是积性函数,而在题目中,我们常常需要线性(甚至更高)的筛法。

对于积性函数,我们可以在筛素数的基础上稍加修改,即可完成线性筛。

首先,注意到积性函数的特点:
\[ f(xy)=f(x)\times f(y) \]
而可以线性筛的积性函数,需要知道以下两个式子的快速求法:
\[ f(p)=?\quad f(p^k)=?\\p\in prime \]
其中, \(f(p)\) 大多是直接定义,\(f(p^k)\) 大多是递归定义。

我们来回忆一下素数筛的过程:

inp[0]=inp[1]=1;
for(int i=2;i<=n;i++){
    if(!inp[i]){
        prime[++tot]=i;
    }
    for(int j=1;j<=tot && i*prime[j]<=n;j++){
        int tp=prime[j]*i;
        inp[tp]=1;
        if(i%prime[j]==0){
            break;
        }
    }
}

在线性筛素数的基础上,我们可以进行线性筛的修改。

首先,对于判定的质数 \(p\) ,可以直接给出定义的值。

之后,对于 \(i\%p\neq0\) ,由于 \(i\) 和 \(p\) 互质,可以直接用积性函数性质推得。

然后,对于 \(i\%p == 0\) :

  • 即 \(i\) 内的最小素因子是 \(p\) ,此刻可以将 \(i\) 内的素因子都除掉,然后就可以用积性函数的性质来递推了。为此,我们要记录一个最小质因子的幂次 \(low_i\) 。

    那么递推式就可以表示为:\(f(i\times p)=f(i/low_i)\times f(low_i\times p)\) 。

  • 此处还有一个特殊的判定,当 \(i==low_i\) 时,上式相当于没推,所以我们要用 \(f(p^k)\) 的递推来计算。

那么代码如下:

inp[0]=inp[1]=1;
f[1]=1;
for(int i=2;i<=n;i++){
    if(!inp[i]){
        prime[++tot]=i;
        f[i]=对质数的定义式;
        low[i]=i;
    }
    for(int j=1;j<=tot && i*prime[j]<=n;j++){
        int tp=prime[j]*i;
        inp[tp]=1;
        if(i%prime[j]==0){
            if(i!=low[i])
                f[tp]=f[i/low[i]]*f[low[i]*prime[j]];
            else
                f[tp]=对p的次幂的定义式;
            low[tp]=low[i]*prime[j];
            break;
        }
        f[tp]=f[i]*f[prime[j]];
        low[tp]=prime[j];
    }
}

缺点很明显,比较耗空间。(但是题目会给够的

当需要线性筛很多个积性函数时,可以同时进行。

这种基于素数筛的线性筛法,有时不止对积性函数有用,对于一些和素数有关的函数也可以筛出,具体在我写的莫比乌斯反演中有例子。


\(\frak by\;thorn\_\)

标签:函数,筛法,积性,times,素数,low,线性
来源: https://www.cnblogs.com/thornblog/p/12358432.html

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

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

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

ICode9版权所有