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

浏览源代码.

宏定义

#define b1n   1
 
#define b1n   1
 
#define b2n   1
 
#define b2n   2
 
#define b3n   2
 
#define b4n   2
 
#define define_1_npow_1_(_n_)
 
#define mul_b(i)
 

函数

static mp_size_t lmmp_10pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_11pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_12pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_13pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_14pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_15pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_1pow_1_ (mp_ptr restrict dst)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
static mp_size_t lmmp_2pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_3pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_4pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_5pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_6pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_7pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_8pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
static mp_size_t lmmp_9pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong exp)
 
mp_size_t lmmp_pow_1_ (mp_ptr restrict dst, mp_size_t rn, mp_limb_t base, ulong exp)
 
mp_size_t lmmp_u16_pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
 
mp_size_t lmmp_u32_pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
 
mp_size_t lmmp_u4_pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
 
mp_size_t lmmp_u64_pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
 
mp_size_t lmmp_u8_pow_1_ (mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
 

宏定义说明

◆ b1n [1/2]

#define b1n   1

◆ b1n [2/2]

#define b1n   1

◆ b2n [1/2]

#define b2n   1

◆ b2n [2/2]

#define b2n   2

◆ b3n

#define b3n   2

◆ b4n

#define b4n   2

◆ define_1_npow_1_

#define define_1_npow_1_ (   _n_)

在文件 pow_1.c96 行定义.

97 { \
98 TEMP_DECL; \
99 static const mp_limb_t tab[16] = { \
100 1, \
101 (mp_limb_t)_n_, \
102 (mp_limb_t)_n_ * _n_, \
103 (mp_limb_t)_n_ * _n_ * _n_, \
104 (mp_limb_t)_n_ * _n_ * _n_ * _n_, \
105 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_, \
106 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
107 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
108 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
109 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
110 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
111 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
112 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
113 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
114 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_, \
115 (mp_limb_t)_n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_ * _n_}; \
116 \
117 mp_size_t sqn = (rn + 2) >> 1; \
119 rn = 1; \
120 dst[0] = 1; \
121 int i = 15; \
122 while ((exp & (0xfull << ((i--) * 4))) == 0); \
123 for (++i; i >= 0; --i) { \
124 mp_size_t p = (exp & (0xfull << (i * 4))) >> (i * 4); \
125 dst[rn] = lmmp_mul_1_(dst, dst, rn, tab[p]); \
126 ++rn; \
127 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
128 if (i > 0) { \
129 lmmp_sqr_(sq, dst, rn); \
130 rn <<= 1; \
131 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
132 \
133 lmmp_sqr_(dst, sq, rn); \
134 rn <<= 1; \
135 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
136 \
137 lmmp_sqr_(sq, dst, rn); \
138 rn <<= 1; \
139 rn -= (sq[rn - 1] == 0) ? 1 : 0; \
140 \
141 lmmp_sqr_(dst, sq, rn); \
142 rn <<= 1; \
143 rn -= (dst[rn - 1] == 0) ? 1 : 0; \
144 } \
145 } \
146 TEMP_FREE; \
147 return rn; \
148 }
#define tab(i)
Definition lglg.h:28
mp_limb_t * mp_ptr
Definition lmmp.h:117
uint64_t mp_size_t
Definition lmmp.h:114
uint64_t mp_limb_t
Definition lmmp.h:113
mp_limb_t lmmp_mul_1_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_limb_t x)
乘以单limb操作 [dst,na] = [numa,na] * x
#define n
#define TEMP_DECL
Definition tmp_alloc.h:131
#define TEMP_FREE
Definition tmp_alloc.h:158
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:156

◆ mul_b

#define mul_b (   i)
值:
if (rn >= b##i##n) \
rn += b##i##n; \
rn -= (dst[rn - 1] == 0) ? 1 : 0;

在文件 pow_1.c336 行定义.

342 : 0;

函数说明

◆ lmmp_10pow_1_()

static mp_size_t lmmp_10pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c177 行定义.

177 {
179 lmmp_zero(dst, n);
180 rn = lmmp_5pow_1_(dst + n, rn - n, exp);
181 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
182 rn += n + 1;
183 rn -= dst[rn - 1] == 0 ? 1 : 0;
184 return rn;
185}
#define lmmp_zero(dst, n)
Definition lmmp.h:463
#define LIMB_BITS
Definition lmmp.h:123
mp_limb_t lmmp_shl_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl)
左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
Definition shl.c:19
static mp_size_t lmmp_5pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:150

引用了 LIMB_BITS, lmmp_5pow_1_(), lmmp_shl_(), lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_11pow_1_()

static mp_size_t lmmp_11pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c152 行定义.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_12pow_1_()

static mp_size_t lmmp_12pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c187 行定义.

187 {
188 mp_size_t n = (2 * exp) / LIMB_BITS;
189 lmmp_zero(dst, n);
190 rn = lmmp_3pow_1_(dst + n, rn - n, exp);
191 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, (2 * exp) % LIMB_BITS);
192 rn += n + 1;
193 rn -= dst[rn - 1] == 0 ? 1 : 0;
194 return rn;
195}
static mp_size_t lmmp_3pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:51

引用了 LIMB_BITS, lmmp_3pow_1_(), lmmp_shl_(), lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_13pow_1_()

static mp_size_t lmmp_13pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c153 行定义.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_14pow_1_()

static mp_size_t lmmp_14pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c197 行定义.

197 {
199 lmmp_zero(dst, n);
200 rn = lmmp_7pow_1_(dst + n, rn - n, exp);
201 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
202 rn += n + 1;
203 rn -= dst[rn - 1] == 0 ? 1 : 0;
204 return rn;
205}
static mp_size_t lmmp_7pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:151

引用了 LIMB_BITS, lmmp_7pow_1_(), lmmp_shl_(), lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_15pow_1_()

static mp_size_t lmmp_15pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c154 行定义.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_1pow_1_()

static mp_size_t lmmp_1pow_1_ ( mp_ptr restrict  dst)
static

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/.

在文件 pow_1.c23 行定义.

23 {
24 dst[0] = 1;
25 return 1;
26}

引用了 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_2pow_1_()

static mp_size_t lmmp_2pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c28 行定义.

28 {
30 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
31 rn = exp / LIMB_BITS + 1;
32 return rn;
33}

引用了 LIMB_BITS, lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_3pow_1_()

static mp_size_t lmmp_3pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c51 行定义.

51 {
53 static const mp_limb_t tab[32] = {
54 1, 3, 9, 27, 81, 243, 729, 2187,
55 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907,
56 43046721, 129140163, 387420489, 1162261467, 3486784401, 10460353203, 31381059609, 94143178827,
57 282429536481,847288609443,2541865828329,7625597484987,22876792454961,68630377364883,205891132094649,617673396283947,
58 };
59
61 rn = 1;
62 sq[0] = 1;
63 int i = 12;
64 while ((exp & (0x1full << ((i--) * 5))) == 0);
65 for (++i; i >= 0; --i) {
66 mp_size_t p = (exp & (0x1full << (i * 5))) >> (i * 5);
67 dst[rn] = lmmp_mul_1_(dst, sq, rn, tab[p]);
68 ++rn;
69 rn -= (dst[rn - 1] == 0) ? 1 : 0;
70 if (i > 0) {
71 lmmp_sqr_(sq, dst, rn);
72 rn <<= 1;
73 rn -= (sq[rn - 1] == 0) ? 1 : 0;
74
75 lmmp_sqr_(dst, sq, rn);
76 rn <<= 1;
77 rn -= (dst[rn - 1] == 0) ? 1 : 0;
78
79 lmmp_sqr_(sq, dst, rn);
80 rn <<= 1;
81 rn -= (sq[rn - 1] == 0) ? 1 : 0;
82
83 lmmp_sqr_(dst, sq, rn);
84 rn <<= 1;
85 rn -= (dst[rn - 1] == 0) ? 1 : 0;
86
87 lmmp_sqr_(sq, dst, rn);
88 rn <<= 1;
89 rn -= (sq[rn - 1] == 0) ? 1 : 0;
90 }
91 }
93 return rn;
94}
#define lmmp_sqr_
Definition inlines.h:166

引用了 lmmp_mul_1_(), lmmp_sqr_, n, tab, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_12pow_1_(), lmmp_6pow_1_(), lmmp_9pow_1_() , 以及 lmmp_u4_pow_1_().

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

◆ lmmp_4pow_1_()

static mp_size_t lmmp_4pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c35 行定义.

35 {
36 exp <<= 1;
38 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
39 rn = exp / LIMB_BITS + 1;
40 return rn;
41}

引用了 LIMB_BITS, lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_5pow_1_()

static mp_size_t lmmp_5pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c150 行定义.

被这些函数引用 lmmp_10pow_1_() , 以及 lmmp_u4_pow_1_().

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

◆ lmmp_6pow_1_()

static mp_size_t lmmp_6pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c156 行定义.

156 {
158 lmmp_zero(dst, n);
159 rn = lmmp_3pow_1_(dst + n, rn - n, exp);
160 dst[n + rn] = lmmp_shl_(dst + n, dst + n, rn, exp % LIMB_BITS);
161 rn += n;
162 rn -= dst[rn - 1] == 0 ? 1 : 0;
163 return rn;
164}

引用了 LIMB_BITS, lmmp_3pow_1_(), lmmp_shl_(), lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_7pow_1_()

static mp_size_t lmmp_7pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c151 行定义.

被这些函数引用 lmmp_14pow_1_() , 以及 lmmp_u4_pow_1_().

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

◆ lmmp_8pow_1_()

static mp_size_t lmmp_8pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c43 行定义.

43 {
44 exp *= 3;
46 dst[exp / LIMB_BITS] = (1ull << (exp % LIMB_BITS));
47 rn = exp / LIMB_BITS + 1;
48 return rn;
49}

引用了 LIMB_BITS, lmmp_zero , 以及 n.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_9pow_1_()

static mp_size_t lmmp_9pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  exp 
)
static

在文件 pow_1.c166 行定义.

166 {
167 TEMP_DECL;
168 mp_ptr restrict tp = TALLOC_TYPE((rn + 1) >> 1, mp_limb_t);
169 rn = lmmp_3pow_1_(tp, (rn + 1) >> 1, exp);
170 lmmp_sqr_(dst, tp, rn);
171 rn <<= 1;
172 rn -= dst[rn - 1] == 0 ? 1 : 0;
173 TEMP_FREE;
174 return rn;
175}
#define tp

引用了 lmmp_3pow_1_(), lmmp_sqr_, n, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

被这些函数引用 lmmp_u4_pow_1_().

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

◆ lmmp_pow_1_()

mp_size_t lmmp_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
mp_limb_t  base,
ulong  exp 
)

在文件 pow_1.c522 行定义.

522 {
523 lmmp_param_assert(base > 1);
525 if (base <= (mp_limb_t)0xf) {
526 return lmmp_u4_pow_1_(dst, rn, base, exp);
527 } else {
528 int tz = lmmp_tailing_zeros_(base);
529 base >>= tz;
530 mp_size_t shw = (exp * tz) / LIMB_BITS;
531 mp_size_t shl = (exp * tz) % LIMB_BITS;
532
534 lmmp_zero(dst, shw);
535 if (base <= (mp_limb_t)0xf)
536 rn = lmmp_u4_pow_1_(dst + shw, rn - shw, base, exp);
537 else if (base <= (mp_limb_t)MP_UCHAR_MAX)
538 rn = lmmp_u8_pow_1_(dst + shw, rn - shw, base, exp);
539 else if (base <= (mp_limb_t)MP_USHORT_MAX)
540 rn = lmmp_u16_pow_1_(dst + shw, rn - shw, base, exp);
541 else if (base <= (mp_limb_t)MP_UINT_MAX)
542 rn = lmmp_u32_pow_1_(dst + shw, rn - shw, base, exp);
543 else
544 rn = lmmp_u64_pow_1_(dst + shw, rn - shw, base, exp);
545
546 if (shl) {
547 dst[shw + rn] = lmmp_shl_(dst + shw, dst + shw, rn, shl);
548 rn += shw + 1;
549 rn -= (dst[rn - 1] == 0) ? 1 : 0;
550 } else {
551 rn += shw;
552 }
553 return rn;
554 }
555}
#define lmmp_tailing_zeros_
Definition inlines.h:161
#define lmmp_param_assert(x)
Definition lmmp.h:496
#define MP_UINT_MAX
Definition mparam.h:136
#define MP_UCHAR_MAX
Definition mparam.h:134
#define MP_USHORT_MAX
Definition mparam.h:135
mp_size_t lmmp_u4_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:207
mp_size_t lmmp_u64_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:427
mp_size_t lmmp_u16_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:285
mp_size_t lmmp_u8_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:245
mp_size_t lmmp_u32_pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong base, ulong exp)
Definition pow_1.c:344

引用了 LIMB_BITS, lmmp_param_assert, lmmp_shl_(), lmmp_tailing_zeros_, lmmp_u16_pow_1_(), lmmp_u32_pow_1_(), lmmp_u4_pow_1_(), lmmp_u64_pow_1_(), lmmp_u8_pow_1_(), lmmp_zero, MP_UCHAR_MAX, MP_UINT_MAX, MP_USHORT_MAX , 以及 n.

+ 函数调用图:

◆ lmmp_u16_pow_1_()

mp_size_t lmmp_u16_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  base,
ulong  exp 
)

在文件 pow_1.c285 行定义.

285 {
286 lmmp_param_assert(base >= 2);
288 TEMP_DECL;
289 mp_limb_t tab[8][2];
290 tab[0][0] = 1;
291 tab[0][1] = 0;
292 tab[1][0] = base;
293 tab[1][1] = 0;
294 tab[2][0] = tab[1][0] * base;
295 tab[2][1] = 0;
296 tab[3][0] = tab[2][0] * base;
297 tab[3][1] = 0;
298 lmmp_mullh_(tab[2][0], tab[2][0], tab[4]);
299 lmmp_mullh_(tab[3][0], tab[2][0], tab[5]);
300 lmmp_mullh_(tab[3][0], tab[3][0], tab[6]);
301 lmmp_mullh_(tab[3][0], tab[4][0], tab[7]);
302 tab[7][1] += tab[3][0] * tab[4][1];
303
305 rn = 1;
306 sq[0] = 1;
307 int i = 21;
308 while ((exp & (0x7ull << ((i--) * 3))) == 0);
309 for (++i; i >= 0; --i) {
310 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
311 mp_srcptr tap = tab[p];
312 mp_size_t tan = (tap[1] != 0) ? 2 : 1;
313 if (rn >= tan)
315 else
317 rn += tan;
318 rn -= (dst[rn - 1] == 0) ? 1 : 0;
319
320 if (i > 0) {
321 lmmp_sqr_(sq, dst, rn);
322 rn <<= 1;
323 rn -= (sq[rn - 1] == 0) ? 1 : 0;
324 lmmp_sqr_(dst, sq, rn);
325 rn <<= 1;
326 rn -= (dst[rn - 1] == 0) ? 1 : 0;
327 lmmp_sqr_(sq, dst, rn);
328 rn <<= 1;
329 rn -= (sq[rn - 1] == 0) ? 1 : 0;
330 }
331 }
332 TEMP_FREE;
333 return rn;
334}
#define lmmp_mullh_
Definition inlines.h:164
const mp_limb_t * mp_srcptr
Definition lmmp.h:118
void lmmp_mul_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
基础乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]

引用了 lmmp_mul_basecase_(), lmmp_mullh_, lmmp_param_assert, lmmp_sqr_, MP_USHORT_MAX, n, tab, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_pow_1_().

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

◆ lmmp_u32_pow_1_()

mp_size_t lmmp_u32_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  base,
ulong  exp 
)

在文件 pow_1.c344 行定义.

344 {
345 lmmp_param_assert(base >= 2);
347 TEMP_DECL;
348 mp_limb_t b1[1] = { base};
349#define b1n 1
350 mp_limb_t b2[1] = { base * base};
351#define b2n 1
352
353 mp_limb_t b3[2];
354#define b3n 2
355 lmmp_mullh_(b2[0], base, b3);
356
357 mp_limb_t b4[2];
358#define b4n 2
359 lmmp_mullh_(b2[0], b2[0], b4);
360
361 mp_limb_t b5[3];
362 b5[2] = lmmp_mul_1_(b5, b4, b4n, base);
363 mp_size_t b5n = b5[2] != 0 ? 3 : 2;
364
365 mp_limb_t b6[3];
367 mp_size_t b6n = b6[2] != 0 ? 3 : 2;
368
369 mp_limb_t b7[4];
370 b7[3] = lmmp_mul_1_(b7, b5, b5n, b2[0]);
371 mp_size_t b7n = 4;
372 while (b7[b7n - 1] == 0) --b7n;
373
375 sq[0] = 1;
376 rn = 1;
377 int i = 21;
378 while ((exp & (0x7ull << ((i--) * 3))) == 0);
379 for (++i; i >= 0; --i) {
380 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
381 switch (p) {
382 case 0:
383 lmmp_copy(dst, sq, rn);
384 break;
385 case 1:
386 mul_b(1);
387 break;
388 case 2:
389 mul_b(2);
390 break;
391 case 3:
392 mul_b(3);
393 break;
394 case 4:
395 mul_b(4);
396 break;
397 case 5:
398 mul_b(5);
399 break;
400 case 6:
401 mul_b(6);
402 break;
403 case 7:
404 mul_b(7);
405 break;
406 }
407 if (i > 0) {
408 lmmp_sqr_(sq, dst, rn);
409 rn <<= 1;
410 rn -= (sq[rn - 1] == 0) ? 1 : 0;
411 lmmp_sqr_(dst, sq, rn);
412 rn <<= 1;
413 rn -= (dst[rn - 1] == 0) ? 1 : 0;
414 lmmp_sqr_(sq, dst, rn);
415 rn <<= 1;
416 rn -= (sq[rn - 1] == 0) ? 1 : 0;
417 }
418 }
419 TEMP_FREE;
420 return rn;
421#undef b1n
422#undef b2n
423#undef b3n
424#undef b4n
425}
#define lmmp_copy(dst, src, n)
Definition lmmp.h:461
void lmmp_sqr_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
基础平方运算 [dst,2*na] = [numa,na]^2
#define b1
#define b2
#define b3
#define mul_b(i)
Definition pow_1.c:336
#define b4n
#define b3n

引用了 b1, b2, b3, b3n, b4n, lmmp_copy, lmmp_mul_1_(), lmmp_mullh_, lmmp_param_assert, lmmp_sqr_, lmmp_sqr_basecase_(), MP_UINT_MAX, mul_b, n, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_pow_1_().

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

◆ lmmp_u4_pow_1_()

mp_size_t lmmp_u4_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  base,
ulong  exp 
)

在文件 pow_1.c207 行定义.

207 {
208 switch (base) {
209 case 1:
210 return lmmp_1pow_1_(dst);
211 case 2:
212 return lmmp_2pow_1_(dst, rn, exp);
213 case 3:
214 return lmmp_3pow_1_(dst, rn, exp);
215 case 4:
216 return lmmp_4pow_1_(dst, rn, exp);
217 case 5:
218 return lmmp_5pow_1_(dst, rn, exp);
219 case 6:
220 return lmmp_6pow_1_(dst, rn, exp);
221 case 7:
222 return lmmp_7pow_1_(dst, rn, exp);
223 case 8:
224 return lmmp_8pow_1_(dst, rn, exp);
225 case 9:
226 return lmmp_9pow_1_(dst, rn, exp);
227 case 10:
228 return lmmp_10pow_1_(dst, rn, exp);
229 case 11:
230 return lmmp_11pow_1_(dst, rn, exp);
231 case 12:
232 return lmmp_12pow_1_(dst, rn, exp);
233 case 13:
234 return lmmp_13pow_1_(dst, rn, exp);
235 case 14:
236 return lmmp_14pow_1_(dst, rn, exp);
237 case 15:
238 return lmmp_15pow_1_(dst, rn, exp);
239 default:
241 return 0;
242 }
243}
static mp_size_t lmmp_8pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:43
static mp_size_t lmmp_11pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:152
static mp_size_t lmmp_4pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:35
static mp_size_t lmmp_9pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:166
static mp_size_t lmmp_14pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:197
static mp_size_t lmmp_13pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:153
static mp_size_t lmmp_2pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:28
static mp_size_t lmmp_6pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:156
static mp_size_t lmmp_10pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:177
static mp_size_t lmmp_15pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:154
static mp_size_t lmmp_12pow_1_(mp_ptr restrict dst, mp_size_t rn, ulong exp)
Definition pow_1.c:187
static mp_size_t lmmp_1pow_1_(mp_ptr restrict dst)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition pow_1.c:23

引用了 lmmp_10pow_1_(), lmmp_11pow_1_(), lmmp_12pow_1_(), lmmp_13pow_1_(), lmmp_14pow_1_(), lmmp_15pow_1_(), lmmp_1pow_1_(), lmmp_2pow_1_(), lmmp_3pow_1_(), lmmp_4pow_1_(), lmmp_5pow_1_(), lmmp_6pow_1_(), lmmp_7pow_1_(), lmmp_8pow_1_(), lmmp_9pow_1_(), lmmp_param_assert , 以及 n.

被这些函数引用 lmmp_pow_1_().

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

◆ lmmp_u64_pow_1_()

mp_size_t lmmp_u64_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  base,
ulong  exp 
)

在文件 pow_1.c427 行定义.

427 {
429 TEMP_DECL;
430
431#define b1n 1
432 mp_limb_t b1[1] = { base};
433#define b2n 2
434 mp_limb_t b2[2];
435 lmmp_mullh_(base, base, b2);
436 mp_limb_t b3[3];
437 b3[2] = lmmp_mul_1_(b3, b2, b2n, base);
438 mp_size_t b3n = b3[2] != 0 ? 3 : 2;
439
440 mp_limb_t b4[4];
442 mp_size_t b4n = b4[3] != 0 ? 4 : 3;
443
444 mp_limb_t b5[5];
445 b5[b4n] = lmmp_mul_1_(b5, b4, b4n, base);
446 mp_size_t b5n = b4n + 1;
447 b5n -= (b5[b5n - 1] == 0) ? 1 : 0;
448
449 mp_limb_t b6[6];
451 mp_size_t b6n = 2 * b3n;
452 b6n -= (b6[b6n - 1] == 0) ? 1 : 0;
453
454 mp_limb_t b7[7];
455 b7[b6n] = lmmp_mul_1_(b7, b6, b6n, b1[0]);
456 mp_size_t b7n = b6n + 1;
457 b7n -= (b7[b7n - 1] == 0) ? 1 : 0;
458
460 sq[0] = 1;
461 rn = 1;
462 int i = 21;
463 while ((exp & (0x7ull << ((i--) * 3))) == 0);
464 for (++i; i >= 0; --i) {
465 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
466 switch (p) {
467 case 0:
468 lmmp_copy(dst, sq, rn);
469 break;
470 case 1:
471 mul_b(1);
472 break;
473 case 2:
474 mul_b(2);
475 break;
476 case 3:
477 mul_b(3);
478 break;
479 case 4:
480 mul_b(4);
481 break;
482 case 5:
483 mul_b(5);
484 break;
485 case 6:
486 mul_b(6);
487 break;
488 case 7:
489 mul_b(7);
490 break;
491 }
492
493 if (i > 0) {
494 lmmp_sqr_(sq, dst, rn);
495 rn <<= 1;
496 rn -= (sq[rn - 1] == 0) ? 1 : 0;
497 lmmp_sqr_(dst, sq, rn);
498 rn <<= 1;
499 rn -= (dst[rn - 1] == 0) ? 1 : 0;
500 lmmp_sqr_(sq, dst, rn);
501 rn <<= 1;
502 rn -= (sq[rn - 1] == 0) ? 1 : 0;
503 }
504 }
505 TEMP_FREE;
506 return rn;
507#undef b1n
508#undef b2n
509#undef mul_b
510}
#define b2n

引用了 b1, b2, b2n, b3, b3n, b4n, lmmp_copy, lmmp_mul_1_(), lmmp_mullh_, lmmp_param_assert, lmmp_sqr_, lmmp_sqr_basecase_(), MP_UINT_MAX, mul_b, n, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_pow_1_().

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

◆ lmmp_u8_pow_1_()

mp_size_t lmmp_u8_pow_1_ ( mp_ptr restrict  dst,
mp_size_t  rn,
ulong  base,
ulong  exp 
)

在文件 pow_1.c245 行定义.

245 {
246 lmmp_param_assert(base >= 2);
248 TEMP_DECL;
249 mp_limb_t tab[8];
250 tab[0] = 1;
251 tab[1] = tab[0] * base;
252 tab[2] = tab[1] * base;
253 tab[3] = tab[2] * base;
254 tab[4] = tab[3] * base;
255 tab[5] = tab[4] * base;
256 tab[6] = tab[5] * base;
257 tab[7] = tab[6] * base;
258
260 sq[0] = 1;
261 rn = 1;
262 int i = 21;
263 while ((exp & (0x7ull << ((i--) * 3))) == 0);
264 for (++i; i >= 0; --i) {
265 mp_size_t p = (exp & (0x7ull << (i * 3))) >> (i * 3);
266 dst[rn] = lmmp_mul_1_(dst, sq, rn, tab[p]);
267 ++rn;
268 rn -= (dst[rn - 1] == 0) ? 1 : 0;
269 if (i > 0) {
270 lmmp_sqr_(sq, dst, rn);
271 rn <<= 1;
272 rn -= (sq[rn - 1] == 0) ? 1 : 0;
273 lmmp_sqr_(dst, sq, rn);
274 rn <<= 1;
275 rn -= (dst[rn - 1] == 0) ? 1 : 0;
276 lmmp_sqr_(sq, dst, rn);
277 rn <<= 1;
278 rn -= (sq[rn - 1] == 0) ? 1 : 0;
279 }
280 }
281 TEMP_FREE;
282 return rn;
283}

引用了 lmmp_mul_1_(), lmmp_param_assert, lmmp_sqr_, MP_UCHAR_MAX, n, tab, TALLOC_TYPE, TEMP_DECL , 以及 TEMP_FREE.

被这些函数引用 lmmp_pow_1_().

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