随笔 - 68  文章 - 57  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

最近又研究了线性筛素数方法的扩展,的确非常强大。
经典的应用是线性时间筛欧拉函数和求约数个数。我想了一下线性时间筛约数和(积性函数),也是可行的。
对于一个大于1的数n,可以写成p1 ^ a1 * p2 ^ a2 * ... * pn ^ an,那么n的约数和就是(p1 ^ 0 + p1 ^ 1 + ... p1 ^ a1) * ... * (pn ^ 0 + ... + pn ^ an),由此就可以有递推关系了:
设f[i]表示i的约数和,e[i]表示i的最小素因子个数,t[i]表示(p1 ^ 0 + .. + p1 ^ a1),p1是t的最小素因子,a1是p1的幂次,这样对于i * p[j],如果p[j]不是i的因子,那么根据积性条件,f[i*p[j]] = f[i] * (1 + p[j]),e[i] = 1,t[i] = 1 + p[j];如果p[j]是i的因子,那么相当于t[i]多了一项p1 ^ (a1 + 1),首先e[i]++,然后tmp = t[i],t[i] += p[j] ^ e[i],f[i*p[j]] = f[i] / tmp * t[i]。这样也就做到了O(1)的时间计算出了f[i*p[j]]同时也计算出了附加信息。

这种方法还可以继续推广,例如可以记录i的最小素因子,这样就可以做到O(log n)时间的素因子分解。

posted on 2009-03-28 15:02 sdfond 阅读(180) 评论(0)  编辑 收藏 引用 所属分类: Algorithm - Number Theory

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理