Je suis de plus en plus dérouté par le mélange des genres dans l’espace médiatique, de ces prétendus spécialistes qui nous expliquent des choses qu’ils ont du découvrir 10 minutes avant de commencer à taper un article. Ce matin, des éditorialistes se sentaient autoriser à fabuler sur un sondage conduit sur internet auprès de 800 personnes, et j’avoue que cela m’a agacé… J’ignore si j’ai davantage de légitimité, mais je me suis dit que la loi 78 adoptée vendredi (au Québec) pourrait être un prétexte intéressant pour écrire sur un sujet d’actualité (chose que j’hésite d’ordinaire à faire, car ce n’est pas mon métier, loin de là). Pourquoi ne pourrais-je pas, moi aussi, faire mon malin et analyser un texte de loi ? On va donc regarder cette loi dans le détail, à partir du texte en ligne sur http://profscontrelahausse.org/ (ou pour être complètement honnête, le début seulement de la loi)
L=paste("Dans la presente loi, a moins", "que le contexte nindique", "un sens different, on entend par:", "association d’etudiants}}:une", "association ou un regroupement ", "d’associations de niveau postsecondaire",
etc
"la qualite de l’enseignement, les ", "services requis de façon a ", "tenir compte des circonstances particulieres", "resultant de l’interruption ", "de la session d’hiver de l’annee 2012 ou ", "de la session d’ete de l’annee 2012.") L2=substring(toupper(L),1:nchar(L),1:nchar(L)) alphabet=c("A","B","C","D","E","F","G" ,"H","I","J","K","L","M","N","O", "P","Q","R","S","T","U","V","W","X","Y","Z") L2=L2[L2%in%alphabet] ML=t(matrix(L2,nc,nl))
On peut visualiser le début du texte ci-dessous (l’idée est de ne garder que les lettres, pour faire simple, mais on peut tenter plus largement en gardant la ponctuation, et les chiffres, ça ne change rien aux algorithmes que nous allons développer)
Commencons pas des trivialités: le texte de cette loi est fondamentalement inégalitaire: ce sont toujours les mêmes qui sortent gagnants, et les mêmes qui sortent perdants,
> sort(table(L))[c(1,2,3,4,5,20,21,22,23)] L Y J X H F N A S E 7 8 10 24 26 355 386 402 820
Maintenant, si on prend le temps de regarder en détail le contenu de la loi, force est de constater qu’on y voit la présence du Malin constamment ! Pour reprendre une idée de Bahye ben Asher ibn Halawa (רבינו בחיי) on peut tenter d’utiliser le code de la Thorah. Julien Prévieux avait utilisé cette technique il y a quelques temps pour retrouver toute une terminologie associée aux crashs boursiers dans une page du Capital de Karl Marx, prise au hasard, ou aux paradis fiscaux dans la Richesse des Nations d’Adam Smith. Les amateurs de la théorie de Ramsey prétendront que c’est une supercherie, et ils auront probablement raison. Mais après avoir joué l’autre jour sur la recherche de schémas graphiques dans des images (en l’occurrence des rayures rouges et blanches, afin de repérer Charlie), j’ai eu envie de jouer à chercher des mots dans une matrice de lettres.
MOT="DEMON"
lettrelaplusrare=function(mot=MOT){ lettres=substring(mot,2:(nchar(mot)-1), 2:(nchar(mot)-1)); fL=TL[lettres]; return(names(fL)[which.min(fL)])} rare=lettrelaplusrare()
dessinlettre=function(ltr="A",clr="yellow"){ which(L==ltr); CLR=rep(NA,length(ML)); CLR[which(as.vector(ML)==ltr)]=clr; dessin(ML,CLR,plt=FALSE)}
lettres=substring(MOT,1:(nchar(mot)), 1:(nchar(mot))) avant=lettres[which(lettres==rare)-1] apres=lettres[which(lettres==rare)+1] avant=avant[1] apres=apres[1] dessinlettre(rare,"yellow") dessinlettre(avant,"green") dessinlettre(apres,"pink")
lrr=which(as.vector(ML)==rare) lav=which(as.vector(ML)==avant) lap=which(as.vector(ML)==apres) LIGrr=(lrr-1)%%nrow(ML)+1 COLrr=(lrr-1)%/%nrow(ML)+1 LIGav=(lav-1)%%nrow(ML)+1 COLav=(lav-1)%/%nrow(ML)+1 LIGap=(lap-1)%%nrow(ML)+1 COLap=(lap-1)%/%nrow(ML)+1 ptrr=cbind(LIGrr,COLrr) ptav=cbind(LIGav,COLav) ptap=cbind(LIGap,COLap)
pointsalignes=function(x,y,z){ ((y[1]+2*(x[1]-y[1]))==z[1])&((y[2]+ 2*(x[2]-y[2]))==z[2])} LEQUEL=rep(NA,3) for(a in 1:length(LIGrr)){ for(b in 1:length(LIGav)){ for(c in 1:length(LIGap)){ if(pointsalignes(ptrr[a,],ptav[b,],ptap[c,])== TRUE){LEQUEL=cbind(LEQUEL,c(a,b,c))} }}}
V=LEQUEL for(k in 2:ncol(V)){ CLR=rep(NA,length(ML)); i1=ptrr[V[1,k],]; CLR[(i1[2]-1)*ncol(ML)+i1[1]]=clr; lettres=substring(MOT,1:(nchar(mot)), 1:(nchar(mot))) milieu=which(lettres==rare) obtenu=ML[i1[1],i1[2]] for(u in 1:(milieu-1)){ i2=ptav[V[2,k],]+(u-1)*(ptav[V[2,k],]-ptrr[V[1,k],]); indice=(i2[2]-1)*ncol(ML)+i2[1] if((i2[2]<=ncol(ML))&(i2[1]>=1)&(i2[1]<= nrow(ML))&(i2[1]>=1)){CLR[indice]=clr; obtenu=paste(ML[i2[1],i2[2]],obtenu,sep="")}} for(u in (milieu+1):nchar(MOT)){ i3=ptap[V[3,k],]+(u-milieu-1)*(ptap[V[3,k],]- ptrr[V[1,k],]); indice=(i3[2]-1)*ncol(ML)+i3[1] if((i3[2]<=ncol(ML))&(i3[1]>=1)&(i3[1]<= nrow(ML))&(i3[1]>=1)){CLR[indice]=clr; obtenu=paste(obtenu,ML[i3[1],i3[2]],sep="")}} if(obtenu==MOT) {print(paste(k," ",obtenu))}}
ou alors SATAN… ce dernier apparaît huit fois dans le début du texte !
Étonnant non…. en tous les cas, je me suis bien amusé à coder ce petit algorithme, et de voir qu’il fonctionnait aussi bien ! Les amateurs de probabilités pourront se lancer dans des calculs, ou consulter quelques articles qui évoquent cette technique, comme McKay,Bar-Natan, Bar-Hillel & Kalai (2001), et tous les articles évoqués dans les références… Quant au juge qui devra se prononcer sur ma condamnation pour blasphème et pour hérésie, il va de soi que ce billet est une blague. Le diable n’existe pas ! On n’est plus au moyen-age quand même….