min_25 筛因其发明者为 min_25 而得名。该算法的思想来源于埃氏筛。
其可以在低于线性的时间复杂度下对于一类积性函数 f f f 解决:
- ∑ i = 1 n [ i 为质数 ] f ( i ) \sum\limits_{i=1}^n[i\text{ 为质数}]f(i) i=1∑n[i 为质数]f(i);
- ∑ i = 1 n f ( i ) \sum\limits_{i=1}^nf(i) i=1∑nf(i)(即 f f f 的前缀和)。
记号
- P P P 为质数集合;
- p i p_i pi 为第 i i i 个质数(特别地, p 0 = 1 p_0=1 p0=1);
- min ( x ) \operatorname{min}(x) min(x) 为 x x x 的最小质因子;
- f ( x ) f(x) f(x) 为希望求出前缀和的积性函数;
- f ′ ( x ) f'(x) f′(x) 为 f ′ ( x ) = f ( x ) ( x ∈ P ) f'(x)=f(x)(x\in P) f′(x)=f(x)(x∈P) (即与 f f f 在质数处值相等)的一个完全积性函数。
筛质数的 f f f 的前缀和
记 g ( n ) = ∑ i = 1 n [ i ∈ P ] f ( i ) = ∑ i = 1 n [ i ∈ P ] f ′ ( i ) g(n)=\sum\limits_{i=1}^n[i\in P]f(i)=\sum\limits_{i=1}^n[i\in P]f'(i) g(n)=i=1∑n[i∈P]f(i)=i=1∑n[i∈P]f′(i)。
先考虑我们是如何用最原始的方法筛出所有质数的:由小到大枚举 p i p_i pi,将所有满足 p i ∣ x ( x > p i ) p_i|x(x>p_i) pi∣x(x>pi) 的 x x x 标记为合数。每一轮新被筛掉的数都满足 x ≠ p i and min ( x ) = p i x\not=p_i\ \text{and}\ \min(x)=p_i x=pi and min(x)=pi。
故记 g ( n , i ) g(n,i) g(n,i) 为第 i i i 轮筛完之后剩下的数的 f f f 的前缀和,即: g ( n , i ) = ∑ j = 1 n [ j ∈ P or min ( j ) > p i ] f ( i ) g(n,i)=\sum\limits_{j=1}^n[j\in P\ \text{or}\ \min(j)>p_i]f(i) g(n,i)=j=1∑n[j∈P or min(j)>pi]f(i)。
记 k k k 满足 p k 2 ≤ n < p k + 1 2 p_k^2\leq n< p_{k+1}^2 pk2≤n<pk+12,显然 k k k 轮筛完后只剩质数,即 g ( n ) = g ( n , k ) g(n)=g(n,k)