6年11个月前修改于 6年11个月前IP:山西
867373
26楼

楼上抛出的问题很有意思啊。


设函数ϕ(x) 等于不大于x的全体质数个数,则时间复杂度可以表示为O(ϕ(⌊√N⌋)) 。

因为算法的关键路径:

用小于K的所有质数去除N

(其中K=⌈√N⌉ )

可通过一个循环体来实现,循环次数 T=ϕ(K−1) 。

自然地,时间复杂度就为O(ϕ(⌈√N⌉−1)) = O(ϕ(⌊√N⌋)) 。

PS: 这里还涉及一个数据循环依赖的问题,我们姑且认为程序事先知道小于K的所有质数。


那么问题来了,ϕ(x) 是个什么样的函数呢?似乎黎曼等学者曾经研究过相关问题,过于深奥,这就愁坏了我个非数学专业的。

不过,单看上界ϕ(x)≤x 必然成立,有O(ϕ(x))=O(x) ,于是得到时间复杂度为:

O(√N) 。


虽然在全体正整数集上不清楚ϕ(x),但在有限范围内还是可以画出图像,观察得到N<=1e6总体呈线性增长,但斜率小于1。也就是说,这个算法可以作为同样具有O(√N) 复杂度的暴力解法的系数优化版本。

批注 2019-12-13 181343.png

但是这个算法实用嘛?前面说过,存在数据的循环依赖,不利于计算机去算。如果打表的话,优势似乎就没了。。。

评论(2)
文号 / 867373

浪迹天涯
名片发私信
学术分 0
总主题 0 帖总回复 4 楼拥有证书:进士 机友 笔友
注册于 2019/06/24 23:47:33最后登录 2023/04/19 03:08:55
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:云南

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的