mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 20:03:34 -03:00
test: EC: optimize scalar multiplication of G by using lookup table
On my machine, this speeds up the functional test feature_taproot.py by a factor of >1.66x (runtime decrease from 1m16.587s to 45.334s). Co-authored-by: Pieter Wuille <pieter@wuille.net>
This commit is contained in:
parent
1830dd8820
commit
d4fb58ae8a
1 changed files with 32 additions and 0 deletions
|
@ -226,6 +226,8 @@ class GE:
|
||||||
|
|
||||||
def __rmul__(self, a):
|
def __rmul__(self, a):
|
||||||
"""Multiply an integer with a group element."""
|
"""Multiply an integer with a group element."""
|
||||||
|
if self == G:
|
||||||
|
return FAST_G.mul(a)
|
||||||
return GE.mul((a, self))
|
return GE.mul((a, self))
|
||||||
|
|
||||||
def __neg__(self):
|
def __neg__(self):
|
||||||
|
@ -312,3 +314,33 @@ class GE:
|
||||||
|
|
||||||
# The secp256k1 generator point
|
# The secp256k1 generator point
|
||||||
G = GE.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
|
G = GE.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
|
||||||
|
|
||||||
|
|
||||||
|
class FastGEMul:
|
||||||
|
"""Table for fast multiplication with a constant group element.
|
||||||
|
|
||||||
|
Speed up scalar multiplication with a fixed point P by using a precomputed lookup table with
|
||||||
|
its powers of 2:
|
||||||
|
|
||||||
|
table = [P, 2*P, 4*P, (2^3)*P, (2^4)*P, ..., (2^255)*P]
|
||||||
|
|
||||||
|
During multiplication, the points corresponding to each bit set in the scalar are added up,
|
||||||
|
i.e. on average ~128 point additions take place.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, p):
|
||||||
|
self.table = [p] # table[i] = (2^i) * p
|
||||||
|
for _ in range(255):
|
||||||
|
p = p + p
|
||||||
|
self.table.append(p)
|
||||||
|
|
||||||
|
def mul(self, a):
|
||||||
|
result = GE()
|
||||||
|
a = a % GE.ORDER
|
||||||
|
for bit in range(a.bit_length()):
|
||||||
|
if a & (1 << bit):
|
||||||
|
result += self.table[bit]
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Precomputed table with multiples of G for fast multiplication
|
||||||
|
FAST_G = FastGEMul(G)
|
||||||
|
|
Loading…
Reference in a new issue