积性函数的线性求法

本文详细介绍了积性函数的概念及其在数论中的应用,深入解析了线性素数筛算法的原理与实现,同时提供了求解积性函数如欧拉函数的线性算法代码。通过分析代码中的关键步骤,阐述了如何利用积性性质优化算法效率。

首先我们来了解一下积性函数的定义。

\(\forall x,y\)满足\(gcd(x,y)=1\),有\(f(xy)=f(x)f(y)\)的数论函数称为积性函数。若\(\forall x,y\)均有\(f(xy)=f(x)f(y)\),则称为完全积性函数

然后我们要理解线性素数筛。

void getP(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!notP[i]) P[++cntP]=i;
        for(int j=1;j<=cntP&&i*P[j]<=n;j++)
        {
            notP[i*P[j]]=true;
            if(i%P[j]==0) break;
        }
    }
    for(int i=1;i<=cntP;i++) printf("%d ",P[i]);
}

if(i%P[j]==0) break;保证了每个数只会被其最小的质因子筛掉一次,所以复杂度为\(O(n)\)。用反证法证明:假设\(x\)最小的质因子为\(p_0\),而\(x\)是被\(i\times p_j(p_j>p_0)\)筛掉的,那么必然有\(p_0|i\),在循环到\(j\)之前已经break了,矛盾。

那么接下来我们就可以来看线性求积性函数的代码了,这里以欧拉函数\(\varphi(n)\)为例。

void getF(int n)
{
    f[1]=1,p1[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!notP[i])
        {
            P[++cntP]=i;
            for(lint j=i;j<=n;j*=i) f[j]=j-j/i,p1[j]=j;    //1
        }
        for(int j=1;j<=cntP&&i*P[j]<=n;j++)
        {
            int x=i*P[j]; notP[x]=true;
            if(i%P[j]) f[x]=f[i]*f[P[j]],p1[x]=P[j];
            else {f[x]=f[i/p1[i]]*f[p1[i]*P[j]],p1[x]=p1[i]*P[j]; break;}
        }
    }
    for(int i=1;i<=n;i++) printf("%lld ",f[i]); puts("");
}

将正整数\(x\)表示为\(\prod_{i=1}^k p_i^{q_i}\)的形式,其中\(p_i\)是递增的。
\(cntP\)\(P[N]\)存储质数,\(f[x]\)记录函数的值,\(p1[x]\)记录\(x\)\(p_1^{q_1}\)
主要分析13,14行。
if(i%P[j]) f[x]=f[i]*f[P[j]],p1[x]=P[j]; 因为\(i\geq P_j\)\(i \ mod \ P_j \neq 0\),所以\(gcd(i,P_j)=1\)\(f(i\cdot P_j)=f(i)f(P_j)\)\(P_j\)\(i\cdot P_j\)最小的质因子且只有一个,所以\(p1[i\cdot P_j]=P_j\)
else {f[x]=f[i/p1[i]]*f[p1[i]*P[j]],p1[x]=p1[i]*P[j]; break;}易知\(f(x\cdot p_1)=f(\dfrac{x}{p_1^{q_1}})f(p_1^{q_1+1})\),而\(P_j\)恰是\(i\)\(p_1\)\(i\cdot P_j=p_1 \prod_{t=1}^k p_t^{q_t}=p_1^{q_1+1}\prod_{i=2}^k p_i^{q_i}\),所以\(p1[i\cdot P_j]=p_1^{q_1+1}=p1[i]\cdot P_j\)。本行的break和素数筛一样保证了复杂度为\(O(n)\)
不过当\(x=p_1^{q_1}\)时无法使用这个公式,所以要将注释1处的代码替换掉。

转载于:https://www.cnblogs.com/VisJiao/p/8735603.html

考虑可再生能源出力不确定的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济。文中可能涉及不确定建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文中提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定处理方法与需求响应机制的设计逻辑,同时可参考文档中列出的其他资源进行扩展学习与交叉验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值