16 #include "../../../include/lammp/impl/tmp_alloc.h"
17#include "../../../include/lammp/numth.h"
18#include "../../../include/lammp/lmmpn.h"
21#define MASK48 (0xFFFFFFFFFFFF)
23#define B1 (LIMB_BITS / 4)
27#define M1 ((1ULL << B1) - 1)
28#define M2 ((1ULL << B2) - 1)
29#define M3 ((1ULL << B3) - 1)
31#define LOW0(n) ((n) & M3)
32#define HIGH0(n) ((n) >> B3)
34#define LOW1(n) (((n) & M2) << B1)
35#define HIGH1(n) ((n) >> B2)
37#define LOW2(n) (((n) & M1) << B2)
38#define HIGH2(n) ((n) >> B1)
40#define PARTS0(n) (LOW0(n) + HIGH0(n))
41#define PARTS1(n) (LOW1(n) + HIGH1(n))
42#define PARTS2(n) (LOW2(n) + HIGH2(n))
45#define ADD(c, a, val) \
47 mp_limb_t new_a = (a) + (val); \
112 return r == 0 || r == 1 || r == 4 || r == 7;
116 return r == 0 || r == 1 || r == 4;
120 return r == 0 || r == 1 || r == 2 || r == 4;
124 return r == 0 || r == 1 || r == 3 || r == 4 || r == 9 || r == 10 || r == 12;
128 return r == 0 || r == 1 || r == 2 || r == 4 || r == 8 || r == 9 || r == 13 || r == 15 || r == 16;
132 return r == 0 || r == 1 || r == 2 || r == 3 || r == 4 || r == 6 || r == 8 || r == 9 || r == 11 || r == 12 ||
133 r == 16 || r == 18 || r == 22 || r == 24 || r == 25 || r == 27 || r == 31 || r == 32 || r == 33 || r == 35 ||
134 r == 36 || r == 43 || r == 44 || r == 47 || r == 48 || r == 49 || r == 50 || r == 53 || r == 54 || r == 61 ||
135 r == 62 || r == 64 || r == 65 || r == 66 || r == 70 || r == 72 || r == 73 || r == 75 || r == 79 || r == 81 ||
136 r == 85 || r == 86 || r == 88 || r == 89 || r == 91 || r == 93 || r == 94 || r == 95 || r == 96;
140 static const uint64_t
p241[] = {0x3C67A3116B15977F, 0x2FD21C174C8FA909, 0x98F24257C4CBA0E1, 0x0001FBA6A35A2317};
148 static const uint64_t
p257[] = {0x7E16541DE6E7AB17, 0x1F76811C93128359, 0x6B052324E205BBE3, 0xA3579D9EE0A9A1FA,
157 static const uint64_t
p673[] = {0x85F744B13FA573DF, 0xC231D5979ABA4F21, 0xE944C76E98DD0C01, 0xD20E0F2BD993E915,
158 0x616259FB225208AB, 0x7E691A18F8B7B47C, 0x53C1C12F54412913, 0xDB8C8A5EA25F266F,
159 0xA6AE310E00C2EC65, 0x348BBE8613C97567, 0x00000001EF3A97F2};
167 static const uint64_t
p256[] = {0x0202021202030213, 0x0202021202020213, 0x0202021202030212, 0x0202021202020212};
203 if (
filter ==
false)
return false;
const mp_limb_t * mp_srcptr
#define lmmp_param_assert(x)
static int lmmp_zero_q_(mp_srcptr p, mp_size_t n)
判零函数(内联)
uint8_t uchar
Copyright (C) 2026 HJimmyK(Jericho Knox)
void lmmp_sqrt_(mp_ptr dsts, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_size_t nf)
计算 [numa,na] * B^(2*nf) 的平方根和余数
static bool is_perfsqr_p7(uchar r)
#define MASK48
Copyright (C) 2026 HJimmyK(Jericho Knox)
static bool is_perfsqr_p241(ushort r)
bool lmmp_perfsqr_filter_1_(mp_limb_t p)
非完全平方数过滤器
static bool is_perfsqr_p17(uchar r)
static bool is_perfsqr_p256(uchar r)
static bool is_perfsqr_p673(ushort r)
bool lmmp_perfsqr_(mp_srcptr p, mp_size_t n)
判断[p,n]是否为完全平方数
static bool is_perfsqr_p13(uchar r)
static bool is_perfsqr_p257(ushort r)
static bool is_perfsqr_p9(uchar r)
mp_limb_t lmmp_mod_2p48sub1_(mp_srcptr p, mp_size_t n)
计算 [p,n] % 2^48-1
static bool is_perfsqr_p5(uchar r)
static bool is_perfsqr_p97(uchar r)
bool lmmp_perfsqr_filter_(mp_srcptr p, mp_size_t n)
非完全平方数过滤器
#define TALLOC_TYPE(n, type)