LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
ele_mul.h
浏览该文件的文档.
1/*
2 * [LAMMP]
3 * Copyright (C) [2025-2026] [HJimmyK(Jericho Knox)]
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#ifndef __LAMMP_ELE_MUL_H__
20#define __LAMMP_ELE_MUL_H__
21
22#include "../lmmpn.h"
23#include "../numth.h"
24#include "tmp_alloc.h"
25
26#ifndef INLINE_
27#define INLINE_ static inline
28#endif
29
30/*
31FIXME: 这里的优先队列乘法可以进一步优化,目前的实现,每次合并
32都需要调用一次lmmp_alloc,我们可以通过预先构建哈夫曼树,使用
33两块内存交替来使得计算乘法时,每个节点内存恰好不重叠,并刚好把
34结果写入到我们需要的内存块。
35同时另一个优化时,在初始化入队时,将所有元素的低位0全部移除,即
36保证奇数相乘,最后一次性移位完成。
37*/
38
39
44
46
47typedef struct num_heap {
49 size_t size;
50 size_t cap;
52
53/**
54 * @brief 初始化优先队列
55 * @param pq 优先队列指针
56 * @param capa 优先队列容量
57 */
58INLINE_ void lmmp_num_heap_init_(num_heap* restrict pq, size_t capa) {
59 pq->head = ALLOC_TYPE(capa, num_node);
60 for (size_t i = 0; i < capa; ++i) {
61 pq->head[i].num = NULL;
62 pq->head[i].n = 0;
63 }
64 pq->cap = capa;
65 pq->size = 0;
66}
67
68/**
69 * @brief 释放优先队列
70 * @param pq 优先队列指针
71 */
73 lmmp_debug_assert(pq->size == 0);
74 lmmp_free(pq->head);
75 pq->cap = 0;
76 pq->size = 0;
77 pq->head = NULL;
78}
79
80/**
81 * @brief 入队
82 * @param pq 优先队列指针
83 * @param elem 待入队的元素指针
84 * @param n 元素的 limb 长度
85 */
87
88/**
89 * @brief 出队
90 * @param pq 优先队列指针
91 * @param elem 出队的元素指针
92 * @return 若队列为空,返回 false,否则返回 true
93 */
95
96/**
97 * @brief 将队列中所有元素相乘
98 * @param pq 优先队列指针
99 * @param rn 结果指针的 limb 长度
100 * @warning 队列非空,pq!=NULL
101 * @note 返回的指针必须手动释放,原队列中的元素指针都将被释放
102 * @return 结果指针
103 */
105
106/**
107 * @brief 计算limbs数组的累乘积
108 * @param dst 结果指针(长度为 n 个 limb)
109 * @param limbs 数组指针
110 * @param n limbs数组长度
111 * @param tp 临时指针(长度为 n 个 limb)
112 * @warning dst!=NULL, limbs!=NULL, n>0, tp!=NULL
113 * @return 结果指针的 limb 长度
114 */
116
117typedef struct fac_t {
118 uint f; // factor
119 uint j; // exp
121
122typedef fac_t* fac_ptr;
123typedef const fac_t* fac_srcptr;
124
125/**
126 * @brief 计算因子的累乘,并将结果放入dst中
127 * @param dst 结果数组
128 * @param rn 结果数组的长度
129 * @param fac 因子数组(将会被递归覆盖)
130 * @param nfactors 因子数组的长度
131 * @warning 因子必须要小于N,且因子必须要单调递增,且不重复,因子的贡献必须要大于0。
132 * 因子数组必须为小因子大指数形式,可以存在大的因子有较大的指数,但整体的趋势必须是小因子大指数。
133 * 暂不清楚其最差可以接受至何种形式的因子数组。在组合数以及由阶乘和幂次构成的有理数中,未见不满足
134 * 此条件的例子。
135 * @return 结果数组的长度
136 */
138
139#undef INLINE_
140
141#endif // __LAMMP_ELE_MUL_H__
void lmmp_num_heap_push_(num_heap *pq, mp_ptr elem, mp_size_t n)
入队
mp_size_t lmmp_elem_mul_ulong_(mp_ptr dst, const ulongp limbs, mp_size_t n, mp_ptr tp)
计算limbs数组的累乘积
size_t size
Definition ele_mul.h:49
static void lmmp_num_heap_init_(num_heap *restrict pq, size_t capa)
初始化优先队列
Definition ele_mul.h:58
bool lmmp_num_heap_pop_(num_heap *pq, num_node_ptr elem)
出队
static void lmmp_num_heap_free_(num_heap *restrict pq)
释放优先队列
Definition ele_mul.h:72
fac_t * fac_ptr
Definition ele_mul.h:122
num_node_ptr restrict head
Definition ele_mul.h:48
mp_ptr lmmp_num_heap_mul_(num_heap *pq, mp_size_t *rn)
将队列中所有元素相乘
#define INLINE_
Definition ele_mul.h:27
uint f
Definition ele_mul.h:118
mp_size_t n
Definition ele_mul.h:42
size_t cap
Definition ele_mul.h:50
num_node * num_node_ptr
Definition ele_mul.h:45
uint j
Definition ele_mul.h:119
mp_ptr num
Definition ele_mul.h:41
const fac_t * fac_srcptr
Definition ele_mul.h:123
mp_size_t lmmp_factors_mul_(mp_ptr dst, mp_size_t rn, fac_ptr fac, uint nfactors)
计算因子的累乘,并将结果放入dst中
mp_limb_t * mp_ptr
Definition lmmp.h:215
uint64_t mp_size_t
Definition lmmp.h:212
#define lmmp_debug_assert(x)
Definition lmmp.h:387
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:204
#define tp
uint64_t * ulongp
Definition numth.h:45
uint32_t uint
Definition numth.h:35
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:112