LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mul_toom_interp5.c
浏览该文件的文档.
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#include "../../../include/lammp/impl/divexact.h"
17#include "../../../include/lammp/impl/toom_interp.h"
18
19
22 mp_size_t dnp = 2 * n + 1;
23
24#define r0 (dst)
25#define r1 (dst + n)
26#define r2 (dst + 2 * n)
27#define r3 (dst + 3 * n)
28#define r4 (dst + 4 * n)
29#define v0 r0
30#define v1 r2
31#define vinf r4
32
33 // v2=(v2-vm1)/3
34 if (vm1_neg)
36 else
39
40 // vm1=(v1-vm1)/2
41 if (vm1_neg)
43 else
45
46 // v1=v1-v0
47 v1[2 * n] -= lmmp_sub_n_(v1, v1, v0, 2 * n);
48
49 // v2=(v2-v1)/2
51
52 // v1=v1-vm1
54
55 // add vm1 at correct place.
56 cy = lmmp_add_n_(r1, r1, vm1, dnp);
57 lmmp_inc_1(r3 + 1, cy); // at most propagate to v1[2*n]
58
59 saved = v1[2 * n]; // it is vinf[0]
60 vinf[0] = vinf0; // correct value of vinf
61
62 // v2=v2-vinf*2
63 cy = lmmp_shl_(vm1, vinf, spt, 1);
64 cy += lmmp_sub_n_(v2, v2, vm1, spt);
65 lmmp_dec_1(v2 + spt, cy);
66
67 // vinf+=v2h, no overflow
68 cy = lmmp_add_n_(vinf, vinf, v2 + n, n + 1);
69 lmmp_inc_1(r3 + dnp, cy);
70
71 // v1-=vinf, (same time vmh-=v2h)
72 cy = lmmp_sub_n_(v1, v1, vinf, spt);
73 vinf0 = vinf[0];
74 v1[2 * n] = saved; // correct value of v1
75 lmmp_dec_1(v1 + spt, cy);
76
77 // vml-=v2l
78 cy = lmmp_sub_n_(r1, r1, v2, n);
80
81 // last v2l
82 cy = lmmp_add_n_(r3, r3, v2, n);
83 v1[2 * n] += cy; // no carry
85}
static void lmmp_divexact_by3_(mp_ptr dst, mp_srcptr numa, mp_size_t na)
精确除以3([dst,na] = [numa,na] / 3)
Definition divexact.h:30
mp_limb_t * mp_ptr
Definition lmmp.h:80
uint64_t mp_size_t
Definition lmmp.h:77
uint64_t mp_limb_t
Definition lmmp.h:76
mp_limb_t lmmp_shr1add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
加法后右移1位 [dst,n] = ([numa,n] + [numb,n]) >> 1
Definition shr.c:62
mp_limb_t lmmp_shl_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shl)
大数左移操作 [dst,na] = [numa,na]<<shl,dst的低shl位填充0
Definition shl.c:19
#define lmmp_dec_1(p, dec)
大数减指定值宏(预期无借位)
Definition lmmpn.h:977
mp_limb_t lmmp_sub_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
无借位的n位减法 [dst,n] = [numa,n] - [numb,n]
Definition sub_n.c:80
mp_limb_t lmmp_shr1sub_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
减法后右移1位 [dst,n] = ([numa,n] - [numb,n]) >> 1
Definition shr.c:116
#define lmmp_inc_1(p, inc)
大数加指定值宏(预期无进位)
Definition lmmpn.h:950
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:81
#define vm1
#define v2
#define n
#define v0
void lmmp_toom_interp5_(mp_ptr dst, mp_ptr v2, mp_ptr vm1, mp_size_t n, mp_size_t spt, int vm1_neg, mp_limb_t vinf0)
Copyright (C) 2026 HJimmyK(Jericho Knox)
#define r1
#define vinf
#define v1
#define r3