LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
ele_mul.h
浏览该文件的文档.
1/**
2 * Copyright (C) 2026 HJimmyK(Jericho Knox)
3 *
4 * This file is part of LAMMP.
5 *
6 * LAMMP is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License (LGPL) as published
8 * by the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed WITHOUT ANY WARRANTY.
12 *
13 * See <https://www.gnu.org/licenses/>.
14 */
15
16#ifndef __LAMMP_ELE_MUL_H__
17#define __LAMMP_ELE_MUL_H__
18
19#include "../lmmpn.h"
20#include "../numth.h"
21#include "tmp_alloc.h"
22
23
24typedef struct {
27 sint left; // 左节点索引
28 sint right; // 右节点索引
29} huff_node;
30
31typedef struct {
35} huff_tree;
36
37
38/**
39 * @brief 初始化哈夫曼乘法树
40 * @param ht 哈夫曼乘法树指针
41 * @param cap 需要插入的元素的最大数量
42 * @warning 0<cap<2^30, ht!=NULL
43 */
44static inline void lmmp_huff_tree_init_(huff_tree* ht, sint cap) {
45 lmmp_param_assert(cap > 0);
46 lmmp_param_assert(cap < (1 << 30));
47 lmmp_param_assert(ht != NULL);
48 ht->root = ALLOC_TYPE(2 * cap - 1, huff_node);
49 ht->cap = cap;
50 ht->size = 0;
51}
52
53/**
54 * @brief 释放哈夫曼树
55 * @param ht 哈夫曼树指针
56 * @warning ht->size==0, ht!=NULL
57 */
58static inline void lmmp_huff_tree_free_(huff_tree* ht) {
59 lmmp_param_assert(ht != NULL);
60 lmmp_free(ht->root);
61 ht->cap = 0;
62 ht->size = 0;
63 ht->root = NULL;
64}
65
66/**
67 * @brief 入队哈夫曼树
68 * @param ht 哈夫曼树指针
69 * @param np 待入队的元素指针
70 * @param nn 元素的 limb 长度
71 * @warning ht!=NULL, ht->size<ht->cap, np!=NULL, nn>0
72 * @note 传入乘法元素必须为非空元素,可以和其他乘法元素指向完全相同
73 */
74static inline void lmmp_huff_tree_push_(huff_tree* ht, mp_srcptr np, mp_size_t nn) {
75 lmmp_param_assert(ht != NULL);
76 lmmp_param_assert(ht->size < ht->cap);
77 lmmp_param_assert(np != NULL);
78 lmmp_param_assert(nn > 0);
79 ht->root[ht->size].np = np;
80 ht->root[ht->size].nn = nn;
81 ht->root[ht->size].left = -1;
82 ht->root[ht->size].right = -1;
83 ht->size++;
84}
85
86/**
87 * @brief 构建哈夫曼乘法树
88 * @param ht 哈夫曼乘法树指针
89 * @warning ht!=NULL
90 * @return 构建后的根节点索引
91 */
93
94/**
95 * @brief 将哈夫曼树中所有元素相乘
96 * @param ht 哈夫曼乘法树指针
97 * @param ridx 哈夫曼乘法树根节点索引
98 * @param dst 结果指针(缓冲区长度为根节点的nn值)
99 * @param tp 临时指针(缓冲区长度为根节点的nn值)
100 * @warning pq!=NULL, dst!=NULL, tp!=NULL, sep(dst,tp)
101 * @return 结果指针的 limb 长度
102 */
104
105/**
106 * @brief 计算limbs数组的累乘积
107 * @param dst 结果指针(长度为 n 个 limb)
108 * @param limbs 数组指针
109 * @param n limbs数组长度
110 * @param tp 临时指针(长度为 n 个 limb)
111 * @warning dst!=NULL, limbs!=NULL, n>0, tp!=NULL
112 * @return 结果指针的 limb 长度
113 */
115
116typedef struct fac_t {
117 uint f; // factor
118 uint j; // exp
120
121typedef fac_t* fac_ptr;
122
123/**
124 * @brief 计算因子的累乘,并将结果放入dst中
125 * @param dst 结果数组
126 * @param rn 结果数组的长度
127 * @param fac 因子数组(将会被递归覆盖)
128 * @param nfactors 因子数组的长度
129 * @warning 因子必须要单调递增,可以接受重复因子(但不推荐这样做),因子的贡献必须要大于0。
130 * 已假定进入朴素乘法时,因子数组元素都小于等于0xffff,同时假定了,因子数组为小因子大指数形式,
131 * 可以存在大的因子有略大的指数,但整体的趋势应是小因子大指数。
132 * 在组合数以及由阶乘和幂次构成的有理数中,暂未见不满足这些假设的例子。
133 *
134 * @return 结果数组的长度
135 */
137
138/**
139 * @brief 计算因子的累乘,并将结果放入dst中
140 * @param dst 结果数组
141 * @param rn 结果数组的长度
142 * @param fac 因子数组(将会被递归覆盖),且因子数组元素都不可超过ushort范围
143 * @param nfactors 因子数组的长度
144 * @warning 因子必须要单调递增,且因子数组元素都不可超过ushort范围,可以接受重复因子(但不推荐这样做),
145 * 已假定进入朴素乘法时,因子数组元素都小于等于0xfff,同时假定了,因子数组为小因子大指数形式,
146 * 可以存在大的因子有略大的指数,但整体的趋势应是小因子大指数。
147 * 在组合数以及由阶乘和幂次构成的有理数中,暂未见不满足这些假设的例子。
148 * @return 结果数组的长度
149 */
151
152#endif // __LAMMP_ELE_MUL_H__
huff_node * root
Definition ele_mul.h:32
sint cap
Definition ele_mul.h:33
mp_size_t lmmp_elem_mul_ulong_(mp_ptr dst, const ulongp limbs, mp_size_t n, mp_ptr tp)
计算limbs数组的累乘积
static void lmmp_huff_tree_push_(huff_tree *ht, mp_srcptr np, mp_size_t nn)
入队哈夫曼树
Definition ele_mul.h:74
static void lmmp_huff_tree_free_(huff_tree *ht)
释放哈夫曼树
Definition ele_mul.h:58
mp_size_t lmmp_factors_mul_ushort_(mp_ptr dst, mp_size_t rn, fac_ptr fac, ushort nfactors)
计算因子的累乘,并将结果放入dst中
mp_size_t nn
Definition ele_mul.h:26
sint lmmp_huff_tree_build_(huff_tree *ht)
构建哈夫曼乘法树
static void lmmp_huff_tree_init_(huff_tree *ht, sint cap)
初始化哈夫曼乘法树
Definition ele_mul.h:44
mp_srcptr np
Definition ele_mul.h:25
fac_t * fac_ptr
Definition ele_mul.h:121
sint right
Definition ele_mul.h:28
sint size
Definition ele_mul.h:34
uint f
Definition ele_mul.h:117
mp_size_t lmmp_huff_tree_mul_(huff_tree *ht, sint ridx, mp_ptr dst, mp_ptr tp)
将哈夫曼树中所有元素相乘
uint j
Definition ele_mul.h:118
sint left
Definition ele_mul.h:27
mp_size_t lmmp_factors_mul_(mp_ptr dst, mp_size_t rn, fac_ptr fac, uint nfactors)
计算因子的累乘,并将结果放入dst中
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition ele_mul.h:24
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_size_t
Definition lmmp.h:77
const mp_limb_t * mp_srcptr
Definition lmmp.h:81
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:202
#define lmmp_param_assert(x)
Definition lmmp.h:401
#define tp
#define n
uint64_t * ulongp
Definition numth.h:41
uint32_t uint
Definition numth.h:31
uint16_t ushort
Definition numth.h:29
int32_t sint
Definition numth.h:33
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:173