计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)
- 参数
-
| dst | 结果矩阵。 |
| matA | 矩阵A |
| matB | 矩阵B |
| tp | 临时缓冲区,用于存储中间结果,需要分配7*(tn+1)个limb,若为NULL,则会自动分配。 |
| tn | 缓冲区的limb长度 |
| maxa | matA中最大的元素的limb长度+1,建议由lmmp_mat22_mul_size_确定 |
- 警告
- dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn>0
在文件 mat22_mul.c 第 194 行定义.
201 {
204 if (matA == matB) {
206 return;
207 }
209 ++tn;
212
213#define A11 (matA->a00)
214#define A12 (matA->a01)
215#define A21 (matA->a10)
216#define A22 (matA->a11)
217#define B11 (matB->a00)
218#define B12 (matB->a01)
219#define B21 (matB->a10)
220#define B22 (matB->a11)
221#define A11n (matA->n00)
222#define A12n (matA->n01)
223#define A21n (matA->n10)
224#define A22n (matA->n11)
225#define B11n (matB->n00)
226#define B12n (matB->n01)
227#define B21n (matB->n10)
228#define B22n (matB->n11)
229
230#define s1 (dst->a00)
231#define s2 (dst->a01)
232#define s3 (dst->a10)
233#define s4 (dst->a11)
234#define t1 (dst->a00 + maxa)
235#define t2 (dst->a01 + maxa)
236#define t3 (dst->a10 + maxa)
237#define t4 (dst->a11 + maxa)
238#define p1 (tp)
239#define p2 (tp + tn)
240#define p3 (tp + 2 * tn)
241#define p4 (tp + 3 * tn)
242#define p5 (tp + 4 * tn)
243#define p6 (tp + 5 * tn)
244#define p7 (tp + 6 * tn)
254
262
263#undef s1
264#undef s2
265#undef s3
266#undef s4
267#undef t1
268#undef t2
269#undef t3
270#undef t4
271
272#define p1n n1
273#define p2n n5
274#define p3n n2
275#define p4n n7
276#define p5n n6
277#define p6n n3
278#define p7n n4
279
280#undef A11
281#undef A12
282#undef A21
283#undef A22
284#undef B11
285#undef B12
286#undef B21
287#undef B22
288#undef A11n
289#undef A12n
290#undef A21n
291#undef A22n
292#undef B11n
293#undef B12n
294#undef B21n
295#undef B22n
296
297#define C11 (dst->a00)
298#define C12 (dst->a01)
299#define C21 (dst->a10)
300#define C22 (dst->a11)
301#define C11n (dst->n00)
302#define C12n (dst->n01)
303#define C21n (dst->n10)
304#define C22n (dst->n11)
305
307#define U1 p5
308#define U2 p1
309#define U3 U1
310#define U1n p5n
311#define U2n p1n
312#define U3n n8
316
321
322#undef C11
323#undef C12
324#undef C21
325#undef C22
326#undef C11n
327#undef C12n
328#undef C21n
329#undef C22n
330#undef U1
331#undef U2
332#undef U3
333#undef U1n
334#undef U2n
335#undef U3n
336
337#undef p1
338#undef p2
339#undef p3
340#undef p4
341#undef p5
342#undef p6
343#undef p7
344}
void lmmp_mat22_sqr_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *mat, mp_ptr tp, mp_size_t tn)
计算(稠密)2x2矩阵平方(STRASSEN算法)
#define BALLOC_TYPE(n, type)
引用了 A11, A11n, A12, A12n, A21, A21n, A22, A22n, B11, B11n, B12, B12n, B21, B21n, B22, B22n, BALLOC_TYPE, C11, C11n, C12, C12n, C21, C21n, C22, C22n, lmmp_add_signed_(), lmmp_mat22_sqr_strassen_(), lmmp_mul_signed_(), lmmp_param_assert, p1, p1n, p2, p2n, p3, p3n, p4, p4n, p5, p5n, p6, p6n, p7, p7n, s1, s2, s3, s4, t1, t2, t3, t4, TEMP_B_DECL, TEMP_B_FREE, tp, U1, U1n, U2, U2n, U3 , 以及 U3n.
被这些函数引用 lmmp_mat22_mul_().