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부터 시작)부터 소수 인덱스 간격S로M개의 소수를 담은 단일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이고 p를 65537로 나눈 나머지가 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이나 간격이 필요 없다면 생략하세요.