LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
perfsqr.c 文件参考
+ perfsqr.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define ADD(c, a, val)
 
#define B1   (LIMB_BITS / 4)
 
#define B2   (B1 * 2)
 
#define B3   (B1 * 3)
 
#define HIGH0(n)   ((n) >> B3)
 
#define HIGH1(n)   ((n) >> B2)
 
#define HIGH2(n)   ((n) >> B1)
 
#define LOW0(n)   ((n) & M3)
 
#define LOW1(n)   (((n) & M2) << B1)
 
#define LOW2(n)   (((n) & M1) << B2)
 
#define M1   ((1ULL << B1) - 1)
 
#define M2   ((1ULL << B2) - 1)
 
#define M3   ((1ULL << B3) - 1)
 
#define MASK48   (0xFFFFFFFFFFFF)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
#define PARTS0(n)   (LOW0(n) + HIGH0(n))
 
#define PARTS1(n)   (LOW1(n) + HIGH1(n))
 
#define PARTS2(n)   (LOW2(n) + HIGH2(n))
 

函数

static bool is_perfsqr_p13 (uchar r)
 
static bool is_perfsqr_p17 (uchar r)
 
static bool is_perfsqr_p241 (ushort r)
 
static bool is_perfsqr_p256 (uchar r)
 
static bool is_perfsqr_p257 (ushort r)
 
static bool is_perfsqr_p5 (uchar r)
 
static bool is_perfsqr_p673 (ushort r)
 
static bool is_perfsqr_p7 (uchar r)
 
static bool is_perfsqr_p9 (uchar r)
 
static bool is_perfsqr_p97 (uchar r)
 
mp_limb_t lmmp_mod_2p48sub1_ (mp_srcptr p, mp_size_t n)
 计算 [p,n] % 2^48-1
 
bool lmmp_perfsqr_filter_ (mp_srcptr p, mp_size_t n)
 非完全平方数过滤器
 
bool lmmp_perfsqr_filter_1_ (mp_limb_t p)
 非完全平方数过滤器
 

宏定义说明

◆ ADD

#define ADD (   c,
  a,
  val 
)
值:
do { \
mp_limb_t new_a = (a) + (val); \
(c) += new_a < (a); \
(a) = new_a; \
} while (0)
#define c
uint64_t mp_limb_t
Definition lmmp.h:76
#define n

在文件 perfsqr.c43 行定义.

44 { \
45 mp_limb_t new_a = (a) + (val); \
46 (c) += new_a < (a); \
47 (a) = new_a; \
48 } while (0)

◆ B1

#define B1   (LIMB_BITS / 4)

在文件 perfsqr.c21 行定义.

◆ B2

#define B2   (B1 * 2)

在文件 perfsqr.c22 行定义.

◆ B3

#define B3   (B1 * 3)

在文件 perfsqr.c23 行定义.

◆ HIGH0

#define HIGH0 (   n)    ((n) >> B3)

在文件 perfsqr.c30 行定义.

◆ HIGH1

#define HIGH1 (   n)    ((n) >> B2)

在文件 perfsqr.c33 行定义.

◆ HIGH2

#define HIGH2 (   n)    ((n) >> B1)

在文件 perfsqr.c36 行定义.

◆ LOW0

#define LOW0 (   n)    ((n) & M3)

在文件 perfsqr.c29 行定义.

◆ LOW1

#define LOW1 (   n)    (((n) & M2) << B1)

在文件 perfsqr.c32 行定义.

◆ LOW2

#define LOW2 (   n)    (((n) & M1) << B2)

在文件 perfsqr.c35 行定义.

◆ M1

#define M1   ((1ULL << B1) - 1)

在文件 perfsqr.c25 行定义.

◆ M2

#define M2   ((1ULL << B2) - 1)

在文件 perfsqr.c26 行定义.

◆ M3

#define M3   ((1ULL << B3) - 1)

在文件 perfsqr.c27 行定义.

◆ MASK48

#define MASK48   (0xFFFFFFFFFFFF)

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 perfsqr.c19 行定义.

◆ PARTS0

#define PARTS0 (   n)    (LOW0(n) + HIGH0(n))

在文件 perfsqr.c38 行定义.

◆ PARTS1

#define PARTS1 (   n)    (LOW1(n) + HIGH1(n))

在文件 perfsqr.c39 行定义.

◆ PARTS2

#define PARTS2 (   n)    (LOW2(n) + HIGH2(n))

在文件 perfsqr.c40 行定义.

函数说明

◆ is_perfsqr_p13()

static bool is_perfsqr_p13 ( uchar  r)
inlinestatic

在文件 perfsqr.c121 行定义.

121 {
122 return r == 0 || r == 1 || r == 3 || r == 4 || r == 9 || r == 10 || r == 12;
123}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p17()

static bool is_perfsqr_p17 ( uchar  r)
inlinestatic

在文件 perfsqr.c125 行定义.

125 {
126 return r == 0 || r == 1 || r == 2 || r == 4 || r == 8 || r == 9 || r == 13 || r == 15 || r == 16;
127}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p241()

static bool is_perfsqr_p241 ( ushort  r)
inlinestatic

在文件 perfsqr.c137 行定义.

137 {
138 static const uint64_t p241[] = {0x3C67A3116B15977F, 0x2FD21C174C8FA909, 0x98F24257C4CBA0E1, 0x0001FBA6A35A2317};
139 ushort elem = r / 64;
141 ushort bit = r % 64;
142 return (p241[elem] >> bit) & 1ULL;
143}
#define lmmp_param_assert(x)
Definition lmmp.h:423
uint16_t ushort
Definition numth.h:29

引用了 lmmp_param_assert , 以及 n.

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p256()

static bool is_perfsqr_p256 ( uchar  r)
inlinestatic

在文件 perfsqr.c164 行定义.

164 {
165 static const uint64_t p256[] = {0x0202021202030213, 0x0202021202020213, 0x0202021202030212, 0x0202021202020212};
166 ushort elem = r / 64;
168 ushort bit = r % 64;
169 return (p256[elem] >> bit) & 1ULL;
170}

引用了 lmmp_param_assert , 以及 n.

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p257()

static bool is_perfsqr_p257 ( ushort  r)
inlinestatic

在文件 perfsqr.c145 行定义.

145 {
146 static const uint64_t p257[] = {0x7E16541DE6E7AB17, 0x1F76811C93128359, 0x6B052324E205BBE3, 0xA3579D9EE0A9A1FA,
147 0x0000000000000001};
148 ushort elem = r / 64;
150 ushort bit = r % 64;
151 return (p257[elem] >> bit) & 1ULL;
152}

引用了 lmmp_param_assert , 以及 n.

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p5()

static bool is_perfsqr_p5 ( uchar  r)
inlinestatic

在文件 perfsqr.c113 行定义.

113 {
114 return r == 0 || r == 1 || r == 4;
115}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p673()

static bool is_perfsqr_p673 ( ushort  r)
inlinestatic

在文件 perfsqr.c154 行定义.

154 {
155 static const uint64_t p673[] = {0x85F744B13FA573DF, 0xC231D5979ABA4F21, 0xE944C76E98DD0C01, 0xD20E0F2BD993E915,
156 0x616259FB225208AB, 0x7E691A18F8B7B47C, 0x53C1C12F54412913, 0xDB8C8A5EA25F266F,
157 0xA6AE310E00C2EC65, 0x348BBE8613C97567, 0x00000001EF3A97F2};
158 ushort elem = r / 64;
160 ushort bit = r % 64;
161 return (p673[elem] >> bit) & 1ULL;
162}

引用了 lmmp_param_assert , 以及 n.

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p7()

static bool is_perfsqr_p7 ( uchar  r)
inlinestatic

在文件 perfsqr.c117 行定义.

117 {
118 return r == 0 || r == 1 || r == 2 || r == 4;
119}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p9()

static bool is_perfsqr_p9 ( uchar  r)
inlinestatic

在文件 perfsqr.c109 行定义.

109 {
110 return r == 0 || r == 1 || r == 4 || r == 7;
111}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ is_perfsqr_p97()

static bool is_perfsqr_p97 ( uchar  r)
inlinestatic

在文件 perfsqr.c129 行定义.

129 {
130 return r == 0 || r == 1 || r == 2 || r == 3 || r == 4 || r == 6 || r == 8 || r == 9 || r == 11 || r == 12 ||
131 r == 16 || r == 18 || r == 22 || r == 24 || r == 25 || r == 27 || r == 31 || r == 32 || r == 33 || r == 35 ||
132 r == 36 || r == 43 || r == 44 || r == 47 || r == 48 || r == 49 || r == 50 || r == 53 || r == 54 || r == 61 ||
133 r == 62 || r == 64 || r == 65 || r == 66 || r == 70 || r == 72 || r == 73 || r == 75 || r == 79 || r == 81 ||
134 r == 85 || r == 86 || r == 88 || r == 89 || r == 91 || r == 93 || r == 94 || r == 95 || r == 96;
135}

被这些函数引用 lmmp_perfsqr_filter_() , 以及 lmmp_perfsqr_filter_1_().

+ 这是这个函数的调用关系图:

◆ lmmp_mod_2p48sub1_()

mp_limb_t lmmp_mod_2p48sub1_ ( mp_srcptr  p,
mp_size_t  n 
)

计算 [p,n] % 2^48-1

参数
p被除数指针
n被除数的 limb 长度
警告
p!=NULL, n>0
返回
[numa,na] % 2^48-1

在文件 perfsqr.c50 行定义.

50 {
51 lmmp_param_assert(n > 0 && p != NULL);
52
53 mp_limb_t c0 = 0, c1 = 0, c2 = 0;
54 mp_limb_t a0 = 0, a1 = 0, a2 = 0;
55
56 while (n >= 3) {
57 ADD(c0, a0, p[0]);
58 ADD(c1, a1, p[1]);
59 ADD(c2, a2, p[2]);
60 p += 3;
61 n -= 3;
62 }
63 if (n == 2) {
64 ADD(c0, a0, p[0]);
65 ADD(c1, a1, p[1]);
66 } else if (n == 1) {
67 ADD(c0, a0, p[0]);
68 }
69
71 + PARTS1(c0) + PARTS2(c1) + PARTS0(c2);
72
73 res = (res & MASK48) + (res >> B3);
74 if (res >= MASK48)
75 res -= MASK48;
76 return res;
77}
#define a0
#define a1
#define a2
#define c1
#define c0
#define ADD(c, a, val)
Definition perfsqr.c:43
#define MASK48
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition perfsqr.c:19
#define PARTS0(n)
Definition perfsqr.c:38
#define PARTS1(n)
Definition perfsqr.c:39
#define B3
Definition perfsqr.c:23
#define PARTS2(n)
Definition perfsqr.c:40

引用了 a0, a1, a2, ADD, B3, c0, c1, lmmp_param_assert, MASK48, n, PARTS0, PARTS1 , 以及 PARTS2.

被这些函数引用 lmmp_perfsqr_filter_().

+ 这是这个函数的调用关系图:

◆ lmmp_perfsqr_filter_()

bool lmmp_perfsqr_filter_ ( mp_srcptr  p,
mp_size_t  n 
)

非完全平方数过滤器

参数
p输入指针
n输入的 limb 长度
警告
p!=NULL, n>0
返回
false 意味着必定为非完全平方数,所有完全平方数和部分非完全平方数会返回 true
注解
此过滤器主要针对随机输入情况,对于大概率是完全平方数的输入,可以无需此函数。

在文件 perfsqr.c181 行定义.

181 {
182 lmmp_param_assert(n > 0 && p != NULL);
183 mp_limb_t a = p[0] % 256;
184 if (!is_perfsqr_p256(a))
185 return false;
187 return is_perfsqr_p9(r % 9) && is_perfsqr_p5(r % 5) && is_perfsqr_p7(r % 7) && is_perfsqr_p13(r % 13) &&
188 is_perfsqr_p17(r % 17) && is_perfsqr_p97(r % 97) && is_perfsqr_p241(r % 241) &&
189 is_perfsqr_p257(r % 257) && is_perfsqr_p673(r % 673);
190}
static bool is_perfsqr_p7(uchar r)
Definition perfsqr.c:117
static bool is_perfsqr_p241(ushort r)
Definition perfsqr.c:137
static bool is_perfsqr_p17(uchar r)
Definition perfsqr.c:125
static bool is_perfsqr_p256(uchar r)
Definition perfsqr.c:164
static bool is_perfsqr_p673(ushort r)
Definition perfsqr.c:154
static bool is_perfsqr_p13(uchar r)
Definition perfsqr.c:121
static bool is_perfsqr_p257(ushort r)
Definition perfsqr.c:145
static bool is_perfsqr_p9(uchar r)
Definition perfsqr.c:109
mp_limb_t lmmp_mod_2p48sub1_(mp_srcptr p, mp_size_t n)
计算 [p,n] % 2^48-1
Definition perfsqr.c:50
static bool is_perfsqr_p5(uchar r)
Definition perfsqr.c:113
static bool is_perfsqr_p97(uchar r)
Definition perfsqr.c:129

引用了 is_perfsqr_p13(), is_perfsqr_p17(), is_perfsqr_p241(), is_perfsqr_p256(), is_perfsqr_p257(), is_perfsqr_p5(), is_perfsqr_p673(), is_perfsqr_p7(), is_perfsqr_p9(), is_perfsqr_p97(), lmmp_mod_2p48sub1_(), lmmp_param_assert , 以及 n.

+ 函数调用图:

◆ lmmp_perfsqr_filter_1_()

bool lmmp_perfsqr_filter_1_ ( mp_limb_t  p)

非完全平方数过滤器

参数
p输入数
返回
false 意味着必定为非完全平方数,所有完全平方数和部分非完全平方数会返回 true
注解
此过滤器主要针对随机输入情况,对于大概率是完全平方数的输入,可以无需此函数。

在文件 perfsqr.c172 行定义.

172 {
173 mp_limb_t a = p % 256;
174 if (!is_perfsqr_p256(a)) return false;
175 p = p % MASK48;
176 return is_perfsqr_p9(p % 9) && is_perfsqr_p5(p % 5) && is_perfsqr_p7(p % 7) && is_perfsqr_p13(p % 13) &&
177 is_perfsqr_p17(p % 17) && is_perfsqr_p97(p % 97) && is_perfsqr_p241(p % 241) &&
178 is_perfsqr_p257(p % 257) && is_perfsqr_p673(p % 673);
179}

引用了 is_perfsqr_p13(), is_perfsqr_p17(), is_perfsqr_p241(), is_perfsqr_p256(), is_perfsqr_p257(), is_perfsqr_p5(), is_perfsqr_p673(), is_perfsqr_p7(), is_perfsqr_p9(), is_perfsqr_p97(), MASK48 , 以及 n.

+ 函数调用图: