> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# primes

> 返回一个仅包含单个 `prime` 列的表，其中包含质数。

* `primes()` – 返回一个无限表，仅包含一个 `prime` 列 (UInt64) ，其中的值是按升序排列、从 2 开始的质数。使用 `LIMIT` (也可选用 `OFFSET`) 可限制返回的行数。

* `primes(N)` – 返回一个仅包含 `prime` 列 (UInt64) 的表，其中包含从 2 开始的前 `N` 个质数。

* `primes(N, M)` – 返回一个仅包含 `prime` 列 (UInt64) 的表，其中包含从第 `N` 个质数 (从 0 开始计数) 起的 `M` 个质数。

* `primes(N, M, S)` – 返回一个仅包含 `prime` 列 (UInt64) 的表，其中包含从第 `N` 个质数 (从 0 开始计数) 起、按质数索引以步长 `S` 选取的 `M` 个质数。返回的质数对应的索引为 `N, N + S, N + 2S, ..., N + (M - 1)S`。`S` 必须 `>= 1`。

这与 [`system.primes`](/zh/reference/system-tables/primes) 系统表类似。

以下查询是等价的：

```sql theme={null}
SELECT * FROM primes(10);
SELECT * FROM primes(0, 10);
SELECT * FROM primes() LIMIT 10;
SELECT * FROM system.primes LIMIT 10;
SELECT * FROM system.primes WHERE prime IN (2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
```

以下查询也等价：

```sql theme={null}
SELECT * FROM primes(10, 10);
SELECT * FROM primes() LIMIT 10 OFFSET 10;
SELECT * FROM system.primes LIMIT 10 OFFSET 10;
```

<div id="examples">
  ### 示例
</div>

前 10 个质数。

```sql theme={null}
SELECT * FROM primes(10);
```

```response theme={null}
  ┌─prime─┐
  │     2 │
  │     3 │
  │     5 │
  │     7 │
  │    11 │
  │    13 │
  │    17 │
  │    19 │
  │    23 │
  │    29 │
  └───────┘
```

大于 1e15 的第一个质数。

```sql theme={null}
SELECT prime FROM primes() WHERE prime > 1e15 LIMIT 1;
```

```response theme={null}
  ┌────────────prime─┐
  │ 1000000000000037 │ -- 1.00 quadrillion
  └──────────────────┘
```

在极大的范围内求解一个关于质数的模约束：找出第一个满足 `p >= 10^15` 且 `p` 对 `65537` 取模余 `1` 的质数 `p`。

```sql theme={null}
SELECT prime
FROM primes()
WHERE prime >= 1e15
  AND prime % 65537 = 1
LIMIT 1;
```

```response theme={null}
 ┌────────────prime─┐
 │ 1000000001218399 │ -- 1.00 quadrillion
 └──────────────────┘
```

前 7 个梅森质数。

```sql theme={null}
SELECT prime
FROM primes()
WHERE bitAnd(prime, prime + 1) = 0
LIMIT 7;
```

```response theme={null}
  ┌──prime─┐
  │      3 │
  │      7 │
  │     31 │
  │    127 │
  │   8191 │
  │ 131071 │
  │ 524287 │
  └────────┘
```

<div id="notes">
  ### 说明
</div>

* 速度最快的是使用默认步长 (`1`) 的普通范围查询和点过滤查询形式，例如 `primes(N)` 或 `primes() LIMIT N`。这些形式使用经过优化的质数生成器，可高效计算非常大的质数。
* 对于无界源 (`primes()` / `system.primes`) ，像 `prime BETWEEN ...`、`prime IN (...)` 或 `prime = ...` 这样的简单值过滤条件可以在生成过程中应用，以限制搜索范围。例如，以下查询几乎是瞬间执行的：

```sql theme={null}
SELECT sum(prime)
FROM primes()
WHERE prime BETWEEN 1e6 AND 1e6 + 100
   OR prime BETWEEN 1e12 AND 1e12 + 100
   OR prime BETWEEN 1e15 AND 1e15 + 100
   OR prime IN (9999999967, 9999999971, 9999999973)
   OR prime = 1000000000000037;
```

```response theme={null}
  ┌───────sum(prime)─┐
  │ 2004010006000641 │ -- 2.00千万亿
  └──────────────────┘

1 row in set. Elapsed: 0.090 sec. 
```

* 此值域优化不适用于带有 `WHERE` 的有界表函数 (`primes(N)`、`primes(offset, count[, step])`) ，因为这些变体按质数索引定义的是有限表；为保持语义不变，必须先生成该表，再计算过滤器。
* 使用非零的 offset 和/或大于 1 的 step (`primes(offset, count)` / `primes(offset, count, step)`) 可能会更慢，因为内部可能需要生成并跳过更多质数。如果不需要 offset 或 step，请省略它们。
