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

浏览源代码.

宏定义

#define MAX_T   0xffffffffffffull
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

函数

ushortp lmmp_trialdiv_ (mp_srcptr restrict np, mp_size_t nn, ushort N, ushort *rn)
 
static ushortp lmmp_trialdiv_short_ (mp_srcptr restrict np, mp_size_t nn, ushort N, ushort *rn)
 

宏定义说明

◆ MAX_T

#define MAX_T   0xffffffffffffull

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

在文件 trialdiv.c22 行定义.

函数说明

◆ lmmp_trialdiv_()

ushortp lmmp_trialdiv_ ( mp_srcptr restrict  np,
mp_size_t  nn,
ushort  N,
ushort rn 
)

在文件 trialdiv.c80 行定义.

80 {
82 if (primen > 4 * nn) {
83 return lmmp_trialdiv_short_(np, nn, N, rn);
84 } else {
85 /*
86 if [np,nn] is too large, we calculate the product of primes up to N,
87 and divide [np,nn] by the product to get remainder.
88 */
90 ulongp restrict pp = SALLOC_TYPE(primen / 4 + 1, ulong);
91 ulong t = 1;
92 mp_size_t pn = 0;
93 for (ushort i = 0; i < primen; i++) {
95 if (t > MAX_T) {
96 pp[pn++] = t;
97 t = 1;
98 }
99 }
100 if (t > 1) {
101 pp[pn++] = t;
102 }
105
106 lmmp_div_(NULL, prod, np, nn, prod, pn);
107 while (pn > 0 && prod[pn - 1] == 0) --pn;
109 if (pn == 0) {
111 for (ushort i = 0; i < primen; i++) {
113 }
114 *rn = primen;
115 } else {
117 }
119 return ret;
120 }
121}
mp_size_t lmmp_elem_mul_ulong_(mp_ptr dst, const ulongp limbs, mp_size_t n, mp_ptr tp)
计算limbs数组的累乘积
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_size_t
Definition lmmp.h:77
uint64_t mp_limb_t
Definition lmmp.h:76
void lmmp_div_(mp_ptr dstq, mp_ptr dstr, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
大数除法和取模操作
Definition div.c:74
#define t
#define n
uint16_t * ushortp
Definition numth.h:37
uint64_t * ulongp
Definition numth.h:41
uint16_t ushort
Definition numth.h:29
uint64_t ulong
Definition numth.h:32
const ushort prime_short_table[6542]
ushort lmmp_prime_cnt16_(ushort n)
计算小于等于 n 的素数数量
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:173
#define SALLOC_TYPE(n, type)
Definition tmp_alloc.h:144
#define TEMP_S_DECL
Definition tmp_alloc.h:133
#define TEMP_S_FREE
Definition tmp_alloc.h:166
#define MAX_T
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition trialdiv.c:22
static ushortp lmmp_trialdiv_short_(mp_srcptr restrict np, mp_size_t nn, ushort N, ushort *rn)
Definition trialdiv.c:24

引用了 ALLOC_TYPE, lmmp_div_(), lmmp_elem_mul_ulong_(), lmmp_prime_cnt16_(), lmmp_trialdiv_short_(), MAX_T, n, prime_short_table, SALLOC_TYPE, t, TEMP_S_DECL , 以及 TEMP_S_FREE.

+ 函数调用图:

◆ lmmp_trialdiv_short_()

static ushortp lmmp_trialdiv_short_ ( mp_srcptr restrict  np,
mp_size_t  nn,
ushort  N,
ushort rn 
)
static

在文件 trialdiv.c24 行定义.

24 {
25 if (np == NULL || nn == 0) {
26 *rn = 0;
27 return NULL;
28 }
29 ulong t = 1;
30 ushort idx[20];
31 uint idx_cnt = 0;
32 ushort retn_max = 10;
34 ushort retn = 0;
35 if (!(np[0] & 1)) {
36 ret[retn++] = 2;
37 }
38 for (mp_size_t i = 1;; i++) {
40 if (p > N || i >= PRIME_SHORT_TABLE_SIZE - 1) break;
41 t *= p;
42 idx[idx_cnt++] = p;
43 if (t > MAX_T || idx_cnt == 20) {
44 mp_limb_t r = lmmp_mod_1_(np, nn, t);
45 for (uint j = 0; j < idx_cnt; j++) {
46 if (r == 0 || r % idx[j] == 0) {
47 ret[retn++] = idx[j];
48 if (retn == retn_max) {
49 retn_max = retn_max * 12 / 10;
51 }
52 }
53 }
54 idx_cnt = 0;
55 t = 1;
56 }
57 }
58 if (idx_cnt > 0) {
59 mp_limb_t r = lmmp_mod_1_(np, nn, t);
60 for (uint j = 0; j < idx_cnt; j++) {
61 if (r == 0 || r % idx[j] == 0) {
62 ret[retn++] = idx[j];
63 if (retn == retn_max) {
64 retn_max += 10;
66 }
67 }
68 }
69 }
70 if (retn == 0) {
72 *rn = 0;
73 return NULL;
74 } else {
75 *rn = retn;
76 return ret;
77 }
78}
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:202
mp_limb_t lmmp_mod_1_(mp_srcptr numa, mp_size_t na, mp_limb_t x)
单精度数取余
Definition div.c:31
uint32_t uint
Definition numth.h:31
#define PRIME_SHORT_TABLE_SIZE
Definition prime_table.h:29
#define REALLOC_TYPE(p, new_size, type)
Definition tmp_alloc.h:175

引用了 ALLOC_TYPE, lmmp_free(), lmmp_mod_1_(), MAX_T, n, prime_short_table, PRIME_SHORT_TABLE_SIZE, REALLOC_TYPE , 以及 t.

被这些函数引用 lmmp_trialdiv_().

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