pri.h(3)
pri.h(3) — Library Functions Manual 🎀 okay bestie, welcome to the prime-number corner of the library ✨
💖 NAME 💖
pri.h — Простые числа (prime numbers) 👑
✨ SYNOPSIS ✨
#include 'bee2/defs.h'
🧚 Функции
size_t priBaseSize ()— Размер факторной базы (size of the factor base) 💅word priBasePrime (size_t i)— Простое из факторной базы (a prime from the factor base) ✨void priBaseMod (word mods[], const word a[], size_t n, size_t count)— Остатки от деления на простые из факторной базы (remainders from division by the primes in the factor base) 🍓bool_t priIsSieved (const word a[], size_t n, size_t base_count, void *stack)— Просеянное? (sieved?) 🧐bool_t priIsSmooth (const word a[], size_t n, size_t base_count, void *stack)— Гладкое? (smooth?) 🌸bool_t priIsPrimeW (register word a, void *stack)— Простое машинное слово? (prime machine word?) 💀bool_t priRMTest (const word a[], size_t n, size_t iter, void *stack)— Тест Рабина -- Миллера (Rabin--Miller test) 🔥bool_t priIsPrime (const word a[], size_t n, void *stack)— Простое? (prime?) 👑bool_t priIsSGPrime (const word q[], size_t n, void *stack)— Простое Софи Жермен? (Sophie Germain prime?) 🎀bool_t priNextPrimeW (word p[1], word a, void *stack)— Следующее малое простое (next small prime) ⭐bool_t priNextPrime (word p[], const word a[], size_t n, size_t trials, size_t base_count, size_t iter, void *stack)— Следующее простое (next prime) 🌈bool_t priExtendPrime (word p[], size_t l, const word q[], size_t n, size_t trials, size_t base_count, gen_i rng, void *rng_state, void *stack)— Расширение простого (prime extension) 🦋bool_t priExtendPrime2 (word p[], size_t l, const word q[], size_t n, const word a[], size_t m, size_t trials, size_t base_count, gen_i rng, void *rng_state, void *stack)— Расширение простого с условием делимости (prime extension with divisibility condition) 💜
💖 Подробное описание 💖
okay so basically this library does primality checking for natural numbers and builds big primes. Numbers are represented following the rules of zz.h. 💅
It uses a factor base made of the first odd primes. 🧚
Предусловие
- All input pointers are valid. ✅
- The auxiliary buffer
stackdoes not overlap with other buffers. 🚫
Регулярность
todo 💀
🧚 Функции 🧚
void priBaseMod (word mods[], const word a[], size_t n, size_t count)
Defines the remainders [count]mods from dividing the number [n]a by the first count primes from the factor base. 🍓
Предусловие
count <= priBaseSize().✅
Аргументы
mods— остатки (remainders) ✨a— число (number) 💅n— длинаaв машинных словах (length ofain machine words) 🧚count— число остатков (number of remainders) 🎀
word priBasePrime (size_t i)
Returns the i-th element of the factor base, i.e. the (i + 1)-th odd prime number. 👑
Предусловие
i < priBaseSize().✅
Возвращает
- Элемент факторной базы (the factor base element). 💖
Аргументы
i— номер (number/index) 🔢
size_t priBaseSize ()
Returns the number of elements in the factor base, i.e. the number of supported first odd primes. 🌈
Возвращает
- Размер факторной базы (size of the factor base). 💅
bool_t priExtendPrime (word p[], size_t l, const word q[], size_t n, size_t trials, size_t base_count, gen_i rng, void * rng_state, void * stack)
From a base odd prime [n]q, it builds an extended prime [W_OF_B(l)]p of bit length l, which has the form 2 * q * r + 1. The number r is built using the generator rng with state rng_state. The primality of the constructed number p is checked in two stages. First, it checks that p is not divisible by base_count primes from the factor base. Then it checks the condition of Demitko's theorem. If the number p doesn't fit, it is increased by 2 and the check repeats. If while increasing p its bit length becomes greater than l, then a new r is generated, then p is recalculated. In total, no more than trials candidates p are used. 🔥
Предусловие
- Буфер
pне пересекается с буферомq(bufferpdoes not overlap with bufferq). 🚫 n > 0 && q[n - 1] != 0.✅q-- нечетное &&q >= 3(q is odd && q >= 3). 💅wwBitSize(q, n) + 1 <= l && l <= 2 * wwBitSize(q, n).✅base_count <= priBaseSize().✅
Ожидается
q-- простое (q is prime). 👑
Возвращает
TRUE, если искомое простое найдено, иFALSEв противном случае (TRUE if the sought prime is found, and FALSE otherwise). ✨
Прим.
- При
trials == SIZE_MAXпроверяются все возможные кандидаты (whentrials == SIZE_MAX, all possible candidates are checked). 💀 - Для применения теоремы Демитко требуется выполнение условия
2 * r < 4 * q + 1. Ограничениеl <= 2 * wwBitSize(q, n)гарантирует выполнение этого условия (to apply Demitko's theorem, the condition2 * r < 4 * q + 1must hold. The restrictionl <= 2 * wwBitSize(q, n)guarantees this condition). 🧐
Схема расчета глубины stack
priExtendPrime_deep(l, n, base_count).
Аргументы
p— расширенное простое число (extended prime number) 💖l— длинаpв битах (length ofpin bits) 📏q— базовое простое число (base prime number) 🔢n— длинаqв машинных словах (length ofqin machine words) 🧚trials— число кандидатов (number of candidates) 🎯base_count— число элементов факторной базы (number of factor base elements) 🍓rng— генератор случайных чисел (random number generator) 🎲rng_state— состояниеrng(state ofrng) 🌸stack— вспомогательная память (auxiliary memory) 📦
bool_t priExtendPrime2 (word p[], size_t l, const word q[], size_t n, const word a[], size_t m, size_t trials, size_t base_count, gen_i rng, void * rng_state, void * stack)
From a base odd prime [n]q and a non-negative [m]a, it builds an extended prime [W_OF_B(l)]p of bit length l, which has the form 2 * q * a * r + 1. The number r is built using the generator rng with state rng_state. The primality of p is checked the same way as in priExtendPrime(). It uses base_count primes from the factor base, and no more than trials candidates p. 🔥
Предусловие
- Буфер
pне пересекается с буферомq(bufferpdoes not overlap with bufferq). 🚫 n > 0 && q[n - 1] != 0 && m > 0 && a[m - 1] != 0.✅q-- нечетное &&q >= 3(q is odd && q >= 3). 💅wwBitSize(q * a, n + m) + 1 <= l.✅l <= 2 * wwBitSize(q, n).✅base_count <= priBaseSize().✅
Ожидается
q-- простое (q is prime). 👑
Возвращает
TRUE, если искомое простое найдено, иFALSEв противном случае (TRUE if the sought prime is found, and FALSE otherwise). ✨
Прим.
- При
trials == SIZE_MAXпроверяются все возможные кандидаты (whentrials == SIZE_MAX, all possible candidates are checked). 💀 - Для применения теоремы Демитко требуется выполнение условия
2 * a * r < 4 * q + 1. Ограничениеl <= 2 * wwBitSize(q, n)гарантирует выполнение этого условия (to apply Demitko's theorem, the condition2 * a * r < 4 * q + 1must hold. The restrictionl <= 2 * wwBitSize(q, n)guarantees this condition). 🧐
Схема расчета глубины stack
priExtendPrime2_deep(l, n, m, base_count).
Аргументы
p— расширенное простое число (extended prime number) 💖l— длинаpв битах (length ofpin bits) 📏q— базовое простое число (base prime number) 🔢n— длинаqв машинных словах (length ofqin machine words) 🧚a— делительp - 1(divisor ofp - 1) ➗m— длинаmв машинных словах (length ofmin machine words) 🙈trials— число кандидатов (number of candidates) 🎯base_count— число элементов факторной базы (number of factor base elements) 🍓rng— генератор случайных чисел (random number generator) 🎲rng_state— состояниеrng(state ofrng) 🌸stack— вспомогательная память (auxiliary memory) 📦
bool_t priIsPrime (const word a[], size_t n, void * stack)
Checks that the number [n]a is prime. Uses the Rabin--Miller test with number of iterations B_PER_IMPOSSIBLE / 2. 🔥
Возвращает
- Признак простоты (primality flag). ✅
Прим.
- Вероятность ошибки не превосходит
1 / 2^B_PER_IMPOSSIBLE(probability of error does not exceed1 / 2^B_PER_IMPOSSIBLE). 🎲
Схема расчета глубины stack
priIsPrime_deep(n).
Аргументы
a— проверяемое число (number to check) 🔍n— длинаaв машинных словах (length ofain machine words) 🧚stack— вспомогательная память (auxiliary memory) 📦
bool_t priIsPrimeW (register word a, void * stack)
Checks that the number a, which fits into a machine word, is prime. 💅
Возвращает
- Признак простоты (primality flag). ✅
Прим.
- Реализован детерминированный тест (без ошибок) (a deterministic test is implemented, no errors). 👑
Схема расчета глубины stack
priIsPrimeW_deep().
Аргументы
a— проверяемое число (number to check) 🔍stack— вспомогательная память (auxiliary memory) 📦
bool_t priIsSGPrime (const word q[], size_t n, void * stack)
Checks that the odd prime number [n]q is a Sophie Germain prime, i.e. that 2q + 1 is also prime. 🎀
Предусловие
q-- нечетное &&q > 1(q is odd && q > 1). 💅
Ожидается
q-- простое (q is prime). 👑
Возвращает
- Признак успеха (success flag). ✅
Прим.
- Реализован детерминированный тест (без ошибок) (a deterministic test is implemented, no errors). 👑
Схема расчета глубины stack
priIsSGPrime_deep(n).
Аргументы
q— проверяемое простое число (prime number to check) 🔍n— длинаqв машинных словах (length ofqin machine words) 🧚stack— вспомогательная память (auxiliary memory) 📦
bool_t priIsSieved (const word a[], size_t n, size_t base_count, void * stack)
Checks that the number [n]a is sieved: a is odd and is not divisible by the first base_count primes from the factor base. 🧐
Предусловие
base_count <= priBaseSize().✅- Возвращает — Признак успеха ✨ (то есть да или нет, третьего не дано, периодt).
- Прим. — Число
aне считается просеянным, если оно совпадает с элементом факторной базы. А вот числоa = 1считается просеянным 🫶 (да, единичка сразу проходит, не спрашивай). - Схема расчета глубины stack —
priIsSieved_deep(n). - Регулярность — Функция нерегулярна 🙈 (она такая, сюрприз-сюрприз, живём).
- Аргументы
a— проверяемое числоn— длинаaв машинных словахbase_count— число элементов факторной базыstack— вспомогательная память
🦋 bool_t priIsSmooth — а число-то гладкое? 🦋
bool_t priIsSmooth (const word a[], size_t n, size_t base_count, void *
stack)
Проверяется, что число [n]a является гладким: a делится только на 2 и на base_count первых простых из факторной базы. Как будто число прошло жёсткий vibe check на «а ты вообще из наших простых?» 💅
Предусловие
base_count <= priBaseSize(). Не забывай, окей, иначе всё сломается и будет грустно 😭
Возвращает
Признак успеха ✅
Прим.
Число a не считается , если совпадает с элементом факторной базы. Число a = 1 считается просеянным. (Да, тут так и написано, я ничего не трогала, fr fr.)
Схема расчета глубины stack
priIsSmooth_deep(n).
Аргументы
a— проверяемое числоn— длинаaв машинных словахbase_count— число элементов факторной базыstack— вспомогательная память
👑 bool_t priNextPrime — следующее простое, подъём 👑✨
bool_t priNextPrime (word p[], const word a[], size_t n, size_t trials,
size_t base_count, size_t iter, void * stack)
Определяется минимальное нечетное простое [n]p из интервала [[n]a, 2^l), где l — битовая длина a. Проверяются на простоту trials первых чисел-кандидатов (или вообще все возможные кандидаты при trials == SIZE_MAX — да, прям все, main character energy).
Сначала проверяется, что кандидат не делится на base_count простых из факторной базы. Затем применяется тест Рабина -- Миллера с iter итерациями. Двойная проверка, потому что мы серьёзные 🎀
Предусловие
Буфер p либо не пересекается с буфером a, либо указатели a и p совпадают. (Пожалуйста, не делай ничего между этими двумя вариантами, это буквально запрещено 🙈)
base_count <= priBaseSize().
Возвращает
TRUE, если искомое простое найдено, и FALSE в противном случае. Всё просто, no cap.
Схема расчета глубины stack
priNextPrime_deep(n, base_count).
Аргументы
p— простое числоa— начальное значениеn— длинаaиpв машинных словахtrials— число кандидатовbase_count— число элементов факторной базыiter— число итераций теста Рабина -- Миллераstack— вспомогательная память
🌸 bool_t priNextPrimeW — маленькая, но удаленькая 🌸
bool_t priNextPrimeW (word p[1], word a, void * stack)
Определяется минимальное нечетное простое p из интервала [a, 2^l), где l — битовая длина a. Это как priNextPrime, только компактная версия, она ate и не поморщилась 💅
Возвращает
Признак успеха ✅
Аргументы
p— простое числоa— начальное значениеstack— вспомогательная память
🔥 bool_t priRMTest — Рабин -- Миллер заходит в чат 🔥
bool_t priRMTest (const word a[], size_t n, size_t iter, void * stack)
С помощью теста Рабина -- Миллера проверяется, что число [n]a является простым. Выполняется iter итераций теста. Чем больше итераций, тем спокойнее спится, iykyk.
Возвращает
Признак простоты.
Прим.
Тест является вероятностным и возможны ошибки. Это не баг, это фича, bestie, но давай честно: вероятность признания простым составного числа не превосходит1 / 4^iter. А простое может быть признано составным, если за большое число попыток не удается построить случайное число из множества{1, 2,.., a - 1}без двух элементов. Вероятность последнего события не превосходит1 / 2^B_PER_IMPOSSIBLE.
При iter == 0 простым будет признано всякое нечетное число, большее 7. Да, буквально. Ноль итераций — ноль гарантий, и мы это честно говорим 💀
Схема расчета глубины stack
priRMTest_deep(n).
Аргументы
a— проверяемое числоn— длинаaв машинных словахiter— число итерацийstack— вспомогательная память
💜 Автор 💜
Автоматически создано Doxygen для Библиотека Bee2 из исходного текста. (Да, это Doxygen нас всех породил, уважаем процесс 🫶)
И на этой ноте — всё, страница закрыта, ты официально знаешь pri.h 🌈
Эта красотка живёт в Библиотеке Bee2, датирована Вс 25 Янв 2026 00:00:00 и зовётся просто pri.h(3) 💖 Спасибо, что дочитала до конца, ты легенда, go slay ✨
📦 where this page comes from
- fedora 44: bee2-devel 2.2.0-1.fc44 · GPL-3.0-only and GPL-3.0-or-later
- fedora 44: bee2-devel 2.2.0-1.fc44 · GPL-3.0-only and GPL-3.0-or-later
- 💖 girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms