7#include "../../../include/lammp/impl/is_prime_table.h"
8#include "../../../include/lammp/impl/prime_table.h"
9#include "../../../include/lammp/impl/longlong.h"
10#include "../../../include/lammp/impl/mparam.h"
11#include "../../../include/lammp/lmmpn.h"
12#include "../../../include/lammp/numth.h"
18#define MONT63_MAX ((ulong)(0x7fffffffffffffff))
25 ulong c = tmp[0] < t[0];
32 ulong res = tmp[1] >= m ? tmp[1] - m : tmp[1];
69 ulong res = tmp[1] >= m ? tmp[1] - m : tmp[1];
75 u192 r = {0, 0, 1ull << shift};
175 if (v == 1 || v == m - 1)
177 for (
ulong j = 1; j < t; ++j) {
200 if (v == one || v == m_1)
203 for (
ulong j = 1; j < t; ++j) {
224 if (v == one || v == m_1)
226 for (
ulong j = 1; j < t; ++j) {
259 bases[1] =
dj_base49[((0x3AC69A35UL * n) & 0xFFFFFFFFUL) >> 21] + 3;
260 if (n % bases[0] == 0)
262 if (n % bases[1] == 0)
265 ulong u = n - 1, t = 0;
266 while (u % 2 == 0) u /= 2, ++t;
279 if (n < 684630005672341) {
282 bases[1] =
dj_base49[((0x3AC69A35UL * n) & 0xFFFFFFFFUL) >> 21] + 3;
283 if (n % bases[0] == 0)
285 if (n % bases[1] == 0)
296 ulong u = n - 1, t = 0;
297 while (u % 2 == 0) u /= 2, ++t;
308 ulong bbmask =
dj_base64[((0x3AC69A35UL * n) & 0xFFFFFFFFUL) >> 18];
310 bases[1] = (bbmask & 0x8000) ? 26460 : 9375;
311 bases[2] = (bbmask & 0x7FFF) + 3;
313 if (n % bases[0] == 0)
315 if (n % bases[1] == 0)
317 if (n % bases[2] == 0)
330 ulong u = n - 1, t = 0;
331 while (u % 2 == 0) u /= 2, ++t;
348 ulong u = n - 1, t = 0;
349 while (u % 2 == 0) u /= 2, ++t;
377 const _udiv64_t div13 = {.
magic = 4256940940086819604ull, .more = 3};
384 const _udiv64_t div17 = {.
magic = 16276538888567251426ull, .more = 4};
391 const _udiv64_t div19 = {.
magic = 12621456471485482685ull, .more = 4};
398 const _udiv64_t div23 = {.
magic = 7218291159277650633ull, .more = 4};
405 const _udiv64_t div29 = {.
magic = 1908283869694091547ull, .more = 4};
412 const _udiv64_t div31 = {.
magic = 595056260442243601ull, .more = 4};
418 const _udiv64_t div37 = {.
magic = 13461137567301564693ull, .more = 5};
425 const _udiv64_t div41 = {.
magic = 10348173504763894809ull, .more = 5};
432#define ULONG_PRIME_MAX 0xFFFFFFFFFFFFFFC5ull
433#define ULONG_PRIME_MIN 2
442 n += (n % 2 == 0) ? 1 : 2;
472 n -= (n % 2 == 0) ? 1 : 0;
static const uint16_t dj_base49[2048]
static const uint16_t dj_base64[16384]
static ulong mont63_reduce(u128 t, ulong m, ulong m_inv)
ulong lmmp_prev_prime_ulong_(ulong n)
小于等于n的上一个素数
static bool trial_div31(ulong n)
static ulong mont64_R2(ulong m)
static bool trial_div13(ulong n)
static bool trial_div41(ulong n)
static int miller_rabin_32(ulong a, ulong t, ulong u, uint m, _udiv64_t *binv)
bool lmmp_is_prime_uint_(uint n)
from http://probableprime.org/download/example-primality.c Deterministic Miller-Rabin tests for 64-bi...
static ulong to_mont63(ulong x, ulong R2, ulong m, ulong m_inv)
static bool trial_div29(ulong n)
static bool trial_div37(ulong n)
static ulong mont63_R2(ulong m)
static ulong from_mont64(ulong x, ulong m, ulong m_inv)
static ulong mont63_mul(ulong a, ulong b, ulong m, ulong m_inv)
uint lmmp_powmod_uint_(uint base, ulong exp, uint mod)
计算 base^exp 对 mod 取模
static int miller_rabin_64(ulong a, ulong t, ulong u, ulong m, ulong m_inv, ulong one, ulong m_1)
ulong lmmp_powmod_ulong_(ulong base, ulong exp, ulong mod)
计算 base^exp 对 mod 取模
static ulong mont64_mul(ulong a, ulong b, ulong m, ulong m_inv)
static ulong from_mont63(ulong x, ulong m, ulong m_inv)
static ulong mont64_reduce(u128 t, ulong m, ulong m_inv)
bool lmmp_is_prime_ulong_(ulong n)
判断素数
static ulong to_mont64(ulong x, ulong R2, ulong m, ulong m_inv)
static bool trial_div19(ulong n)
static bool trial_div23(ulong n)
ulong lmmp_next_prime_ulong_(ulong n)
大于n的下一个素数
static bool lmmp_is_prime_notrial_(ulong n)
static int miller_rabin_63(ulong a, ulong t, ulong u, ulong m, ulong m_inv, ulong one, ulong m_1)
static bool trial_div17(ulong n)
#define lmmp_param_assert(x)
mp_limb_t lmmp_div_1_s_(mp_ptr dstq, mp_ptr numa, mp_size_t na, mp_limb_t x)
单精度数除法(除数为1个limb)
int lmmp_leading_zeros_(mp_limb_t x)
计算一个单精度数(limb)中前导零的个数
#define _u128mul(r, x, y)
#define _u128add(r, x, y)
static _udiv64_t _udiv64_gen(uint64_t d)
static uint64_t _udiv64by64_q_preinv(uint64_t numer, const _udiv64_t *denom)
uint64_t u128[2]
请注意,此处的蒙哥马利域的R为2^64,p不可超过2^63-1
#define _u128sub64(r, x, _i64)
ulong lmmp_binvert_ulong_(ulong a)
计算 a 在2^64下的逆元
static int trial_div35711(ulong n)
校验是否能被3,5,7,11整除,能够整除则返回1,否则返回0
#define PRIME_SHORT_TABLE_SIZE
bool lmmp_is_prime_table_(uint p)
根据全局素数表判断一个数是否为素数
#define PRIME_SHORT_TABLE_N
const ushort prime_short_table[6542]
ushort lmmp_prime_cnt16_(ushort n)
计算小于等于 n 的素数数量