LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mat22_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_IMPL_MAT22_MUL_H__
17#define __LAMMP_IMPL_MAT22_MUL_H__
18
19#include "../lmmp.h"
20
21
22#ifndef INLINE_
23#define INLINE_ static inline
24#endif
25
36
37/**
38 * @brief 计算2x2矩阵和2x2矩阵的乘积需要分配的内存
39 * @param dst 结果矩阵,dst中的n将会被覆盖为对应位置需要的limb长度,此函数不分配内存。
40 * @param matA 矩阵A
41 * @param matB 矩阵B
42 * @param tn 输出参数,将会被覆盖为缓冲区需要的limb长度,正数
43 * @param maxa 如果被覆盖,即matA中最大的元素的limb长度+1,此参数只有当确认使用STRASSEN算法时才需要
44 * @warning dst!=NULL, [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn!=NULL, maxa!=NULL
45 * @note 如果你可以确认一定不使用STRASSEN算法,则不需要maxa参数,其可以为NULL。
46 * @return 0表示选择basecase算法,1表示选择STRASSEN算法。
47 */
48int lmmp_mat22_mul_size_(lmmp_mat22_t* dst, const lmmp_mat22_t* matA, const lmmp_mat22_t* matB, mp_size_t* tn,
49 mp_size_t* maxa);
50
51/**
52 * @brief 计算2x2矩阵和2x2矩阵的乘积
53 * @param dst 结果矩阵。
54 * @param matA 矩阵A
55 * @param matB 矩阵B
56 * @param tp 临时缓冲区,用于存储中间结果,需要分配2*tn个limb,若为NULL,则会自动分配。
57 * @param tn 缓冲区的limb长度
58 * @warning dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn>0
59 */
60void lmmp_mat22_mul_basecase_(lmmp_mat22_t* dst, const lmmp_mat22_t* matA, const lmmp_mat22_t* matB, mp_ptr tp,
61 mp_size_t tn);
62
63/**
64 * @brief 计算2x2矩阵平方
65 * @param dst 结果矩阵。
66 * @param matA 矩阵A
67 * @param tp 临时缓冲区,用于存储中间结果,需要分配2*tn个limb,若为NULL,则会自动分配。
68 * @param tn 缓冲区的limb长度
69 * @warning dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0
70 */
72
73/**
74 * @brief 计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)
75 * @param dst 结果矩阵。
76 * @param matA 矩阵A
77 * @param matB 矩阵B
78 * @param tp 临时缓冲区,用于存储中间结果,需要分配7*(tn+1)个limb,若为NULL,则会自动分配。
79 * @param tn 缓冲区的limb长度
80 * @param maxa matA中最大的元素的limb长度+1,建议由lmmp_mat22_mul_size_确定
81 * @warning dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn>0
82 */
83void lmmp_mat22_mul_strassen_(lmmp_mat22_t* dst, const lmmp_mat22_t* matA, const lmmp_mat22_t* matB, mp_ptr tp,
84 mp_size_t tn, mp_size_t maxa);
85
86/**
87 * @brief 计算(稠密)2x2矩阵平方(STRASSEN算法)
88 * @param dst 结果矩阵。
89 * @param matA 矩阵A
90 * @param tp 临时缓冲区,用于存储中间结果,需要分配7*(tn+1)个limb,若为NULL,则会自动分配。
91 * @param tn 缓冲区的limb长度
92 * @warning dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0
93 */
95
96/**
97 * @brief 计算2x2矩阵和2x2矩阵的乘积
98 * @param dst 结果矩阵。
99 * @param matA 矩阵A
100 * @param matB 矩阵B
101 * @param choose 选择算法,0表示basecase算法,1表示STRASSEN算法
102 * @param tn 缓冲区的limb长度,建议由lmmp_mat22_mul_size_确定
103 * @param maxa matA中最大的元素的limb长度+1,建议由lmmp_mat22_mul_size_确定
104 * @warning dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), choose==[0|1]
105 */
106INLINE_ void
107lmmp_mat22_mul_(lmmp_mat22_t* dst, const lmmp_mat22_t* matA, const lmmp_mat22_t* matB, int choose, mp_size_t tn,
108 mp_size_t maxa) {
109 lmmp_param_assert(dst != NULL);
110 lmmp_param_assert(matA != NULL);
111 lmmp_param_assert(matB != NULL);
112 lmmp_param_assert(choose == 0 || choose == 1);
113 if (choose == 0) {
114 lmmp_mat22_mul_basecase_(dst, matA, matB, NULL, tn);
115 } else {
116 lmmp_mat22_mul_strassen_(dst, matA, matB, NULL, tn, maxa);
117 }
118}
119
120/**
121 * @brief 计算(稠密)2x2矩阵平方
122 * @param dst 结果矩阵。
123 * @param matA 矩阵A
124 * @param tn 缓冲区的limb长度,建议由lmmp_mat22_mul_size_确定
125 * @param choose 选择算法,0表示basecase算法,1表示STRASSEN算法
126 * @warning dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0
127 */
128INLINE_ void
129lmmp_mat22_sqr_(lmmp_mat22_t* dst, const lmmp_mat22_t* mat, int choose, mp_size_t tn) {
130 lmmp_param_assert(dst != NULL);
131 lmmp_param_assert(mat != NULL);
132 lmmp_param_assert(tn > 0);
133 lmmp_param_assert(choose == 0 || choose == 1);
134 if (choose == 0) {
135 lmmp_mat22_sqr_basecase_(dst, mat, NULL, tn);
136 } else {
137 lmmp_mat22_sqr_strassen_(dst, mat, NULL, tn);
138 }
139}
140
141#ifdef INLINE_
142#undef INLINE_
143#endif
144
145#endif // __LAMMP_IMPL_MAT22_MUL_H__
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_size_t
Definition lmmp.h:77
int64_t mp_ssize_t
Definition lmmp.h:79
#define lmmp_param_assert(x)
Definition lmmp.h:401
mp_ptr a01
Definition mat22_mul.h:28
mp_ssize_t n10
Definition mat22_mul.h:33
mp_ptr a11
Definition mat22_mul.h:30
void lmmp_mat22_mul_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn, mp_size_t maxa)
计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)
Definition mat22_mul.c:204
int lmmp_mat22_mul_size_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_size_t *tn, mp_size_t *maxa)
计算2x2矩阵和2x2矩阵的乘积需要分配的内存
Definition mat22_mul.c:23
void lmmp_mat22_mul_basecase_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn)
计算2x2矩阵和2x2矩阵的乘积
Definition mat22_mul.c:93
mp_ssize_t n11
Definition mat22_mul.h:34
void lmmp_mat22_sqr_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
计算(稠密)2x2矩阵平方(STRASSEN算法)
Definition mat22_mul.c:356
#define INLINE_
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition mat22_mul.h:23
static void lmmp_mat22_mul_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, int choose, mp_size_t tn, mp_size_t maxa)
计算2x2矩阵和2x2矩阵的乘积
Definition mat22_mul.h:107
static void lmmp_mat22_sqr_(lmmp_mat22_t *dst, const lmmp_mat22_t *mat, int choose, mp_size_t tn)
计算(稠密)2x2矩阵平方
Definition mat22_mul.h:129
void lmmp_mat22_sqr_basecase_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
计算2x2矩阵平方
Definition mat22_mul.c:129
mp_ssize_t n01
Definition mat22_mul.h:32
mp_ssize_t n00
Definition mat22_mul.h:31
mp_ptr a00
Definition mat22_mul.h:27
mp_ptr a10
Definition mat22_mul.h:29
#define tp