Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 62
Kernel: SageMath (stable)

Golden Mean Rotation

Defining the map

The following defines the golden mean as an algebraic real number:

phi = AA((1+sqrt(5))/2)

Rotation by ϕ\phi mod 11:

def R(x): xx = x+phi return xx - floor(xx)

The graph of RR:

plot(R,(x,0,1))
Image in a Jupyter notebook

The map RR modified to act intervals (pairs of points) as well as numbers.

def R(x): try: x = AA(x) # Attempt to convert to an algebraic real. xx = x+phi return xx - floor(xx) except TypeError: # Conversion failed. Assume we have an interval. a,b = x # We will normalize so that the right endpoint takes values in (0,1] Rb = R(b) if Rb==0: Rb=1 return [R(a),Rb]

Demonstration of the new RR:

R(0)
0.618033988749895?
R([0,1-phi])
[0.618033988749895?, 1]

Drawing pictures of the intervals

def draw_interval(I, y, **options): # Draw the interval subset of [0,1] on the horizontal line at height y. a,b = I # Get the endpoints plt = Graphics() if b<a: # The interval wraps around the circle. plt +=line2d([(a,y),(1,y)],**options)+line2d([(0,y),(b,y)],**options) else: plt += line2d([(a,y),(b,y)],**options) # Now draw the endpoints plt += point2d([(a,y),(b,y)], color="black", zorder=10, size=20) return plt
draw_interval([0,1],0,color="green", thickness="1", axes=False) + \ draw_interval([1/4,1/2],0,color="blue", thickness="3") +\ draw_interval([3/4,1/8],0,color="red", thickness="3")
Image in a Jupyter notebook
A0=[0,1-1/phi] A0
[0, 0.3819660112501051?]
B0=[1-1/phi,1] B0
[0.3819660112501051?, 1]

In the following picture, we can see the action of RR. Intervals are translated.

draw_interval( A0, 0, color="red", thickness="3", axes=False, aspect_ratio=1) +\ draw_interval( B0, 0, color="blue", thickness="3") +\ draw_interval( R(A0), 0.2, color="red", thickness="3") +\ draw_interval( R(B0), 0.2, color="blue", thickness="3")
Image in a Jupyter notebook

The renormalization

The map ψ:[1ϕ1,1][0,1]\psi:[1-\phi^{-1},1] \to [0,1] is defined by ψ(x)=ϕ(1x)\psi(x)=\phi*(1-x).

def psi(x): try: x = AA(x) # Attempt to convert to an algebraic real. xx = phi*(1-x) if xx==1: xx = 0 return xx except TypeError: # Conversion failed. Assume we have an interval. a,b = x # Note that the map reverses orientation. left_endpoint = psi(b) right_endpoint = psi(a) if right_endpoint == 0: right_endpoint = AA(1) return [left_endpoint, right_endpoint]

Checking:

psi(1)
0
psi(1-phi^(-1))
0
psi([1-phi^(-1),1])
[0, 1]

Compute ψ1\psi^{-1}.

def psi_inv(x): try: x = AA(x) # Attempt to convert to an algebraic real. xx = 1-(x/phi) if xx==1: xx = 0 return xx except TypeError: # Conversion failed. Assume we have an interval. a,b = x # Note that the map reverses orientation. left_endpoint = psi_inv(b) right_endpoint = psi_inv(a) if right_endpoint == 0: right_endpoint = AA(1) return [left_endpoint, right_endpoint]
A1 = psi_inv(A0) A1
[0.763932022500211?, 1]
B1 = psi_inv(B0) B1
[0.3819660112501051?, 0.763932022500211?]
draw_interval( A0, 0, color="red", thickness="3", axes=False, aspect_ratio=1) +\ draw_interval( B0, 0, color="blue", thickness="3") +\ draw_interval( A1, 0.2, color="red", thickness="3") +\ draw_interval( B1, 0.2, color="blue", thickness="3")
Image in a Jupyter notebook

The following depicts the orbit of A1 and B1 up to the first return.

draw_interval( A0, 0, color="red", thickness="3", axes=False, aspect_ratio=1) +\ draw_interval( B0, 0, color="blue", thickness="3") +\ draw_interval( A1, 0.1, color="red", thickness="3") +\ draw_interval( B1, 0.1, color="blue", thickness="3") +\ draw_interval( A1, 0.2, color="red", thickness="3") +\ draw_interval( B1, 0.2, color="blue", thickness="3") +\ draw_interval( R(B1), 0.2, color="blue", thickness="3") +\ draw_interval( R(A1), 0.3, color="red", thickness="3") +\ draw_interval( R(R(B1)), 0.3, color="blue", thickness="3")
Image in a Jupyter notebook

Check the renormalization. The following two lines show it works on A1 up to some considerations about the endpoint (which results in the stray dot in the figure above).

# A1 returns immediately to the interval print( R(psi(A1))==psi(R(A1)) ) R(psi(A1))
True
[0.618033988749895?, 1]
# B1 returns in two steps. print( R(psi(B1)) == psi(R(R(B1))) ) R(psi(B1))
True
[0, 0.618033988749895?]

Observe that A0=R(B1)A_0 = R(B_1) and B0=A1B1B_0=A_1 \cup B_1. Therefore if the measure is RR-invariant we can deduce the measures of A0A_0 and B0B_0 from those of A1A_1 and B1B_1. The relationship is governed by the following matrix.

M = matrix([\ [0, 1], \ [1, 1]]) show(M)

For example if the measures of A1A_1 and B1B_1 were a1a_1 and b1b_1 respectively then the measures of A0A_0 and B0B_0 would be given by the following vector:

a1=var("a1") b1=var("b1") M*vector([a1,b1])
(b1, a1 + b1)

Repeating the renormalization.

A_list = [A0,A1] B_list = [B0,B1]

Augment the list by repeating the renormalization kk times.

k=6 for i in xrange(k): A_list.append( psi_inv(A_list[-1]) ) # A_list[-1] returns the last element. B_list.append( psi_inv(B_list[-1]) )
plt = Graphics() for i in xrange(len(A_list)): IA = A_list[i] IB = B_list[i] v = M^i*vector([1,1]) # The first entry of v tells us how many images of IA to draw. for j in xrange(v[0]): # We will draw the first one thicker. if j==0: plt += draw_interval( IA, i/10, color="red", thickness="6", axes=False, aspect_ratio=1) else: plt += draw_interval( IA, i/10, color="red", thickness="3", axes=False, aspect_ratio=1) IA = R(IA) for j in xrange(v[1]): if j==0: plt += draw_interval( IB, i/10, color="blue", thickness="6", axes=False, aspect_ratio=1) else: plt += draw_interval( IB, i/10, color="blue", thickness="3", axes=False, aspect_ratio=1) IB = R(IB) plt
Image in a Jupyter notebook

Understanding the above picture plus the use of Caratheodory's Extension Theorem implies that the rotation RR is uniquely ergodic, i.e., there is only one RR-invariant probability measure (namely Lebesgue measure on the circle).