zoukankan      html  css  js  c++  java
  • 关于积性函数的一些理解

    首先,要Orz鏼爷。。http://jcvb.is-programmer.com/posts/41846.html

    谈谈积性函数吧。。

    百度百科的定义:

    完全积性函数指所有对于任何a,b都有性质$f(ab)=f(a)f(b)$的函数。
    在数论中的积性函数:对于正整数n的一个算术函数$f(n)$,若$f(1)=1$,且当a,b互质时$f(ab)=f(a)f(b)$,在数论上就称它为积性函数。若对于某积性函数$f(n)$,就算a, b不互质,也有$f(ab)=f(a)f(b)$,则称它为完全积性的。
     
    以下均是积性函数:(度娘~)
    $phi(n)$-欧拉函数
    $mu(n)$-莫比乌斯函数,关于非平方数的质因子数目
    $gcd(n,k)$-最大公因子,当k固定的情况
    $d(n)$-n的正因子数目
    $σ(n)$-n的所有正因子之和
    $σk(n)$-因子函数,n的所有正因子的k次之和,当中k可为任何复数
    $1(n)$-不变的函数,定义为$1(n)=1$(完全积性)
    $id(n)$-单位函数,定义为$id(n)=n$(完全积性)
    $idk(n)$-幂函数,对于任何复数、实数k,定义为$idk(n)=n^{k}$(完全积性)
    $varepsilon(n)$-定义为:若$n=1$,$varepsilon(n)=1$;若$n>1$,$varepsilon(n)=0$。别称为“对于狄利克雷卷积的乘法单位”(完全积性)
    $lambda(n)$-刘维尔函数,关于能整除n的质因子的数目
    $gamma(n)$,定义为$gamma(n)=(-1)^{omega (n)}$,在此加性函数$omega (n)$是不同能整除n的质数的数目
    另外,所有狄利克雷特征均是完全积性的。
     
    积性函数有几个性质:
    1.若$n=p_{1}^{a_{1}}p_{2}^{a_{2}}p_{3}^{a_{3}}...p_{n}^{a_{n}}$,那么$f(n)=f(p_{1}^{a_{1}})f(p_{2}^{a_{2}})f(p_{3}^{a_{3}})...f(p_{n}^{a_{n}})$。
    2.若$f$为积性函数且有$f(p^{n})=f^{n}(p)$,那么$f$为完全积性函数。
     
    狄利克雷卷积:
    对于两个算术函数$f$和$g$,定义其狄利克雷卷积为$f*g$,其中$f*g(n)=sum_{d|n}f(d)g(frac{n}{d})$。
    狄利克雷卷积满足很多性质:
    交换律:$f*g=g*f$,
    结合律:$(f*g)*h=f*(g*h)$,
    逐点加法的分配律:$f*(g+h)=f*g+f*h$。
    若$f$,$g$是积性函数,那么$f*g$也是积性函数。
    狄利克雷卷积可以用$O(nlogn)$的筛法预处理出来。
     
    对于积性函数,还有两个很重要的性质:
    $sum_{d|n}mu(d)=[n==1]$,即$1*mu=varepsilon$。
    $sum_{d|n}phi(d)=n$,即$1*phi=id$。
     
    积性函数可以用$O(n)$的时间线性筛求出,以下是筛素数,$mu(n),phi(n)$的代码:
    1 vis[0]=vis[1]=1,mu[1]=1,phi[1]=1;
    2 for (RG int i=2;i<=N;++i){
    3     if (!vis[i]) mu[i]=-1,phi[i]=i-1,prime[++cnt]=i;
    4     for (RG int j=1,k=i*prime[j];j<=cnt && k<=N;++j,k=i*prime[j]){
    5     vis[k]=1;
    6     if (!(i%prime[j])){ mu[k]=0,phi[k]=phi[i]*prime[j]; break; }
    7     else mu[k]=-mu[i],phi[k]=phi[i]*phi[prime[j]];
    8     }
    9 }

    可以发现,线性筛分为3部分:

    1.n本身是素数,这个根据积性函数的定义可得,很容易求。

    2.i%prime[j]!=0,这个也是根据积性函数的性质可得,即$f(a)f(b)=f(ab)$。

    3.i%prime[j]==0,这个就很麻烦了,可能需要找规律。据ljh2000神犇的说法,可以用2,4,8或3,9,27这些数来找。。

    总之就是一句话:打表找规律!!!

    先打素数,找素数规律,再找2,4,8和3,9,27,找出规律!然后就可以乱搞线性筛了!!!

    然后,线性筛并不一定只能筛积性函数,有些具有特殊性质的函数也可以用线性筛。

    以上是预备知识,可以为莫比乌斯反演做一些铺垫吧。。

  • 相关阅读:
    设计算法,求AB两个整数集合的交集
    C++函数传递指针面试题
    C++构造函数、析构函数与抛出异常
    c++ 虚函数表解析
    c++ 对象的内存布局
    09 构造函数能调用虚函数吗?
    C++构造函数初始化顺序
    计数排序,基数排序和桶排序
    80 求论坛在线人数
    79 两个整数集合A和B,求其交集
  • 原文地址:https://www.cnblogs.com/wfj2048/p/6537861.html
Copyright © 2011-2022 走看看