16#include "../../../include/lammp/impl/is_prime_table.h"
17#include "../../../include/lammp/impl/prime_table.h"
18#include "../../../include/lammp/impl/longlong.h"
19#include "../../../include/lammp/impl/mparam.h"
20#include "../../../include/lammp/lmmpn.h"
21#include "../../../include/lammp/numth.h"
27#define MONT63_MAX ((ulong)(0x7fffffffffffffff))
185 if (
v == 1 ||
v ==
m - 1)
187 for (
ulong j = 1; j <
t; ++j) {
213 for (
ulong j = 1; j <
t; ++j) {
236 for (
ulong j = 1; j <
t; ++j) {
260 if (
n % 2 == 0 ||
n <= 1)
265 }
else if (
judge == 1) {
281 while (
u % 2 == 0)
u /= 2, ++
t;
295 if (
n < 684630005672341) {
313 while (
u % 2 == 0)
u /= 2, ++
t;
347 while (
u % 2 == 0)
u /= 2, ++
t;
365 while (
u % 2 == 0)
u /= 2, ++
t;
382 if (
n % 2 == 0 ||
n <= 1)
387 }
else if (
judge == 1) {
452#define ULONG_PRIME_MAX 0xFFFFFFFFFFFFFFC5ull
453#define ULONG_PRIME_MIN 2
462 n += (
n % 2 == 0) ? 1 : 2;
492 n -= (
n % 2 == 0) ? 1 : 0;
static const uint16_t dj_base49[2048]
Copyright (C) 2026 HJimmyK(Jericho Knox)
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...
#define MONT63_MAX
Copyright (C) 2026 HJimmyK(Jericho Knox)
static ulong to_mont63(ulong x, ulong R2, ulong m, ulong m_inv)
bool lmmp_is_prime_notrial_(ulong n)
判断素数(无试除法)
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 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)
#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)
#define clz_shl_u64(r, x, cnt)
#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
int lmmp_is_prime_table_(uint p)
根据全局素数表判断一个数是否为素数
#define PRIME_SHORT_TABLE_N
const ushort prime_short_table[6542]
ushort lmmp_prime_cnt16_(ushort n)
计算小于等于 n 的素数数量