__author__ = 'Frédéric'

def translate(set, t):
    return [(x+t) % 12 for x in set]

def inverse(set):
    return [ -x % 12 for x in set]

def compare_rahn(set1, set2):
    l = len(set1)
    if l != len(set2):
        raise Exception("different length")
    if l == 0:
        return 0

    e1 = set1[0]
    e2 = set2[0]

    for i in range(l-1, 0, -1):
        if (set2[i]-e2)%12 > (set1[i]-e1):
            return 1
        elif (set2[i]-e2)%12 < (set1[i]-e1)%12:
            return -1
    return 0

def compare_forte(set1, set2):
    l = len(set1)
    if l != len(set2):
        raise Exception("different length")
    if l == 0:
        return 0

    e1 = set1[0]
    e2 = set2[0]

    if (set2[-1]-e2)%12 > (set1[-1]-e1)%12:
        return 1
    elif (set2[-1]-e2)%12 < (set1[-1]-e1)%12:
        return -1

    for i in range(1,l):
        if (set2[i]-e2)%12 > (set1[i]-e1)%12:
            return 1
        elif (set2[i]-e2)%12 < (set1[i]-e1)%12:
            return -1
    return 0

def rotate(set):
    set.append(set.pop(0))


def normal_form(set):
    set.sort()
    result = list(set)
    for x in range(len(set)-1):
        rotate(set)
        if compare_rahn(result, set) == -1:
            result = set
    return result

def prime_form_rahn(set):
    if set == []:
        return set
    set.sort()
    result = translate(set, -set[0])

    for x in range(len(set)):
        rotate(set)
        t = translate(set,-set[0])
        if compare_rahn(result, t) == -1:
            result = t
        i = inverse(t)
        i.sort()
        if compare_rahn(result, i) == -1:
            result = i
    return result

def prime_form_forte(set):
    if set == []:
        return set
    set.sort()
    result = translate(set, -set[0])
    for x in range(len(set)):
        rotate(set)
        t = translate(set, -set[0])
        if compare_forte(result, t) == -1:
            result = t
        i = inverse(t)
        i.sort()
        if compare_forte(result, i) == -1:
            result = i
    return result

def interval_vector (s):
    set2 = set(s)
    iv = [0,0,0,0,0,0]

    for i in range(12):
        if i in set2:
            for j in range(i):
                if j in set2:
                    ic = abs(i-j)
                    if ic>6:
                        ic = 12-ic
                    iv[ic - 1] += 1
    return iv

def interval_vector_repr (iv):
    return "<{}{}{}{}{}{}>".format(iv[0],iv[1],iv[2],iv[3],iv[4],iv[5])

for x in range(0,2**12):
    s = []
    for i in range(12):
        if x & (1<<i) :
            s.append(i)
    pf = prime_form_rahn(s)
    pff = prime_form_forte(s)

    if (s == pf):
        if (pff != pf):
            print("r=",pf,"f=",pff)
            