Перейти к основному содержимому
Перейти к основному содержимому

Табличная функция primes

  • primes() – возвращает бесконечную таблицу с единственным столбцом prime (UInt64), содержащим простые числа в порядке возрастания, начиная с 2. Используйте LIMIT (и при необходимости OFFSET), чтобы ограничить количество строк.

  • primes(N) – возвращает таблицу с единственным столбцом prime (UInt64), содержащим первые N простых чисел, начиная с 2.

  • primes(N, M) – возвращает таблицу с единственным столбцом prime (UInt64), содержащим M простых чисел, начиная с N-го простого числа (индексация с нуля).

  • primes(N, M, S) – возвращает таблицу с единственным столбцом prime (UInt64), содержащим M простых чисел, начиная с N-го простого числа (индексация с нуля) с шагом S по индексу простого числа. Возвращаемые простые числа соответствуют индексам N, N + S, N + 2S, ..., N + (M - 1)S. S должен быть >= 1.

Это аналогично системной таблице system.primes.

Следующие запросы эквивалентны:

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);

Следующие запросы также эквивалентны:

SELECT * FROM primes(10, 10);
SELECT * FROM primes() LIMIT 10 OFFSET 10;
SELECT * FROM system.primes LIMIT 10 OFFSET 10;

Примеры

Первые 10 простых чисел.

SELECT * FROM primes(10);
  ┌─prime─┐
  │     2 │
  │     3 │
  │     5 │
  │     7 │
  │    11 │
  │    13 │
  │    17 │
  │    19 │
  │    23 │
  │    29 │
  └───────┘

Первое простое число, большее 1e15.

SELECT prime FROM primes() WHERE prime > toUInt64(1e15) LIMIT 1;
  ┌────────────prime─┐
  │ 1000000000000037 │ -- 1.00 quadrillion
  └──────────────────┘

Решите задачу на сравнение по модулю для простых чисел в очень большом диапазоне: найдите первое простое число p >= 10^15 такое, что p по модулю 65537 даёт остаток 1.

SELECT prime
FROM primes()
WHERE prime >= toUInt64(1e15)
  AND prime % 65537 = 1
LIMIT 1;
 ┌────────────prime─┐
 │ 1000000001218399 │ -- 1.00 quadrillion
 └──────────────────┘

Первые семь простых чисел Мерсенна.

SELECT prime
FROM primes()
WHERE bitAnd(prime, prime + 1) = 0
LIMIT 7;
  ┌──prime─┐
  │      3 │
  │      7 │
  │     31 │
  │    127 │
  │   8191 │
  │ 131071 │
  │ 524287 │
  └────────┘

Примечания

  • Самые быстрые формы — это простые запросы с диапазоном и точечным фильтром, которые используют шаг по умолчанию (1), например primes(N) или primes() LIMIT N. Эти формы используют оптимизированный генератор простых чисел для эффективного вычисления очень больших простых чисел.
  • Для неограниченных источников (primes() / system.primes) простые фильтры по значениям, такие как prime BETWEEN ..., prime IN (...) или prime = ..., могут применяться во время генерации, чтобы ограничить диапазоны просматриваемых значений. Например, следующий запрос выполняется почти мгновенно:
SELECT sum(prime)
FROM primes()
WHERE prime BETWEEN toUInt64(1e6) AND toUInt64(1e6) + 100
   OR prime BETWEEN toUInt64(1e12) AND toUInt64(1e12) + 100
   OR prime BETWEEN toUInt64(1e15) AND toUInt64(1e15) + 100
   OR prime IN (9999999967, 9999999971, 9999999973)
   OR prime = 1000000000000037;
  ┌───────sum(prime)─┐
  │ 2004010006000641 │ -- 2.00 quadrillion
  └──────────────────┘

1 row in set. Elapsed: 0.090 sec. 
  • Эта оптимизация по диапазону значений не применяется к ограниченным табличным функциям (primes(N), primes(offset, count[, step])) с WHERE, поскольку эти варианты определяют конечную таблицу по индексу простого числа, и для сохранения семантики фильтр должен вычисляться после генерации этой таблицы.
  • Использование ненулевого смещения и/или шага больше 1 (primes(offset, count) / primes(offset, count, step)) может работать медленнее, поскольку функции может потребоваться сгенерировать дополнительные простые числа и затем отбросить их. Если вам не нужны смещение или шаг, просто не указывайте их.