-
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، فتجاهلهما.