def perm(cands):
    size = len(cands)
    if size <= 1:
                 return [cands]
    return [p[:i]+[cands[0]]+p[i:] for i in xrange(size) for p in perm(cands[1:])]

def factorial(k):
    return reduce(lambda i,j : i*j, range(1,k+1))

def choose(n1,n2):
    return float(factorial(n1))/(factorial(n2)*factorial(n1-n2))

def comb_w_rep(n1,n2):
    return choose((n1+n2-1), n1)

def all_combs(num,cur):
#returns all possible lists with in each pos 0-num-1
    list = []
    if cur == 1:
        for i in range(0,num):
            list.append([i])
        return list
    if cur > 1:
        smlist = all_combs(num,cur-1)
        for i in range(0,num):
            for j in smlist:
                list.append([i]+j)
        return list

def order_combs(combs):
    summed = []
    for com in combs:
        sum = 0
        for num in com:
            sum += num
        summed.append((sum,com))
    summed.sort()
    ret = []
    for (s,l) in summed:
        ret.append(l)
    return ret

def sigma(avg,vals):
    sig = 0.0
    for v in vals:
        sig += pow(v-avg,2)
    sig = sig/len(vals)
    sig = pow(sig,0.5)
    return sig



