LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mul.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../include/lammp/lmmpn.h"
8#include "../../include/lammp/impl/mparam.h"
9
10/*
11 Areas where the different toom algorithms can be called
120 1/6 1/5 1/4 1/3 2/5 1/2 5/9 3/5 2/3 3/4 4/5 9/10 1 nb/na
13
14 (-------------------(xxxxxxxxxx| toom22
15 (------------(xxxxxxxxxxxxxxx|----------) toom32
16 (----(xxxxxxxxxxxx|-------) toom42
17 (-------(xxxxxxxxxx| toom33
18(xxxxxxxxxxxxxxxxxxx| toom42-unblanced
19
20 (---(xxxxxxxxxx| toom44
21 (-------(xxxxxxxxxxx|----------) toom43
22 (--(xxxxxxxxx|-------) toom53
23 (--------(xxxxxx|-) toom52
24 (----(xxxxxxxx|---) | toom62
25(xxxxxxxxxx| | toom62-unblanced
26 9/20
270 1/6 1/5 1/4 1/3 2/5 1/2 5/9 3/5 2/3 3/4 4/5 9/10 1 nb/na
28*/
29
30void lmmp_mul_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t nb) {
31 lmmp_param_assert(na >= nb);
32 lmmp_param_assert(nb > 0);
33 if (na == nb) {
34 if (numa == numb)
35 lmmp_sqr_(dst, numa, na);
36 else
37 lmmp_mul_n_(dst, numa, numb, na);
38 } else if ((nb < MUL_TOOM22_THRESHOLD || nb < MUL_TOOMX2_THRESHOLD) && !(4 * na < 5 * nb)) {
39 if (na <= PART_SIZE || nb <= 2)
40 lmmp_mul_basecase_(dst, numa, na, numb, nb);
41 else {
43 lmmp_mul_basecase_(dst, numa, PART_SIZE, numb, nb);
44 dst += PART_SIZE;
45 numa += PART_SIZE;
46 na -= PART_SIZE;
47 lmmp_copy(tp, dst, nb);
48 while (na > PART_SIZE) {
49 lmmp_mul_basecase_(dst, numa, PART_SIZE, numb, nb);
50 if (lmmp_add_n_(dst, dst, tp, nb))
51 lmmp_inc(dst + nb);
52 dst += PART_SIZE;
53 numa += PART_SIZE;
54 na -= PART_SIZE;
55 lmmp_copy(tp, dst, nb);
56 }
57 if (na >= nb)
58 lmmp_mul_basecase_(dst, numa, na, numb, nb);
59 else
60 lmmp_mul_basecase_(dst, numb, nb, numa, na);
61 if (lmmp_add_n_(dst, dst, tp, nb))
62 lmmp_inc(dst + nb);
63 }
64 } else if (((na + nb) >> 1) < MUL_TOOM44_THRESHOLD || 2 * nb < MUL_TOOM44_THRESHOLD) {
65 if (na < 3 * nb) {
66 if (4 * na < 5 * nb) {
67 if (nb < MUL_TOOM33_THRESHOLD)
68 lmmp_mul_toom22_(dst, numa, na, numb, nb);
69 else
70 lmmp_mul_toom33_(dst, numa, na, numb, nb);
71 } else if (5 * na < 9 * nb)
72 lmmp_mul_toom32_(dst, numa, na, numb, nb);
73 else
74 lmmp_mul_toom42_(dst, numa, na, numb, nb);
75 } else
76 lmmp_mul_toom42_unbalance_(dst, numa, na, numb, nb);
77 } else if (((na + nb) >> 1) < MUL_FFT_THRESHOLD || 2 * nb < MUL_FFT_THRESHOLD) {
78 if (na < 5 * nb) {
79 if (4 * na < 5 * nb)
80 lmmp_mul_toom44_(dst, numa, na, numb, nb);
81 else if (3 * na < 5 * nb)
82 lmmp_mul_toom43_(dst, numa, na, numb, nb);
83 else if (9 * na < 20 * nb)
84 lmmp_mul_toom53_(dst, numa, na, numb, nb);
85 else if (na < 3 * nb)
86 lmmp_mul_toom52_(dst, numa, na, numb, nb);
87 else
88 lmmp_mul_toom62_(dst, numa, na, numb, nb);
89 } else
90 lmmp_mul_toom62_unbalance_(dst, numa, na, numb, nb);
91 } else {
92 if (na < 8 * nb)
93 lmmp_mul_fft_(dst, numa, na, numb, nb);
94 else
95 lmmp_mul_fft_unbalance_(dst, numa, na, numb, nb);
96 }
97}
98
100 if (n < MUL_TOOM22_THRESHOLD)
101 lmmp_mul_basecase_(dst, numa, n, numb, n);
102 else if (n < MUL_TOOM33_THRESHOLD)
103 lmmp_mul_toom22_(dst, numa, n, numb, n);
104 else if (n < MUL_TOOM44_THRESHOLD)
105 lmmp_mul_toom33_(dst, numa, n, numb, n);
106 else if (n < MUL_FFT_THRESHOLD)
107 lmmp_mul_toom44_(dst, numa, n, numb, n);
108 else
109 lmmp_mul_fft_(dst, numa, n, numb, n);
110}
mp_limb_t * mp_ptr
Definition lmmp.h:215
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
void lmmp_mul_toom22_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-22乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom44_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-44乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom42_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-42乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom42_unbalance_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-42不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
#define lmmp_inc(p)
大数加1宏(预期无进位)
Definition lmmpn.h:946
void lmmp_mul_toom43_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-43乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_basecase_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
基础乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom32_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-32乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_sqr_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
大数平方操作 [dst,2*na] = [numa,na]^2
Definition sqr.c:10
void lmmp_mul_toom52_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-52乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom62_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-62乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_fft_unbalance_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
FFT不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_toom53_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-53乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
void lmmp_mul_fft_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
FFT乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
Definition mul_fft.c:1085
void lmmp_mul_toom62_unbalance_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-62不平衡乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
mp_limb_t lmmp_add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无进位的n位加法 [dst,n] = [numa,n] + [numb,n]
Definition add_n.c:71
void lmmp_mul_toom33_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_srcptr numb, mp_size_t nb)
Toom-33乘法运算 [dst,na+nb] = [numa,na] * [numb,nb]
#define MUL_FFT_THRESHOLD
Definition mparam.h:54
#define MUL_TOOM22_THRESHOLD
Definition mparam.h:46
#define PART_SIZE
Definition mparam.h:89
#define MUL_TOOM33_THRESHOLD
Definition mparam.h:50
#define MUL_TOOMX2_THRESHOLD
Definition mparam.h:48
#define MUL_TOOM44_THRESHOLD
Definition mparam.h:52
void lmmp_mul_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
等长大数乘法操作 [dst,2*n] = [numa,n] * [numb,n]
Definition mul.c:99
void lmmp_mul_(mp_ptr restrict dst, mp_srcptr restrict numa, mp_size_t na, mp_srcptr restrict numb, mp_size_t nb)
Definition mul.c:30
#define tp