Example #1
0
 def getNextRational(element, fareyList, d, k):
     n = element * fareyList[-1].num + fareyList[-2].num
     m = element * fareyList[-1].den + fareyList[-2].den
     return rational(n, m, d, k)
Example #2
0
def plotLine(CF,axisoffset=0., d = 0.15,k = 2., 
    cmap = matplotlib.cm.ScalarMappable(cmap=cmaps.viridis), axisLog = False):

    def getNextRational(element, fareyList, d, k):
        n = element * fareyList[-1].num + fareyList[-2].num
        m = element * fareyList[-1].den + fareyList[-2].den
        return rational(n, m, d, k)
        
        
    CF = [float(c) for c in CF]
    farey = [rational(1,0,d,k), rational(0,1,d,k)] # initiate
    if (CF[-1] != 1.0):
        CF[-1] = float(CF[-1])-1
        CF.append(1.)

    neighbors = []
    for i in range(len(CF)):
        a = getNextRational(int(CF[i]),farey,d,k)
        farey.append(a)

    farey = farey[1:]
#    for i in range(len(farey)-1):
#        level = 0
#        while True:
#            fareySequence = fareySequences[level]
#            fareyNum = [x[0] for x in fareySequence]
#            fareyDen = [x[1] for x in fareySequence]
#            ind = []
#            for f in [farey[i],farey[i+1]]:
#                indNum = np.where(np.asarray(fareyNum) == f.num)[0]
#                indDen = np.where(np.asarray(fareyDen) == f.den)[0]
#                if (len(list(np.intersect1d(indNum, indDen))) == 0):
#                    level += 1
#                    continue
#                else:
#                    ind.append(list(np.intersect1d(indNum, indDen))[0])
#            if len(ind) == 2:
#                neighboring = True if abs(ind[0]-ind[1]) == 1 else False
#                neighbors.append(neighboring)
#                break
    plt.plot([d-axisoffset,-d-axisoffset],
            [farey[0].den]*2, color = cmap.to_rgba(1), linewidth=4)
    for j in range(len(farey)-1):
        changed = False
        if CF[0] > 1:
            CF[0] -= 1
            changed = True
        maxBound = max(CF[:j]) if j > 0 else 1
        if changed:
            CF[0] += 1
        color = cmap.to_rgba(maxBound) # if cmap.norm == None else cmap(maxBound/10)
        # plot line only if partners are Farey neighbors
        # if neighbors[j]:
        plt.plot([i.val-axisoffset for i in farey[j:j+2]],
                [i.den for i in farey[j:j+2]],color=color,linewidth=1)
        (diophantineMin, diophantineMax) = farey[j+1].diophantine
        plt.plot([diophantineMin-axisoffset,diophantineMax-axisoffset],
                [farey[j+1].den]*2,
                color = color, linewidth=4)
    
    # print(CF, farey, neighbors)
    # print(Brjuno(farey,1), Brjuno(farey,2), Brjuno(farey,3))
    
    return farey