最近又研究了线性筛素数方法的扩展,的确非常强大。
经典的应用是线性时间筛欧拉函数和求约数个数。我想了一下线性时间筛约数和(积性函数),也是可行的。
对于一个大于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 阅读(201)
评论(0) 编辑 收藏 引用 所属分类:
Algorithm - Number Theory