Trouver le millionième chiffre

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 ?


7 thoughts on “Trouver le millionième chiffre”

  1. Et si on change la base de numérotation (on passe de base 10 à base 8 par exemple), obtient-on la même chose ?
    C’est une question que je me suis toujours posée avec la loi de Benford…

  2. Bonjour,

    Je me demandais si ce ne serait pas plutôt le premier “1” de 185186 ?

    Sinon, une autre énigme si vous voulez:

    Je considère la suite où on écrit n fois de suite le nombre n:
    Par exemple: “122333444455555666666…”

    Quel serait le millionième chiffre ?

      1. Oui justement c’est ce que j’avais remarqué. Just le début ressemble mais pas la suite. Et cela est comme tu l’as indiqué assez étonnant.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.