الانتقال إلى المحتوى الرئيسي
  • primes() – يعيد جدولًا لا نهائيًا بعمود prime واحد (UInt64) يحتوي على أعداد أولية مرتبة ترتيبًا تصاعديًا، بدءًا من 2. استخدم LIMIT (واختياريًا OFFSET) لتقييد عدد الصفوف.
  • primes(N) – يعيد جدولًا بعمود prime واحد (UInt64) يحتوي على أول N عددًا أوليًا، بدءًا من 2.
  • primes(N, M) – يعيد جدولًا بعمود prime واحد (UInt64) يحتوي على M عددًا أوليًا، بدءًا من العدد الأولي ذي الفهرس N (بفهرسة تبدأ من 0).
  • primes(N, M, S) – يعيد جدولًا بعمود prime واحد (UInt64) يحتوي على M عددًا أوليًا، بدءًا من العدد الأولي ذي الفهرس N (بفهرسة تبدأ من 0)، وبخطوة 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 > 1e15 LIMIT 1;
  ┌────────────prime─┐
  │ 1000000000000037 │ -- 1.00 quadrillion
  └──────────────────┘
حلّ قيدًا توافقيًا على الأعداد الأولية ضمن نطاق كبير جدًا: اعثر على أول عدد أولي p >= 10^15 بحيث يكون باقي قسمة p على 65537 مساويًا لـ 1.
SELECT prime
FROM primes()
WHERE prime >= 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 │
  └────────┘

ملاحظات

  • أسرع الصيغ هي استعلامات النطاق البسيطة واستعلامات ترشيح النقاط التي تستخدم قيمة step الافتراضية (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. 
  • لا ينطبق تحسين نطاق القيم هذا على دوال الجداول المقيّدة (primes(N), primes(offset, count[, step])) مع WHERE، لأن هذه الصيغ تحدد جدولًا محدودًا وفق ترتيب الأعداد الأولية، ويجب تقييم عامل التصفية بعد إنشاء ذلك الجدول للحفاظ على الدلالات.
  • قد يكون استخدام offset غير صفري و/أو step أكبر من 1 (primes(offset, count) / primes(offset, count, step)) أبطأ، لأنه قد يلزم داخليًا توليد أعداد أولية إضافية وتخطيها. إذا لم تكن بحاجة إلى offset أو step، فتجاهلهما.
آخر تعديل في ٢٥ يونيو ٢٠٢٦