Skip to content

Instantly share code, notes, and snippets.

@raeq
Created September 5, 2020 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raeq/ad1ef1fecc941c741ced8e26b8401c90 to your computer and use it in GitHub Desktop.
Save raeq/ad1ef1fecc941c741ced8e26b8401c90 to your computer and use it in GitHub Desktop.
Katasuba fast multiplication
def karatsuba_fast_multiply(multiplier: int, multiplicand: int) -> int:
"""
Karatsuba fast multiplication, published in 1962
https://en.wikipedia.org/wiki/Karatsuba_algorithm
Args:
x ():
y ():
Returns: int
>>> karatsuba_fast_multiply(2, 4)
8
>>> karatsuba_fast_multiply(135, 139)
18765
"""
if multiplier.bit_length() <= 1536 or multiplicand.bit_length() <= 1536:
return multiplier * multiplicand
else:
n = max(multiplier.bit_length(), multiplicand.bit_length())
half = (n + 32) // 64 * 32
mask = (1 << half) - 1
xlow = multiplier & mask
ylow = multiplicand & mask
xhigh = multiplier >> half
yhigh = multiplicand >> half
a = karatsuba_fast_multiply(xhigh, yhigh)
b = karatsuba_fast_multiply(xlow + xhigh, ylow + yhigh)
c = karatsuba_fast_multiply(xlow, ylow)
d = b - a - c
return (((a << half) + d) << half) + c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment