/
dbl.go
44 lines (32 loc) · 927 Bytes
/
dbl.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// mod256: Arithmetic modulo 193-256 bit moduli
// Copyright 2021-2022 Dag Arne Osvik
// SPDX-License-Identifier: BSD-3-Clause
package mod256
import (
. "math/bits"
)
// Double computes the double of a residue.
func (z *Residue) Double() *Residue {
t0, c := Add64(z.r[0], z.r[0], 0)
t1, c := Add64(z.r[1], z.r[1], c)
t2, c := Add64(z.r[2], z.r[2], c)
t3, c := Add64(z.r[3], z.r[3], c)
u0, b := Sub64(t0, z.m.mmu1[0], 0)
u1, b := Sub64(t1, z.m.mmu1[1], b)
u2, b := Sub64(t2, z.m.mmu1[2], b)
u3, _ := Sub64(t3, z.m.mmu1[3], b)
v0, b := Sub64(t0, z.m.mmu0[0], 0)
v1, b := Sub64(t1, z.m.mmu0[1], b)
v2, b := Sub64(t2, z.m.mmu0[2], b)
v3, b := Sub64(t3, z.m.mmu0[3], b)
// Subtract the larger multiple of m if necessary
if b == 0 {
v3, v2, v1, v0 = u3, u2, u1, u0
}
// Subtract if overflow
if c != 0 {
t3, t2, t1, t0 = v3, v2, v1, v0
}
z.r[3], z.r[2], z.r[1], z.r[0] = t3, t2, t1, t0
return z
}