--- title: "Approximation adique des rotations" date: "05/01/2016" output: html_document --- ***(latest update : `r Sys.time()`)***
```{r setup, echo=FALSE} library(magrittr) library(contfrac) library(knitr) opts_chunk$set(collapse=TRUE, fig.path="./assets/fig/RotationAdic-") # trim figures knitr::knit_hooks$set(trim = function(before, options, envir) { if(!before) { fig <- knitr::fig_path(".png", num=1) # OK chunk avec un seul plot #command <- sprintf("convert %s -trim %s", fig, fig) #system(command) knitr::plot_crop(fig, quiet=TRUE) return(invisible()) } }) fscale <- 1 # scale for figures ``` ```{r Rfunctions, include=FALSE} # plot a rotation plot_rot <- function(theta, xlim=c(0, 1), ylim=c(0,1), ...){ curve((x+theta)%%1, from=0, to=1-theta-.Machine$double.eps, xaxs="i", yaxs="i", axes=FALSE, xlim=xlim, ylim=ylim, ...) curve((x+theta)%%1, from=1-theta, to=1, add=TRUE) return(invisible()) } # plot a tower tower2 <- function(nlevels=2, height=3, xclass=3/4, xclass_labels=NULL, x0=0, x1=x0+1, labels=NULL, epsilon=0.2, mar=c(1,1,1,1), cex.labels=1, add=FALSE, ...){ #if(!is.null(xclass)) xclass <- x1*xclass y <- seq(0, height, len=nlevels) if(!add){ par(mar=mar, xpd=TRUE) plot(0, 0, ylim=c(0,height+2*max(epsilon,0)), axes=FALSE, type="n", xlab=NA, ylab=NA, ...) } for(i in 1:nlevels){ segments(x0, y[i], x1, y[i]) } if(!is.null(xclass)){ for(x in xclass) points(rep(xclass, nlevels), y, pch=19) segments(xclass, 0, xclass, height, lty="dashed") if(!is.null(xclass_labels)){ for(i in 1:nlevels) text(xclass-(x1-x0)/20, y[i], xclass_labels[i], pos=3, cex=cex.labels) } } if(!is.null(labels)){ if(!is.list(labels)) labels <- list(labels[1:nlevels], labels[2:(nlevels+1)]) text(x0, y+epsilon, labels[[1]], cex=cex.labels) text(x1, y+epsilon, labels[[2]], cex=cex.labels) } return(invisible()) } # gauss function G <- function(x) 1/x-floor(1/x) F <- function(theta, n=1){ # the function theta -> theta' if(theta<1/2) out <- 1/(1+G(theta)) if(theta>1/2) out <- G(1-theta)/(1+G(1-theta)) a <- ifelse(theta<1/2, as_cf(1-out)[2], as_cf(out)[2]) if(n==1){ attr(out, "a") <- a return(out) }else{ out <- c(out, numeric(n-1)) a <- c(a, integer(n-1)) for(i in 1:(n-1)){ Next <- F(out[i], 1) out[i+1] <- Next a[i+1] <- attr(Next, "a") } # x <- F(out, n-1) # oout <- c(out, x) # attr(oout, "a") <- c(attr(out, "a"), attr(x, "a")) # return(oout) attr(out, "a") <- a return(out) } } # induced rotation induced <- function(x, theta){ # retourner aussi le range if(theta<0.5){ a <- floor(1/theta)-1 return(vapply(x, function(x){ if(x %% 1 < a*theta) return(NaN) if(x %% 1 < (1-theta)) return((x+theta) %% 1) else return((x + (a+1)*theta) %% 1) }, numeric(1))) }else{ a <- floor(1/(1-theta))-1 return(vapply(x, function(x){ if(x %% 1 > 1-a*(1-theta)) return(NaN) if(x %% 1 > (1-theta)) return((x+theta) %% 1) else return((x + (a+1)*theta) %% 1) }, numeric(1))) } } ``` ```{r Rfunctions_orbits, include=FALSE} # renormalization [0,1] -> [a,b] affine <- function(a, b){ forward <- function(x) a + (b-a)*x backward <- function(y) (y-a)/(b-a) return(list(f=forward, b=backward)) } H <- function(theta){ a <- ifelse(theta<1/2, (floor(1/theta)-1)*theta, 0) b <- ifelse(theta<1/2, 1, 1-(floor(1/(1-theta))-1)*(1-theta)) return(affine(a,b)) } # join points of orbit plot_orbit <- function(orb, r=1, ...){ orb <- sort(orb) orb <- c(orb, orb[1]) x <- r*cos(orb*2*pi); y <- r*sin(orb*2*pi) for(i in 1:(length(orb)-1)){ segments(x[i], y[i], x[i+1], y[i+1], ...) } return(invisible()) } Class <- function(x, theta){ if(theta < 1/2){ a <- floor(1/theta)-1 if(x>a*theta && x<1-theta) return(x) k <- cut(x, breaks=c(theta*c(0:a))) %>% as.integer k <- ifelse(is.na(k), 0, k) return(c(x+c((-k):(-k+a))*theta) %% 1) } if(theta > 1/2){ phi <- 1-theta a <- floor(1/phi)-1 if(x>phi && x<1-a*phi) return(x) k <- cut(x, breaks=c(1-phi*c(0:a))) %>% as.integer k <- ifelse(is.na(k), 0, a-k+1) return(c(x+c((-k):(-k+a))*theta) %% 1) } } #sapply(seq(0,1,len=100), function(x) length(Class(x,theta))) Repr <- function(x, theta){ if(theta < 1/2){ a <- floor(1/theta)-1 if(x>a*theta && x<1-theta) return(x) k <- cut(x, breaks=c(theta*c(0:a))) %>% as.integer k <- ifelse(is.na(k), 0, k) return((x-k*theta) %% 1) } if(theta > 1/2){ phi <- 1-theta a <- floor(1/phi)-1 if(x>phi && x<1-a*phi) return(x) k <- cut(x, breaks=c(1-phi*c(0:a))) %>% as.integer k <- ifelse(is.na(k), 0, a-k+1) return((x+(-k+a)*theta) %% 1) } } ``` Je vais tâcher ici d'expliquer la construction de "la" filtration adique associée à une rotation. En fait, c'est une suite décroissante de partitions mesurables qu'on construit, mais il est facile de voir qu'elle correspond à la filtration d'un processus de Markov. Dans un second temps, j'expliquerai comment on obtient le graphe de Bratteli associé à cette filtration. ## Construction de la filtration adique Résumons d'abord la construction présentée. On se donne une rotation $R_\theta$ d'angle irrationel $\theta$ sur $(0,1)$. À la première étape, on regroupe les points de $(0,1)$ en classes d'équivalence. Chaque classe contient un nombre fini de points, qui est donné par le premier chiffre dans le développement en fraction continue de $\theta$. Cette relation d'équivalence qui définit alors la première partition mesurable $\xi_1$ apparaît lorsqu'on considère une certaine transformation induite par $R_\theta$. Celle-ci agit sur l'espace des classes d'équivalence $(0,1)/\xi_1$. Or, cette transformation induite est conjuguée à une rotation par une simple transformation affine. On recommence alors le procédé, et on obtient une partition mesurable $\xi_2 \prec \xi_1$, et ainsi de suite. Le choix de la transformation induite à chaque étape ne paraîtra pas justifié, mais c'est une construction qui est connue plus généralement pour les [homéomorphismes du cercle](http://www.dam.brown.edu/people/menon/apma2210/circle.pdf). Il y a deux possibilités, selon que $\theta < \frac12$ ou $\theta > \frac12$. Par ailleurs, ces deux situations possibles s'alternent lors de la construction : si $\theta < \frac12$ à la première étape, alors la rotation à la deuxième étape est d'angle $\theta' > \frac12$ et ainsi de suite. ### 1ère étape, avec $\theta < \frac12$. Pour illustrer la construction dans le cas d'un angle $\theta < \frac12$, nous prenons $\theta \approx 0.2254$ donné par une fraction continue : $$ \theta = 0 + \cfrac{1}{4 + \cfrac{1}{ 2 + \cfrac{1}{ 3+ \cfrac{1}{\ddots}}}} $$ ```{r thetacontfrac, include=TRUE} (theta <- contfrac::CF(c(0,4,2,3,2,3,4,5,4,3,2,4), finite=TRUE)) ``` ```{r theta0, include=FALSE} theta0 <- theta b1 <- floor(1/theta)-1 ``` Nous notons $[a_1, a_2, \ldots]$ la suite des entiers du développement en fraction continue de $\theta$ (nous omettons $a_0=0$). La figure ci-dessous montre le graphe de la rotation $R_\theta$ : ```{r rot1, echo=FALSE, fig.width=fscale*4, fig.align='center', trim=TRUE} par(pty="s") plot_rot(theta, xlab=expression(x), ylab=expression(R[theta](x))) axis(1, cex.axis=0.8); axis(2, cex.axis=0.8) points(c(1-theta,0), c(0,theta), pch=19, col="blue", xpd=TRUE) text(1-theta, 0, expression(1-theta), xpd=TRUE, pos=1, cex=1.2, col="blue") text(0, theta, expression(theta), xpd=TRUE, pos=2, cex=1.2, col="blue") ``` Considérons l'entier $$ b = \max\{k\geq 0 \mid k\theta < 1-\theta\} \geq 1. $$ Il n'est pas difficile de voir que : * $b = \lfloor \frac{1}{\theta} \rfloor -1$ ; * $b = a_1-1$, d'où $b=3$ pour notre exemple ; * $b$ est le plus petit entier tel que les intervalles $J$, $R_\theta(J)$, $\ldots$, $R_\theta^{b+1}(J)$ recouvrent $(0,1)$, où $\boxed{J=(1-\theta,1)}$. ```{r b1} ( b <- floor(1/theta)-1 ) ``` On s'intéresse à la transformation induite par $R_\theta$ sur l'intervalle $$ B=(b\theta, 1)= J \cup R_\theta^{b+1}(J) = (b\theta, 1-\theta) \cup (1-\theta,1), $$ représenté en rouge sur cette figure: ```{r rot1_redB, echo=FALSE, fig.width=fscale*5, fig.align='center', trim=TRUE} plot_rot(theta, ylim=c(0, 0.35), asp=1, xlab=NA, ylab=NA) at <- c(c(0:b)*theta, 1-theta, (b+1)*theta, 1) labels <- labels0 <- c(expression(0, theta), if(b>1) sapply(2:b, function(k) parse(text=sprintf("%s*theta", k))) else NULL, expression(1-theta), parse(text=sprintf("%s*theta", b+1)), expression(1)) axis(1, at=at, labels=labels, pos=0) segments(b*theta, 0, 1, 0, col="red", lwd=2) axis(2, pos=0, at=c(0,0.2,0.4,0.6,0.8)) curve(x+ theta, add=TRUE, lty=2, xpd=TRUE, to=2*theta) ``` Rappelons que la transformation $T_B$ induite par une transformation $T$ sur un ensemble $B$ est définie par $T_B(x) = T^k(x)$ où $k=k(x)$ est le premier entier $\geq 1$ tel que $T^k(x) \in B$. Ici elle est donnée par $$ T_B(x) = \begin{cases} T(x) & \text{si } x \in (b\theta, 1-\theta) \\ T^{b+1}(x) & \text{si } x \in J=(1-\theta, 1) \end{cases}, $$ ce que l'on peut voir sur la figure suivante: ```{r tower1, echo=FALSE, fig.width=fscale*2.5, fig.height=fscale*3.3, fig.align='center', trim=TRUE} theta <- theta0 x <- x0 <- 1-theta/4 labels <- labels0 a <- floor(1/theta)-1 cexlabs <- 1.3 xclass_labels <- c(expression(x, Tx), if(a>1) sapply(2:a, function(k) parse(text=sprintf("T^%s*x", k))) else NULL) tower2(nlevels=a+1, height=3, xclass=x, xclass_labels=xclass_labels, x0=1-theta, x1=1, labels=list(c(expression(1-theta), labels[1:a]), c(expression(1), labels[2:(a+1)])), epsilon=-0.23, cex.labels=cexlabs, xlim=c(a*theta, 1), mar=c(3,1,2,1), yaxs="i") tower2(nlevels=1, height=1, xclass=NULL, x0=a*theta, x1=1-theta, labels=NULL, epsilon=0.2, add=TRUE) axis(1, labels=c(substitute(a*theta, list(a=a)), expression(NULL, NULL)), at=c(a*theta, 1-theta, 1), lwd=1, padj=-0.3, cex.axis=cexlabs, tck=-0.03) points((x+(a+1)*theta) %% 1, 0, pch=19, col="red") text((x+(a+1)*theta) %% 1 - (1-a*theta)/20, 0, parse(text=sprintf("T^%s*x", a+1)), pos=3, col="red", cex=cexlabs) ``` Cette image est appelée un *découpage-empilage*. L'intervalle du bas, $B$, est appelé sa *base*. Ce découpage-empilage a deux *tours* : celle de gauche n'a qu'un seul étage, celle de droite en a quatre. La transformation induite préserve la restriction à $B$ de la mesure préservée par $T$ (ceci est une généralité sur les transformations induites). Il est facile de voir que le graphe de cette transformation est celui d'une rotation: ```{r inducedrotation, echo=FALSE, fig.width=fscale*3, fig.align='center', trim=TRUE} a <- floor(1/theta)-1 par(pty="s") cexlabs <- 1.1 curve(induced(x, theta), from=a*theta, to=1-theta-.Machine$double.eps, xlim=c(a*theta, 1), ylim=c(a*theta, 1), xaxs="i", yaxs="i", axes=FALSE, xlab=NA, ylab=NA) curve(induced(x, theta), from=1-theta, to=1, add=TRUE) axis(1, labels=expression(b*theta, 1-theta, 1), at=c(a*theta, 1-theta, 1), lwd=1, padj=-0.3, cex.axis=cexlabs) axis(2, labels=expression(b*theta, 1-theta, 1), at=c(a*theta, 1-theta, 1), lwd=1, padj=0.5, cex.axis=cexlabs) axis(3, labels=expression(0, 1-theta*"'", 1), at=c(a*theta, 1-theta, 1), lwd=1, padj=0.5, cex.axis=cexlabs, col="forestgreen", col.axis="forestgreen") ``` Autrement dit, la transformation $T_B$ est une rotation, à ceci près qu'elle n'est pas définie sur $(0,1)$ mais sur $B=(b\theta, 1)$. On obtient une rotation sur $(0,1)$ en la conjuguant avec la transformation affine $g_1\colon B \to (0,1)$ qui envoie $b\theta$ sur $0$ et $1$ sur $1$. L'angle de cette rotation est $$ \theta'=\frac{\theta}{1-b\theta}=\frac{1}{1+G(\theta)} > \frac{1}{2} $$ où $G(x)=\frac{1}{x} - \lfloor \frac{1}{x} \rfloor$ est la fonction de Gauss. Notons que le développement en fraction continue de $1-\theta'$ est $[a'_1, a'_2, a'_3, \ldots] = [a_2+1, a_3, a_4, \ldots]$. C'est donc $[3, 3, 2, \ldots]$ pour notre exemple. ```{r theta1, include=FALSE} theta1 <- F(theta) %>% as.numeric ```
Renormalisation de la rotation Rθ
### La sous-tribu définie par la transformation induite Regardons à nouveau le découpage-empilage : ```{r tower1again, ref.label='tower1', echo=FALSE, fig.width=fscale*2.5, fig.height=fscale*3.3, fig.align='center', trim=TRUE} ``` Elle définit une partition mesurable $\xi_1$ de l'espace de Lebesgue $(0,1)$. La classe d'équivalence $\xi_1(x)$ d'un point $x \in (0,1)$ contient un élément ou quatre éléments, et on a un représentant dans la base $B=(b\theta, 1)$. Pour $x \in B$, $$ \xi_1(x) = \begin{cases} \{x\} & \text{si } x \in (b\theta, 1-\theta) \\ \{x, Tx, \ldots, T^{b}x\} & \text{si } x \in (1-\theta, 1) \end{cases}, $$ et l'espace quotient $(0,1)/\xi_1$ s'identifie à $B$. Notant $\xi_0$ la partition mesurable de $(0,1)$ en singletons, la paire de partitions mesurables $(\xi_0, \xi_1)$ s'identifie alors à la paire de tribus $({\cal F}_0, {\cal F}_1)$ définie par ${\cal F}_1=\sigma(U_1)$ et ${\cal F}_0=\sigma(U_1, U_0)$ où : * $U_1$ est une variable aléatoire uniforme sur l'espace $(0,1)$ représenté par le petit cercle sur la figure ci-dessous, et sa réalisation correspond à un point $g_1^{-1}(U_1) \in B$ ; * $U_0$ est une variable aléatoire uniforme sur l'espace $(0,1)$ représenté par le grand cercle sur la figure ci-dessous, et conditionnellement $U_1$, sa réalisation est uniforme sur la classe d'équivalence du point de $B$ correspondant à $U_1$. ```{r filtration1, fig.width=fscale*6, echo=FALSE, fig.align='center', trim=TRUE} theta <- theta0 fplot <- function(theta, x, cexlabs=1.3){ a <- floor(1/theta)-1 orb <- Class(x,theta) x1 <- Repr(x, theta) x2 <- H(theta)$b(x1) x2 <- (1-a*theta)*c(cos(x2*2*pi), sin(x2*2*pi)) x1 <- c(cos(x1*2*pi), sin(x1*2*pi)) par(mar=c(1,1,1,1)) curve(sqrt(1-x^2), from=-1, to=1, ylim=c(-1.01,1.01), asp=1, axes=FALSE, xlab=NA, ylab=NA) curve(-sqrt(1-x^2), from=-1, to=1, add=TRUE) arrows(x1[1], x1[2], x2[1], x2[2], lty=1, col="gray", code=1) points(cos(orb*2*pi), sin(orb*2*pi), col="blue", pch=19) plot_orbit(orb, lty="dashed", col="blue") # J(theta) seq(a*theta, 1, len=100) %>% {lines(cos(.*2*pi), sin(.*2*pi), col="red", lwd=3)} curve(sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) curve(-sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) points(x2[1], x2[2], col="green", pch=19) # points(1, 0, pch=19) text(1, 0, expression(0), pos=4, cex=cexlabs, xpd=TRUE) points(cos((1-theta)*2*pi), sin((1-theta)*2*pi), pch=19) text(cos((1-theta)*2*pi), sin((1-theta)*2*pi), expression(1-theta), pos=1, cex=cexlabs) points(cos(a*theta*2*pi), sin(a*theta*2*pi), pch=19) text(cos(a*theta*2*pi), sin(a*theta*2*pi), expression(b*theta), pos=2, cex=cexlabs) r <- 1-a*theta points(r*cos(2*pi*(1-theta0/r)), r*sin(2*pi*(1-theta0/r)), pch=19) text(r*cos(2*pi*(1-theta0/r)), r*sin(2*pi*(1-theta0/r)), expression(1-theta*"'"), pos=3, cex=cexlabs) return(invisible()) } layout(t(c(1,2))) x <- mean(c(3*theta,1-theta)) fplot(theta,x) x <- x0 <- 1-theta/4 # H(theta)$f(1-F(theta)+.001) # fplot(theta,x) ```
### 2ème étape, avec $\theta' > \frac12$ La rotation $R_{\theta'}$ conjuguée à la transformation induite sur la base de la tour, est appelée *renormalisation* de la rotation de départ $R_\theta$. Son graphe est représenté ci-dessous: ```{r rot2, echo=FALSE, fig.width=fscale*4, fig.align='center', trim=TRUE} theta <- theta1 par(pty="s") plot_rot(theta, xlab=expression(x), ylab=expression(R[theta*"'"](x))) axis(1, cex.axis=0.8); axis(2, cex.axis=0.8) points(c(1-theta,0), c(0,theta), pch=19, col="blue", xpd=TRUE) text(1-theta, 0, expression(1-theta*"'"), xpd=TRUE, pos=1, cex=1.2, col="blue") text(0, theta, expression(theta*"'"), xpd=TRUE, pos=2, cex=1.2, col="blue") ``` Notons $\phi=1-\theta'$ et définissons l'entier $b = \max\{k\geq 0 \mid 1-k\phi > 1-\theta'\} \geq 1$. Il est facile de voir que: * $b = \lfloor \frac{1}{\phi} \rfloor -1$ ; * $b = a'_1-1 = a_2$, d'où $b=2$ pour notre exemple ; * $b$ est le plus petit entier tel que les intervalles $J$, $R_{\theta'}(J)$, $\ldots$, $R_{\theta'}^{b+1}(J)$ recouvrent $(0,1)$, où $\boxed{J=(0, 1-\theta')}$. ```{r b2, include=FALSE} theta <- theta1 phi <- 1-theta b <- b2 <- floor(1/phi)-1 ``` On s'intéresse à la transformation induite par $R_{\theta'}$ sur l'intervalle $$ B=(0, 1-b\phi)= J \cup R_{\theta'}^{b+1}(J) = (0,\phi) \cup (\phi, 1-b\phi), $$ représenté en rouge sur cette figure: ```{r rot2_redB, echo=FALSE, fig.width=fscale*4, fig.align='center', trim=TRUE} plot_rot(theta, ylim=c(0, 0.4), asp=1, xlab=NA, ylab=NA) phi <- 1-theta a <- floor(1/(1-theta))-1 at <- c(0, 1-(a+1)*phi, 1-theta, 1-c(a:2)*phi, theta, 1) labels <- labels1 <- c(expression(0), parse(text=sprintf("1-%s*phi", a+1)), expression(1-theta*"'"), if(a>1) sapply(a:2, function(k) parse(text=sprintf("1-%s*phi", k))) else NULL, expression(1-phi,1)) axis(1, at=at, labels=labels, pos=0, las=3) segments(0, 0, 1-a*phi, 0, col="red", lwd=3) axis(2, pos=0, at=c(0,0.2,0.4, 0.6, 0.8)) curve(x+ theta, add=TRUE, lty=2, xpd=TRUE, to=phi/2) #abline(h=theta1) ``` La transformation induite sur $B$ est donnée par $$ T_{B}(x) = \begin{cases} T^{b+1}(x) & \text{si } x \in (0, \phi) \\ T(x) & \text{si } x \in (\phi, 1-b\phi) \end{cases}, $$ ce que l'on peut voir sur la figure suivante: ```{r tower2, fig.width=fscale*3, fig.height=fscale*2.8, fig.align='center', echo=FALSE, trim=TRUE} theta <- theta1 a <- b2 cexlabs <- 1.1 tower2(nlevels=a+1, height=3, xclass=(1-theta)/4, x0=0, x1=1-theta, labels=list(c(expression(0), rev(labels)[2:(a+1)]), c(expression(phi, 1), if(a>1) rev(labels)[2:a] else NULL)), epsilon=0.19, cex.labels=cexlabs, xlim=c(0, 1-a*phi), mar=c(3,4,1,3), yaxs="i") tower2(nlevels=1, height=1, xclass=NULL, x0=1-theta, x1=1-a*phi, labels=NULL, epsilon=0.2, add=TRUE) #points(c(a*theta,1-theta,1), c(0,0,0), xpd=TRUE) #axis(1, labels=c("a theta", "1-theta", "1"), at=c(a*theta,1-theta,1), lwd=1) axis(1, labels= c(expression(NULL, NULL), substitute(1-a*phi, list(a=a))), at=c(0, 1-theta, 1-a*(1-theta)), lwd=1, padj=-0.3, cex.axis=cexlabs) ``` Cette transformation a le même graphe qu'une rotation: ```{r, echo=FALSE, fig.width=fscale*3.5, fig.align='center', trim=TRUE} theta <- theta1 a <- b2 par(pty="s") curve(induced(x, theta), from=0, to=1-theta-.Machine$double.eps, xlim=c(0, 1-a*(1-theta)), ylim=c(0, 1-a*(1-theta)), xaxs="i", yaxs="i", axes=FALSE, xlab=NA, ylab=NA) curve(induced(x, theta), from=1-theta+.Machine$double.eps, to=1-a*(1-theta), add=TRUE) axis(1, labels=expression(0, phi, 1-b*phi), at=c(0, 1-theta, 1-a*(1-theta)), lwd=1, padj=-0.2, cex.axis=1.3) axis(3, labels=expression(0, 1-theta*"''", 1), at=c(0, 1-theta, 1-a*(1-theta)), lwd=1, padj=0.2, cex.axis=1.3, col="forestgreen", col.axis="forestgreen") axis(2, labels=expression(0, phi, 1-b*phi), at=c(0, 1-theta, 1-a*(1-theta)), lwd=1, padj=-0.3, cex.axis=1.3) ``` Comme dans le cas précédent, on envoie $B$ sur $(0,1)$ avec l'application affine, et on obtient alors la rotation sur $(0,1)$ d'angle $$ \theta''=\frac{1-(b+1)\phi}{1-b\phi}=\frac{G(\phi)}{1+G(\phi)} < \frac{1}{2}, $$ où $G$ est la fonction de Gauss. Rappelons que le développement en fraction continue de $1-\theta'$ est $[a'_1, a'_2, a'_3, \ldots] = [a_2+1, a_3, a_4, \ldots]$. Celui de $\theta''$ est alors $[a'_2+1, a'_3, a'_4, \ldots] = [a_3+1, a_4, a_5, \ldots]$. ```{r contfractheta2, eval=FALSE, echo=FALSE} theta <- theta1 ( theta2 <- (1-(a+1)*(1-theta))/(1-a*(1-theta)) ) G(1-theta)/(1+G(1-theta)) contfrac::as_cf(theta2) contfrac::as_cf(1-theta) ```
***Remarque.*** *Notons $(p_n/q_n)$ la suite des convergents de $\theta$ et $\alpha_n = |q_n\theta-p_n|$. Alors $\alpha_1 = (1-\theta) - b_1\theta$, $\alpha_2 = |B_1| \times [(1-b_2\phi) - \phi]$, $\ldots$ (à chaque fois la longueur du petit segment multipliée par la longueur de la base précédente).* ```{r, eval=FALSE, echo=FALSE} cf <- as_cf(theta0, n = 12) # c(0,4,2,3,2,3,4,5,4,3,2,4) cvrgts <- convergents(cf) ( alpha <- abs(cvrgts$B*theta0-cvrgts$A)[-1] ) ( alpha1 <- (1-theta0) - 3*theta0 ) ( alpha2 <- (1-3*theta0)*(1-2*phi - phi) ) (0:5)*alpha1 # où est envoyé (a_1+1, a_2+1, ...). Sur 1 ? n <- 30 cf <- c(0, rep(2,n)) cf <- c(0, rep(2,10), rep(1,20)) CF(cf, finite = TRUE) < 0.5 cvrgts <- convergents(cf) alpha <- abs(cvrgts$B*CF(cf, finite=TRUE)-cvrgts$A)[-1] all(diff(alpha) < 0) #S ARRETER QUAND ALPHA N'EST PLUS DECROISSANT !!!!!!! if(any(diff(alpha)>0)) n <- which.min(diff(alpha)<=0) b <- integer(n) b[1] <- cf[2]-1 b[2:n] <- cf[3:(n+1)] sum((b+2)*alpha[1:n]) # OK POUR (2,2,2,2) b[seq(1,n,2)] <- 0 sum((b+2)*alpha[1:n]) ``` ### La sous-tribu pour $n=2$. Comme à la première étape, on a maintenant une partition mesurable $\xi'_2$ de l'espace $(0,1) \simeq (0,1)/\xi_1$. Il y a trois cas possibles, représentés sur la figure ci-dessous : * *Cas 1* : $\# \xi_1(x)=4$ et $\# \xi'_2\bigl(\xi_1(x)\bigr)=3$ * *Cas 2* : $\# \xi_1(x)=4$ et $\# \xi'_2\bigl(\xi_1(x)\bigr)=1$ * *Cas 3* : $\# \xi_1(x)=1$ et $\# \xi'_2\bigl(\xi_1(x)\bigr)=3$ ```{r threecases, fig.width=fscale*6, echo=FALSE, fig.align='center', trim=TRUE} theta <- theta0 a <- b1 # labs <- function(cexlabs=1.3){ points(1, 0, pch=19) text(1, 0, expression(0), pos=4, cex=cexlabs, xpd=TRUE) points(cos((1-theta)*2*pi), sin((1-theta)*2*pi), pch=19) text(cos((1-theta)*2*pi), sin((1-theta)*2*pi), expression(1-theta), pos=1, cex=cexlabs) points(cos(a*theta*2*pi), sin(a*theta*2*pi), pch=19) text(cos(a*theta*2*pi), sin(a*theta*2*pi), expression(b[1]*theta), pos=2, cex=cexlabs) r <- 1-a*theta points(r*cos(2*pi*(1-theta0/r)), r*sin(2*pi*(1-theta0/r)), pch=19) text(r*cos(2*pi*(1-theta0/r)), r*sin(2*pi*(1-theta0/r)), expression(1-theta*"'"), pos=3, cex=cexlabs) return(invisible()) } ## 1er cas x <- x0 #layout(t(matrix(1:4,ncol=2))) layout(t(matrix(1:3,ncol=1))) par(mar=c(0,.1,0,1)) curve(sqrt(1-x^2), from=-1, to=1, ylim=c(-1.01,1.01), asp=1, axes=FALSE, xlab=NA, ylab=NA) curve(-sqrt(1-x^2), from=-1, to=1, add=TRUE) orb <- Class(x,theta) points(cos(orb*2*pi), sin(orb*2*pi), col="blue", pch=19) plot_orbit(orb, lty="dashed", col="blue") # J(theta) seq(a*theta, 1, len=100) %>% {lines(cos(.*2*pi), sin(.*2*pi), col="red", lwd=3)} curve(sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) curve(-sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) x1 <- Repr(x, theta) # representative of x x2 <- H(theta)$b(x1) # image of x1 on the small circle orb <- Class(x2, F(theta)) x2 <- (1-a*theta)*c(cos(x2*2*pi), sin(x2*2*pi)) x1 <- c(cos(x1*2*pi), sin(x1*2*pi)) arrows(x1[1], x1[2], x2[1], x2[2], lty=1, col="gray") points(x2[1], x2[2], col="green", pch=19) ## points((1-a*theta)*cos(orb*2*pi), (1-a*theta)*sin(orb*2*pi), col="green", pch=19) plot_orbit(orb, r=(1-a*theta), lty=2, col="green") # labs() ## 2ème cas x <- H(theta)$f(1-F(theta)+.05) par(mar=c(0,.1,0,1)) curve(sqrt(1-x^2), from=-1, to=1, ylim=c(-1.01,1.01), asp=1, axes=FALSE, xlab=NA, ylab=NA) curve(-sqrt(1-x^2), from=-1, to=1, add=TRUE) orb <- Class(x,theta) points(cos(orb*2*pi), sin(orb*2*pi), col="blue", pch=19) plot_orbit(orb, lty="dashed", col="blue") # J(theta) seq(a*theta, 1, len=100) %>% {lines(cos(.*2*pi), sin(.*2*pi), col="red", lwd=3)} curve(sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) curve(-sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) x1 <- Repr(x, theta) x2 <- H(theta)$b(x1) orb <- Class(x2, F(theta)) x2 <- (1-a*theta)*c(cos(x2*2*pi), sin(x2*2*pi)) x1 <- c(cos(x1*2*pi), sin(x1*2*pi)) arrows(x1[1], x1[2], x2[1], x2[2], lty=1, col="gray") points(x2[1], x2[2], col="green", pch=19) ## points((1-a*theta)*cos(orb*2*pi), (1-a*theta)*sin(orb*2*pi), col="green", pch=19) # labs() ## 3ème cas x <- (a*theta+1-theta)/2 par(mar=c(0,.1,0,1)) curve(sqrt(1-x^2), from=-1, to=1, ylim=c(-1.01,1), asp=1, axes=FALSE, xlab=NA, ylab=NA) curve(-sqrt(1-x^2), from=-1, to=1, add=TRUE) orb <- Class(x,theta) points(cos(orb*2*pi), sin(orb*2*pi), col="blue", pch=19) # J(theta) seq(a*theta, 1, len=100) %>% {lines(cos(.*2*pi), sin(.*2*pi), col="red", lwd=3)} curve(sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) curve(-sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) x1 <- Repr(x, theta) x2 <- H(theta)$b(x1) orb <- Class(x2, F(theta)) x2 <- (1-a*theta)*c(cos(x2*2*pi), sin(x2*2*pi)) x1 <- c(cos(x1*2*pi), sin(x1*2*pi)) arrows(x1[1], x1[2], x2[1], x2[2], lty=1, col="gray") points(x2[1], x2[2], col="green", pch=19) ## points((1-a*theta)*cos(orb*2*pi), (1-a*theta)*sin(orb*2*pi), col="green", pch=19) plot_orbit(orb, r=(1-a*theta), lty=2, col="green") # labs() ``` *(à faire sur la figure: dessiner le $B$ du petit cercle)* La partition mesurable $\xi_2 \prec \xi_1$ apparaît alors comme suit. Sur la figure, le point $x$ est un des points bleus de sa classe-$\xi_1$. Son représentant dans l'arc rouge est envoyé sur le point vert $x' \simeq \xi_1(x)$ du petit cercle $(0,1) \simeq (0,1)/\xi_1$ par l'application affine $g_1$, ce qui est montré la flèche. Mais chaque autre point vert dans $\xi'_2(x')$ correspond lui aussi à un représentant-$\xi_1$ point sur l'arc rouge par $g_1^{-1}$, et ainsi à une classe-$\xi_1$ sur l'espace $(0,1)$ de départ (le grand cercle). La classe-$\xi_2$ de $x$ est alors la réunion de ces classes-$\xi_1$. Par exemple, dans le cas 1, on obtient ceci pour $\xi_2(x)$ (les $9$ points bleus) : ```{r case1more, echo=FALSE, fig.width=fscale*3.3, fig.align='center', trim=TRUE} theta <- theta0 a <- b1 x <- x0 par(mar=c(0,.1,0,1)) curve(sqrt(1-x^2), from=-1, to=1, ylim=c(-1.01,1.01), asp=1, axes=FALSE, xlab=NA, ylab=NA) curve(-sqrt(1-x^2), from=-1, to=1, add=TRUE) seq(a*theta, 1, len=100) %>% {lines(cos(.*2*pi), sin(.*2*pi), col="red", lwd=3)} curve(sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) curve(-sqrt((1-a*theta)^2-x^2), from=-(1-a*theta), to=(1-a*theta), add=TRUE, col="red", lwd=2) x1 <- Repr(x, theta) # representative of x x2 <- H(theta)$b(x1) # image of x1 on the small circle orb2 <- Class(x2, F(theta)) plot_orbit(orb2, r=(1-a*theta), lty=2, col="green") x_repr <- x1 blues <- H(theta)$f(orb2) # représentants bleus de orb(x2) i0 <- which(blues==x1) for(i in seq_along(blues)){ x1 <- blues[i] orb <- Class(x1,theta) points(cos(orb*2*pi), sin(orb*2*pi), col="blue", pch=19) if(length(orb)>1) plot_orbit(orb, lty="dashed", col="blue") x2 <- orb2[i] x2 <- (1-a*theta)*c(cos(x2*2*pi), sin(x2*2*pi)) x1 <- c(cos(x1*2*pi), sin(x1*2*pi)) arrows(x1[1], x1[2], x2[1], x2[2], lty=1, col="gray", code=ifelse(i==i0, 2, 1)) points(x2[1], x2[2], col="green", pch=19) } labs() ``` La classe-$\xi_2$ de $x$ dans la partition mesurable $\xi_2 \prec \xi_1$ est ainsi la réunion des $\#\xi'_2\bigl(\xi_1(x)\bigr)$ classes-$\xi_1$ correspondant à chaque point vert. Elle se visualise en découpant-empilant la 1ère tour selon le découpage-empilage de la 2ème tour (dessin à droite):
Le découpage-empilage correspondant à $\xi_2$ (à droite).
Notons qu'il y a deux possibilités pour le représentant-$\xi_1$ de $x$ : il est soit dans $(3\theta, 1-\theta)$ (tour de gauche) soit dans $(1-\theta, 1)$ (tour de droite). De même il y a deux possibilités pour le représentant-$\xi'_2$ de $x'=\xi_1(x)$ : il est soit dans $(0,\phi)$ soit dans $(\phi, 1-2\phi)$. Cela fait a priori quatre cas mais l'un d'eux n'est pas possible ; les trois cas possibles que nous avons déjà mentionnés précédemment sont les suivants : * *Cas 1* : le représentant-$\xi_1$ de $x$ est dans $(1-\theta, 1)$ et le représentant-$\xi'_2$ de $x'=\xi_1(x)$ est dans $(0,\phi)$. Dans ce cas, $\xi_2(x)$ est la réunion de $3$ classes-$\xi_1$, l'une d'elles est un singleton et les deux autres contiennent $4$ points (on est dans la tour de gauche). * *Cas 2* : le représentant-$\xi_1$ de $x$ est dans $(1-\theta, 1)$ et le représentant-$\xi'_2$ de $x'=\xi_1(x)$ est dans $(\phi, 1-2\phi)$. Dans ce cas, $\xi_2(x) = \xi_1(x)$ (on est dans la tour de droite). * *Cas 3* : le représentant-$\xi_1$ de $x$ est dans $(3\theta, 1-\theta)$ et le représentant-$\xi'_2$ de $x'=\xi_1(x)$ est nécessairement dans $(0,\phi)$. Dans ce cas on est dans la tour de droite, comme dans le cas 1. Ainsi $\#\xi_2(x) = 9 \text{ ou } 4$. Et la mesure conditionnelle sur $\xi_2(x)$ est uniforme sur ces $9$ ou $4$ points. On visualise quelque chose de plus sur le découpage-empilage : la mesure conditionnelle sur $\xi_2(x)$ ne donne pas d'autre information que les $9$ ou $4$ points qui sont dans $\xi_2(x)$. Mais lorsque $\#\xi_2(x) = 9$, on visualise aussi les trois classes-$\xi_1$ qui composent $\xi_2(x)$. C'est la différence entre $\xi_2(x)$ et $\xi'_2\bigl(\xi_1(x)\bigr)$: $$ \xi'_2\bigl(\xi_1(x)\bigr) = \bigl\{\{x_1\}, \{x_{21}, x_{22}, x_{23}, x_{24}\}, \{x_{31}, x_{32}, x_{33}, x_{34}\} \bigr\} $$ alors que $$ \xi_2(x) = \{x_1, x_{21}, x_{22}, x_{23}, x_{24}, x_{31}, x_{32}, x_{33}, x_{34}\}. $$ Ceci correspond à la différence entre la mesure conditionnelle-$\xi_2$ et *la mesure conditionnelle de la mesure conditionnelle*. En language probabiliste c'est la loi conditionnelle itérée $\pi_2(U_0)$, si on considère la filtration $({\cal F}_2, {\cal F}_1, {\cal F}_0)$ qui correspond à $(\xi_2, \xi_1, \xi_0)$, engendrée par un triplet $(U_2, U_1, U_0)$.
***Remarque.*** *Notons $(p_n/q_n)$ la suite des convergents de $\theta$. À l'étape $n$ il y aura toujours deux tours, et les hauteurs de ces deux tours sont $q_{n-1}$ et $q_n$.* ## Graphe de Bratteli Cette succession de découpage-empilages se représente par un graphe de Bratteli. Un chemin partant de la racine représente un point $x \in (0,1)$.
* À la racine de l'arbre, que nous indexions par $n=-1$, l'intervalle $(0,1)$ n'est pas découpé, nous disons qu'il est constitué d'un seul bloc $B_{-1}=(0,1)$. * Au niveau $n=0$,l'intervalle $(0,1)$ est découpé en deux blocs: $$ B_0 = (0, 1) = \underset{B_{00}}{\underbrace{(0, 1-\theta)}} \cup \underset{B_{01}}{\underbrace{(1-\theta, 1)}}. $$ Les deux connexions entre la racine de l'arbre et un des deux sommets au niveau $n=0$ indiquent si le point $x$ est dans $B_{00}$ ou dans $B_{01}$. À ce niveau, les deux sommets fournissent la même information. * Au niveau $n=1$, on trouve le premier découpage-empilage que nous avons vu. La base est découpée en deux morceaux : $$ B_1 = \underset{B_{10}}{\underbrace{(3\theta, 1-\theta)}} \cup \underset{B_{11}}{\underbrace{(1-\theta, 1)}}. $$ Ainsi, le sommet au niveau $n=1$ indique seulement si le point $x$ est dans la tour de gauche ou dans la tour de droite. Et ici, la connexion entre le niveau $n=1$ et le niveau $n=0$ indique dans quel étage de la tour se situe $x$. * Au niveau $n=2$, on trouve le second découpage-empilage que nous avons vu. La base est découpée en deux morceaux : $$ B_2 = \underset{B_{20}}{\underbrace{(3\theta, 1-\theta)}} \cup \underset{B_{21}}{\underbrace{\bigl(1-\theta, g_1^{-1}(1-2\phi)\bigr)}}. $$ Le sommet au niveau $n=2$ indique dans quelle tour se situe $x$. La connexion entre le niveau $n=2$ et le niveau $n=1$ n'indique *pas* dans quel étage se situe $x$, mais dans quel morceau de la tour. Par exemple, si $x$ est dans la tour de gauche, nous avons vu que ce que nous avons appelé la classe-$\xi_2$ d'équivalence de $x$ est constituée de $9$ points : $$ \xi_2(x) = \{x_1, x_{21}, x_{22}, x_{23}, x_{24}, x_{31}, x_{32}, x_{33}, x_{34}\}. $$ et que ces $9$ points sont partitionnés en trois classes-$\xi_1$ d'équivalence: $$ \bigl\{\{x_1\}, \{x_{21}, x_{22}, x_{23}, x_{24}\}, \{x_{31}, x_{32}, x_{33}, x_{34}\} \bigr\}, $$ comme le montrent les accolades sur la figure. On voit bien que le chemin de la racine à $n \to \infty$ va déterminer le point $x$. Au niveau $n$, on sait dans quelle tour et dans quel étage du $n$-ième découpage-empilage se situe $x$, et la longueur des étages tend vers $0$. ```{r include=FALSE} knitr::knit_exit() ``` ____ xxxx Le chemin représenté en rouge sur le graphe ci-dessous montre dans quel segment du découpage-empilage se situe le point $x$ à chaque étape.
Le premier morceau du graphe, entre la racine et le niveau $n=1$, représente le premier découpage-empilage, de base $$ B_1 = \underset{B_{10}}{\underbrace{(3\theta, 1-\theta)}} \cup \underset{B_{11}}{\underbrace{(1-\theta, 1)}}. $$ Le point rouge au niveau $n=1$ est à droite, cela indique que $x$ est dans la tour de droite, autrement dit que le représentant de $x$ dans $B_1$ est dans le segment $B_{11}=(1-\theta, 1)$, ce qu'on peut noter $\xi_1(x) \in B_{11}$ en confondant la classe $\xi_1(x)$ et son représentant. Cette tour a $4$ étages, et le chemin rouge indique dans lequel de ces $4$ segments est situé $x$. Nous notons $v_1(x) \in \{0,1\}$ le point rouge au niveau $n=1$, ici $\boxed{v_1(x)=1}$. Entre le niveau $n=2$ et $n=1$ c'est le découpage-empilage correspondant à $\xi'_2$, de base $$ B_2 = \underset{B_{20}}{\underbrace{(0, \phi)}} \cup \underset{B_{21}}{\underbrace{(\phi, 1-\phi)}}. $$ Le point rouge montre que $\xi'_2(x) \in B_{20}$, ce que nous notons $\boxed{v_2(x)=0}$. La tour au-dessus de $B_{20}$ a $3$ étages, représentés par les $3$ chemins qui connectent ce point à un point du niveau $n=1$. Ces $3$ étages sont $(0, \phi)$, $(1-2\phi, 1-\phi)$ et $(1-\phi,1)$. Un seul chemin, correspondant à l'étage $B_{20}=(0,\phi)$, connecte $v_2=0$ à $v_1=0$, car si $\xi'_2(x) \in B_{20}$ alors on a nécessairement $\xi_1(x) \in B_{10}$ (c'est le cas 3 des trois cas possibles que nous avons précédemment énumérés). Les deux autres chemins montrent que les deux autres étages sont connectés à $B_{11}$. Le découpage-empilage correspondant à la partition mesurable $\xi_2$ se visualise alors entre le niveau $n=2$ et la racine du graphe. Le point rouge $v_2(x)=0$ indique que $x$ est dans la tour de gauche. On comptabilise $9$ chemins possibles qui connectent ce point à la racine, qui correspondent aux $9$ étages de cette tour. ### Graphe sans arête multiple Le graphe de Bratteli sans arête multiple s'obtient en représentant par des points à chaque niveau tous les étages du découpage-empilage. ```{r} knit_exit() ``` ### Adresse d'un point $x \in (0,1)$ À l'étape $n$ on a la partition mesurable $\xi'_n$, représentée par un découpage empilage avec deux tours, l'une ayant un seul étage et l'autre ayant $a_n+1$ étages, sauf si $n=1$, auquel cas l'autre tour a $a_1$ étages. Nous notons $v_n(x)=0$ si le point correspondant à $x$ se trouve dans la tour à un seul étage, $v_n(x)=1$ sinon. Et nous notons $\epsilon_{n-1}(x)$ l'étage dans lequel il se trouve. Le couple $(v_n(x), \epsilon_{n-1}(x))$ détermine alors xxxxxxxxxxx Ainsi à chaque $x$ on associe son *adresse* ${\bigl((v_n(x), \epsilon_n(x))\bigr)}_{n \geq 1}$. ### maths stackexchange Take the case $\boxed{\theta \in (0,\frac12)}$. Let $a = \max\{k\geq 0 \mid k\theta < 1-\theta\} = \lfloor \frac{1}{\theta} \rfloor -1 \geq 1$. Take $x \in (0,\theta)$. Then after $a-1$ iterations, $y:=T^{(a-1)} x \in ((a-1)\theta, a\theta)$. At the next iteration, $Ty$ falls in $(a\theta, (a+1) \theta) = (a\theta,1-\theta)\dot{\cup}(1-\theta, (a+1)\theta)$. It falls in the first interval $(a\theta,1-\theta)$ if $x \in (0,\theta')$ where $\boxed{\theta'=(1-\theta)-a\theta}<\theta$, otherwise it falls in the second interval $(1-\theta, (a+1)\theta)$. If $Ty \in (a\theta,1-\theta)$, then $T^2y \in ((a+1)\theta,1)$ and $T^3y\in(0,\theta)$. If $Ty \in (1-\theta, (a+1)\theta)$, then $T^2y\in(0,\theta)$. Finally, $$n(x)=\begin{cases} a+2 & \text{if } x \in (0,\theta') \\ a+1 & \text{if } x \in (\theta', \theta) \end{cases} $$ We can check the result by checking that Kac's lemma holds: $$ \int n(x) d\lambda(x) = (a+2)\theta' + (a+1)(\theta-\theta') = (a+1)\theta+\theta'= 1. $$ ```{r} G <- function(x) 1/x-floor(1/x) ( alpha <- (sqrt(5)-1)/2 ) 1- G(1-alpha)/(1+G(1-alpha)) ```