commit 69057ac2daef283f52f2f7f00559efe06543fabb
parent cdec7e6b1b3d89ee484103b9dbc07dcd25f8b0af
Author: Jared Tobin <jared@jtobin.io>
Date: Fri, 24 Jan 2025 15:02:11 +0400
lib: only need 256 bits for these
Diffstat:
2 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/lib/Data/Word/Extended.hs b/lib/Data/Word/Extended.hs
@@ -366,7 +366,7 @@ sub_mul_to x x_offset y m = do
sub_mul
:: Word576 -- dividend
-> Int -- min dividend index
- -> Word576 -- divisor
+ -> Word256 -- divisor
-> Int -- max divisor index
-> Word64 -- multiplier
-> Word640 -- result, borrow
@@ -375,7 +375,7 @@ sub_mul u u_start d d_len m = loop 0 u 0 where
| j == d_len = Word640 acc borrow
| otherwise =
let !u_j = sel576 u (u_start + j)
- !d_j = sel576 d j
+ !d_j = sel256 d j
!(P s carry1) = sub_b u_j borrow 0
!(P ph pl) = mul_c d_j m
!(P t carry2) = sub_b s pl 0
@@ -405,7 +405,7 @@ add_to x x_offset y = do
add_big
:: Word576
-> Int
- -> Word576
+ -> Word256
-> Int
-> Word640
add_big u u_start d d_len = loop 0 u 0 where
@@ -413,7 +413,7 @@ add_big u u_start d d_len = loop 0 u 0 where
| j == d_len = Word640 acc car
| otherwise =
let !u_j = sel576 acc (u_start + j)
- !d_j = sel576 d j
+ !d_j = sel256 d j
!(P w64 ncar) = add_c u_j d_j car
!nacc = set576 acc (u_start + j) w64
in loop (succ j) nacc ncar
@@ -524,12 +524,12 @@ quotrem_by1_gen u ulen d =
quotrem_knuth_gen
:: Word576
-> Int
- -> Word576
+ -> Word256
-> Int
-> Word1152
quotrem_knuth_gen u ulen d dlen = loop (ulen - dlen - 1) zero576 u where
- !d_hi = sel576 d (dlen - 1)
- !d_lo = sel576 d (dlen - 2)
+ !d_hi = sel256 d (dlen - 1)
+ !d_lo = sel256 d (dlen - 2)
!rec = recip_2by1 d_hi
loop j !qacc !uacc
| j < 0 = Word1152 qacc uacc
@@ -619,10 +619,7 @@ quotrem_gen u@(Word576 u0 u1 u2 u3 u4 u5 u6 u7 u8) d@(Word256 d0 d1 d2 d3) =
!(Word640 q r) = quotrem_by1_gen un (ulen + 1) dn_0
in Word832 q (Word256 (r .>>. shift) 0 0 0)
else
- let !(Word256 z0 z1 z2 z3) = dn
- !dn_576 = Word576 z0 z1 z2 z3 0 0 0 0 0
- !(Word1152 q un0) =
- quotrem_knuth_gen un (ulen + 1) dn_576 dlen
+ let !(Word1152 q un0) = quotrem_knuth_gen un (ulen + 1) dn dlen
!r_pre = fill_rem dlen un0 shift
!un_dlen_1 = sel576 un0 (dlen - 1)
!r = set256 r_pre (dlen - 1) (un_dlen_1 .>>.shift)
diff --git a/test/Main.hs b/test/Main.hs
@@ -253,12 +253,11 @@ quotrem_knuth_gen_case0 = do
16799544643779908154
1
0 0 0 0
- !d = Word576
+ !d = Word256
16950798510782491100
2612788699139816405
5146719872810836952
14966148379609982000
- 0 0 0 0 0
!(Word1152 q nu) = quotrem_knuth_gen u 5 d 4
!pec_q = Word576 2 0 0 0 0 0 0 0 0
!pec_u = Word576