primes

primes

소수를 담은 단일 prime 컬럼을 가진 테이블을 반환하는 테이블 함수예요. numbers 함수의 소수 버전이라고 볼 수 있어요.

출처: 문서

본문

소수를 담은 단일 prime 컬럼을 가진 테이블을 반환해요.

  • primes() – 2부터 시작해 오름차순의 소수를 담은 단일 prime 컬럼(UInt64)을 가진 무한 테이블을 반환해요. 행 수를 제한하려면 LIMIT(그리고 선택적으로 OFFSET)를 사용하세요.
  • primes(N) – 2부터 시작해 처음 N개의 소수를 담은 단일 prime 컬럼(UInt64)을 가진 테이블을 반환해요.
  • primes(N, M)N번째 소수(0부터 시작)부터 시작해 M개의 소수를 담은 단일 prime 컬럼(UInt64)을 가진 테이블을 반환해요.
  • primes(N, M, S)N번째 소수(0부터 시작)부터 소수 인덱스 간격 SM개의 소수를 담은 단일 prime 컬럼(UInt64)을 가진 테이블을 반환해요. 반환되는 소수는 인덱스 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;

예시 (Examples)

처음 10개의 소수.

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

1e15보다 큰 첫 번째 소수.

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

매우 큰 범위의 소수에 대한 모듈러 제약을 풀어요: p >= 10^15이고 p65537로 나눈 나머지가 1인 첫 번째 소수 p를 찾아요.

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

처음 7개의 메르센 소수.

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

참고 (Notes)

가장 빠른 형태는 기본 간격(1)을 사용하는 단순 범위 및 포인트 필터 쿼리예요. 예를 들어 primes(N) 또는 primes() LIMIT N처럼요. 이러한 형태는 최적화된 소수 생성기를 사용해 매우 큰 소수를 효율적으로 계산해요.

무제한 소스(primes() / system.primes)의 경우 prime BETWEEN ..., prime IN (...), prime = ... 같은 단순 값 필터를 생성 중 적용해 검색 값 범위를 제한할 수 있어요. 예를 들어 다음 쿼리는 거의 즉시 실행돼요:

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;
 ┌───────sum(prime)─┐
 │ 2004010006000641 │ -- 2.00 quadrillion
 └──────────────────┘

1 row in set. Elapsed: 0.090 sec. 

이 값 범위 최적화는 WHERE가 있는 제한된 테이블 함수(primes(N), primes(offset, count[, step]))에는 적용되지 않아요. 그 변형들은 소수 인덱스로 유한 테이블을 정의하고, 의미를 보존하려면 그 테이블을 생성한 뒤 필터를 평가해야 하기 때문이에요.

0이 아닌 offset 및/또는 1보다 큰 간격(primes(offset, count) / primes(offset, count, step))을 사용하면 추가 소수를 내부적으로 생성하고 건너뛰어야 할 수 있어서 더 느릴 수 있어요. offset이나 간격이 필요 없다면 생략하세요.

더 알아보기 (Learn more)