primes 表函数
-
primes()– 返回一个具有无限行、仅包含名为prime的单列 (UInt64) 的表,该列按升序包含从 2 开始的素数。使用LIMIT(以及可选的OFFSET) 来限制行数。 -
primes(N)– 返回一个仅包含prime列 (UInt64) 的表,该列包含从 2 开始的前N个素数。 -
primes(N, M)– 返回一个仅包含prime列 (UInt64) 的表,该列包含从第N个素数开始的M个素数 (素数索引从 0 开始计数) 。 -
primes(N, M, S)– 返回一个仅包含prime列 (UInt64) 的表,该列包含从第N个素数开始、按步长S(按素数索引) 的M个素数 (素数索引从 0 开始计数) 。返回的素数对应索引N, N + S, N + 2S, ..., N + (M - 1)S。S必须>= 1。
这与 system.primes 系统表类似。
以下查询是等价的:
下面的查询同样是等价的:
示例
前 10 个质数。
第一个大于 1e15 的素数。
在非常大的范围内,针对质数求解一个模条件:找到第一个满足 p >= 10^15 且 p 对 65537 取模结果为 1 的质数 p。
前 7 个梅森素数。
注意事项
- 速度最快的是使用默认步长 (
1) 的简单区间形式和点过滤查询,例如primes(N)或primes() LIMIT N。这些形式使用经过优化的素数生成器,可以高效地计算非常大的素数。 - 对于无界数据源 (
primes()/system.primes) ,可以在生成过程中应用诸如prime BETWEEN ...、prime IN (...)或prime = ...这样的简单值过滤器,以限制搜索的取值范围。例如,下面的查询几乎可以瞬间完成:
- 这种数值范围优化不适用于带有
WHERE的有界表函数 (primes(N)、primes(offset, count[, step])) ,因为这些变体是按素数序号定义一个有限表的,为了保持语义,必须在生成该表之后再应用WHERE过滤条件。 - 使用非零偏移量和/或大于 1 的步长 (
primes(offset, count)/primes(offset, count, step)) 可能会更慢,因为内部可能需要先生成并跳过额外的质数。如果你不需要偏移量或步长,可以省略这两个参数。