Via this post, I found out about Russian Peasant Multiplication, a rather clever method of multiplication that only requires, doubling, halving and adding. So I wrote some code to display it:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
results=[]
indicator=' '
left=int(sys.argv[1])
right=int(sys.argv[2])
while right >= 1:
   indicator='X'
   if right % 2:
       indicator=' '             # right number is odd,
       results.append(left)      # so add left number to results
   print (" %s %16d \t %16d %s") % (indicator, left, right, indicator)
   left *= 2
   right /= 2
print("%s × %s = %s = %d")%(sys.argv[1], sys.argv[2],
                           ' + '.join(map(str,results)), sum(results))
So to multiply 571 × 293:
$ ./rpmult.py 571 293                571                 293   X            1142                 146 X               2284                  73   X            4568                  36 X  X            9136                  18 X              18272                   9   X           36544                   4 X  X           73088                   2 X             146176                   1  571 × 293 = 571 + 2284 + 18272 + 146176 = 167303
Python’s still got some weirdness compared to Perl; where I’d join the list of sum terms in Perl with join(' + ', @results), in Python you have to convert the integer values to strings, then call the join method of the separator string: ' + '.join(map(str,results)). Still, I’ll give Python props for having a built-in list sum() function, which Perl lacks.
Leave a Reply