Even though the basic fast fourier transform method only supports power of two sizes, multiplication remains the same when zero padding so there is no problem with that. Using a Fast Fourier Transform seems like a simple way to multiply. It takes O((log(N)+log(M))*log(log(N)+log(M))), which is faster than the O(log(N)*log(M)) of digit carry and bitshift, however, rounding errors make this unusable. The final digits are not integer. To properly multiply with FFT (THIS PROJECT DOES NOT DO THAT) you need much more complex methods (such as Schönhage/Strassen algorithm), and the constant factors in them are enormous enough that it only becomes better than digit carry or bitshift for millions of digits.