primes テーブル関数
-
primes()– 2 から始まる昇順の素数を含むprimeカラム (UInt64) を 1 つだけ持つ無限テーブルを返します。行数を制限するにはLIMIT(および必要に応じてOFFSET) を使用します。 -
primes(N)– 2 から始まる最初のN個の素数を含むprimeカラム (UInt64) を 1 つだけ持つテーブルを返します。 -
primes(N, M)–N番目 (0 始まり) の素数から始まるM個の素数を含むprimeカラム (UInt64) を 1 つだけ持つテーブルを返します。 -
primes(N, M, S)–N番目 (0 始まり) の素数から、ステップS(素数のインデックス単位) で進みながらM個の素数を含むprimeカラム (UInt64) を 1 つだけ持つテーブルを返します。返される素数はインデックス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])) には適用されません。これらのバリアントは素数のインデックスにもとづいて有限のテーブルを定義しており、その意味を保つために、そのテーブルを生成した後でフィルターを評価する必要があるためです。 - 非ゼロの
offsetおよび/または 1 より大きいstep(primes(offset, count)/primes(offset, count, step)) を使用すると、内部的に追加の素数を生成してスキップする必要が生じるため、より遅くなる場合があります。offsetやstepが不要な場合は、省略してください。