Dimanche, avec mon fils, on a tenté de résoudre un petit problème posé par Ian Stewart (qu’est-ce qu’il faut pas inventer pour éviter de voir mon fils sur sa tablette toute la matinée). Le problème est très simple, dans sa formulation : considérons la suite suivante
> paste(1:26,collapse="")
[1] "1234567891011121314151617181920212223242526"
Quel serait le millionième chiffre ? Regardons la réponse,
> L=paste(1:999999,collapse="")
> f=function(n) substr(L,n,n)
> f(1000000)
[1] "1"
J’espérais trouver une logique (genre “c’est toujours un 1“), en vain. Le point de départ était “si on va jusqu’à écrire 99“, combien de chiffres faut-il ? Facile
> 9+90*2
[1] 189
et maintenant “si on va jusqu’à 999” ?
> 9+90*2+900*3
[1] 2889
Etc. On peut utiliser la petite fonction
> g=function(k) sum(9*10^(1:k-1)*(1:k))
Pour le millionième chiffre, quel était la taille du nombre ?
> g(5)
[1] 488889
> g(6)
[1] 5888889
C’était manifestement un nombre à 6 chiffres: quand on aura écrit le dernier nombre à 5 chiffres – 99999 – il y aura eu, en tout, 488889 chiffres. Pour savoir quel chiffre on aura atteint au millionième chiffre, notons que
> (1000000-g(5))%/%6
[1] 85185
autrement dit, on cherche le 85185ème nombre à 6 chiffres, soit
> 100000+(1000000-g(5))%/%6
[1] 185185
Et pour trouver quel chiffre se trouve précisément à la position 1000000, rien de plus simple
> (1000000-g(5))%%6
[1] 1
autrement dit, c’est le premier chiffre du nombre 185185, qui est un 1. C’est le calcul qu’on avait commencé avec mon fils… mais je me demandais s’il n’y avait pas un truc… Si on regarde pour le millième chiffre, ou le dix millième chiffre, ou le cent millième chiffre, il ne semble pas y avoir de logique
> f(1000)
[1] "3"
> f(10000)
[1] "7"
> f(100000)
[1] "2"
> f(1000000)
[1] "1"
Pourtant, il y a une forte régularité, quand on regarde la répartition des 10 chiffres (de 0 à 9), dans la séquence
> library(RColorBrewer)
> COL= brewer.pal(10, "Set3")
> k=100
> V=rep(NA,k*k)
> plot(0:k,0:k,col="white",xlab="",ylab="")
> for(i in 1:k){
+ for(j in 1:k){
+ n=(i-1)*k+(j-1)
+ x=as.numeric(f(n))
+ rect(i-1,j-1,i,j,col=COL[x],border=NA)
+ V[n]=x
+ }
+ }
Mais rien de probant… Plus étonnant, si on regarde la distribution des chiffres, sur les 100000 premiers,
> Z=Vectorize(function(x) as.numeric(f(x)))(1:1e5)
> table(Z)[1:8]
0 1 2 3 4 5 6 7
8642 19753 11111 8642 8642 8642 8642 8642
Le 1 ressort très majoritairement… le 2 se distingue aussi, mais ensuite, c’est étonnamment constant
> barplot(table(Z))
On peut d’ailleurs noter que la différence entre le nombre de 1 et le nombre de 2 est très exactement le nombre de 0, de 3, de 4, de 5, …
> table(Z)[3]-table(Z)[2]
2
-8642
étonnant, non ?