## Solution:

In case it is a function, it requires to return something. Else, running it is kind of useless.

So you possibly require to say:

```
def multiply(a, b):
return a * b
```

You possibly want to read more about functions in Python and at the time this would make sense (passing by reference, for example). This can be a good starting point: Python functions.

There is no return value, the code will be OK

```
def multiply(a, b):
return a * b
```

### For example 111 x 101 gives:

```
111
x101
------
111
000
111
-----
11011
=====
```

We can illustrate 101 as x2+1x2+1 and 110 as x2+xx2+x

In next move we multiple them together to give:

(x2+1)×(x2+x)(x2+1)×(x2+x)

(x4+x3+x2+x)(x4+x3+x2+x)

which can be illustrated as 11110

For example in case we exercise the example on Page 6 [here] of 84 x 13 (and where ** represents "to the power of")

```
84x13 = ((2**6+ 2**4+ 2**2)x(2**3+ 2**2+ 2**0)) (mod 2)
= (2**9+ 2**8+ 2**7+2**1+ 2**6+ 2**5+ 2**1 + 2**4+ 2**2) (mod 2)
= (2**9+ 2**8+ 2**7+ 2**5+ 2**2) (mod 2)
which is 1110100100 [Calc]
```

The performing out in its proper form is:

```
84x13 = ((26+24+22)×(23+22+20))(mod2)
=(29+28+26+27+26+24+25+24+22)(mod2)
=(29+28+27+25+22)(mod2)
```

I have exercise a simple bit-shift operation and X-OR to implement the method:

```
import struct
import sys
val1=1
val2=1
if (len(sys.argv)>1):
val1=str(sys.argv[1])
if (len(sys.argv)>2):
val2=str(sys.argv[2])
def reverse(text):
lst = []
count = 1
for i in range(0,len(text)):
lst.append(text[len(text)-count])
count += 1
lst = ''.join(lst)
return lst
def showpoly(a):
str1 = ""
nobits = len(a)
for x in range (0,nobits-2):
if (a[x] == '1'):
if (len(str1)==0):
str1 +="x**"+str(nobits-x-1)
else:
str1 +="+x**"+str(nobits-x-1)
if (a[nobits-2] == '1'):
if (len(str1)==0):
str1 +="x"
else:
str1 +="+x"
if (a[nobits-1] == '1'):
str1 +="+1"
print str1;
def multiply(a,b):
bit1 = int(a,2)
bit2 = int(b,2)
g = []
nobits = len(b)
print a.rjust(len(a)+len(b)-1)
str = "x"+b;
print str.rjust(len(a)+len(b)-1)
print "-" * (len(a)+len(b)-1)
b=reverse(b)
for i in range (0,nobits):
if (b[i]=='0'):
g.append(0)
else:
g.append(int((bit1<<i)))
print bin(g[i])[2:].rjust(len(a)+len(b)-1)
res=int(g[0])
for i in range (1,nobits):
res = int(res) ^ int(g[i])
print "-" * (len(a)+len(b)-1)
print bin(res)[2:].zfill(len(a)+len(b)-1)
print "=" * (len(a)+len(b)-1)
return res
print "Binary form:\t",val1,"x",val2
print "Decimal form:\t",int(val1,2),"x",int(val2,2)
print ""
showpoly(val1)
showpoly(val2)
print "\nWorking out:\n"
res=multiply(val1,val2)
print "\nResult: ",res
```