I want to implement Karatsuba’s 2-split multiplication in Python. However, writing numbers in the form
A=c*x+d
where x is a power of the base (let x=b^m) close to sqrt(A).
How am I supposed to find x, if I can’t even use division and multiplication? Should I count the number of digits and shift A to the left by half the number of digits?
Thanks.
Almost. You don’t shift A by half the number of digits; you shift 1. Of course, this is only efficient if the base is a power of 2, since “shifting” in base 10 (for example) has to be done with multiplications. (Edit: well, ok, you can multiply with shifts and additions. But it’s ever so much simpler with a power of 2.)
If you’re using Python 3.1 or greater, counting the bits is easy, because 3.1 introduced the
int.bit_length()method. For other versions of Python, you can count the bits by copying A and shifting it right until it’s 0. This can be done in O(log N) time (N = # of digits) with a sort of binary search method – shift by many bits, if it’s 0 then that was too many, etc.