#Answer to question 1(b):
import os, sys, time
ida = os.fork()
idb = os.fork()
if (idb == 0):
    sys.exit(1)# this creates 2 zombies
else:
    time.sleep(15)
if (ida == 0):
    time.sleep(15)# this is the orphan
else:
    sys.exit(1)
#############################
#Answer to question 4(b):
def matProd(A,B):
    dim=range(len(A))
    C=[]
    for i in dim:
        C=C+[[]]
        for j in dim:
            C[i]=C[i]+[]
    for i in dim:
        for k in dim:
            sum=0
            for j in dim:
                sum = sum + A[i][j]*B[j][k]
            C[i]=C[i]+[sum]
    return C

def matPower(M,p):
    res=[[1,0],[0,1]]
    for j in range(p):
        res=matProd(res,M)
    return res
##############################
#Answer to question 4(a):
def memoize(f):
    memo = {}
    def helper(x):
        if x not in memo:            
            memo[x] = f(x)
        return memo[x]
    return helper

@memoize 
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
