La spirale des nombres premiers de Ulam avec la tortueRenée De Graeve2018 |
Contents
- 1 Introduction
- 2 Le dessin d’une spirale
- 3 Les procédures utiles pour écrire les nombres selon une spirale
- 4 Les nombres () dessinant une spirale
- 5 Exercice
- 6 La spirale des nombres premiers
- 7 La spirale des nombres premiers jumeaux
- 8 La spirale, les nombres premiers, la tortue et la récursivité
- 9 Exercice :les nombres premiers jumeaux avec une récursivité non terminale
- 10 Les nombres premiers de la forme et pour
1 Introduction
En 1963, lors d’une communication ennuyeuse Stanislas M. Ulam de l’université
de Los Alamos écrit les entiers naturels selon une spirale, et il entoure
les nombres premiers. À sa grande surprise
il obtient beaucoup d’alignements.
Nous allons faire faire à la tortue ce qu’a fait Stanislas M. Ulam :
- Le dessin d’une spirale,
- L’écriture des entiers selon une spirale (),
- Repérer dans la spirale, les nombres premiers par un carré rouge,
- Repérer dans la spirale, les nombres premiers jumeaux par un carré bleu.
2 Le dessin d’une spirale
une spirale est formé de spires qui sont les 2 côtés contigüs d’un
carré.
Voici le programme qui réalise le dessin d’une spirale ayant spires dont
les dimensions vont de jusqu’à .
fonction spirale(p,n=10) local k; recule n; tourne_droite 90; avance n,tourne_gauche 90; pour k de 2 jusque p faire repete (2,avance k*n,tourne_gauche 90); fpour; ffonction:;
onload
3 Les procédures utiles pour écrire les nombres selon une spirale
3.1 Les polygones réguliers
Définir une procédure isopoly(p,n) qui trace un polygone régulier de côté de longueur et ayant sommets.
fonction isopoly(p,n) repete(p,avance n,tourne_gauche 360/p); ffonction:;
onload
3.2 La procédure ecrisdans(a,n)
À chaque position de la tortue, on appelle carré direct-, le carré de
côté que peut décrire la tortue.
Définir une procédure ecrisdans(a,n) qui écrit au centre de ce
carré.
On utilisera l’instruction ecris(a,b) qui écrit a avec la fonte
b (par défaut b=14) à l’endroit où
se trouve la tortue sans tenir compte de son orientation (a est soit une
chaîne, soit un nombre, soit un nom de variable contenant une chaîne ou
un nombre).
fonction ecrisdans(a,n=15,b=14) pas_de_cote n/2; saute n/2; ecris(a,b); saute -n/2; pas_de_cote -n/2; ffonction:;
onload
Pour voir la différence entre ecrisdans et ecris :
On tape par exemple :
3.3 La procédure carrentier(a,n)
Définir la procédure carrentier(a,n) qui trace un carré direct de côté n, qui écrit a au centre de ce carré puis qui saute de n pour que la tortue soit prête à écrire l’entier suivant.
fonction carrentier(a,n=15,b=14) isopoly(4,n); ecrisdans(a,n,b); saute n; ffonction:;
onload
4 Les nombres () dessinant une spirale
On va tout d’abord décrire ce que l’on doit faire pour placer les nombres
selon la spirale :
On commence par écrire 1 avec carrentier(1,n) et grâce à
saute n contenu dans carrentier(1,n,b) on pourra écrire 2.
On écrit 2 avec carrentier(2,n,b) et grâce à
saute n contenu dans carrentier(2,n,b) la tortue se trouve dans
un angle donc :
pour que 3 se trouve au dessus de 2, la tortue doit tourner
à gauche et sauter, puis, on écrit 3.
Grâce à saute n contenu dans carrentier(3,n,b) la tortue se
trouve à nouveau dans un angle donc :
pour que 4 se trouve à gauche de 3, la tortue doit tourner
à gauche et sauter ....
Définition
Lorsque la tortue écrit dans une suite de carrés les nombres
puis tourne à gauche et saute pour écrire dans une suite
de carrés,situés au dessus du carré , les nombres
puis tourne à gauche et saute, on dit que la tortue a
effectué une spire qui sera la procédure spirentier(p,k,n,b)
(n donne la dimension du carré et b la taille de la fonte servant
à écrire ).
On tape pour faire la première spire (p=1) :
carrentier(2,n,b);tourne_gauche; saute n;
carrentier(3,n,b);tourne_gauche; saute n;.
On appelle tgsa(n) (abreviation tourne_gauche saute n) (resp
tgav(n) (abreviation tourne_gauche avance n)) la procédure
qui fait passer de l’écriture de 2 à l’écriture de 3.
Puis pour faire la deuxième spire (p=2) :
on écrit 4,5, tgsa(n), on écrit 6,7,tgsa(n) puis :
Puis pour faire la troisième spire (p=3) :
on écrit 8,9,10, tgsa(n), on écrit 11,12,13,tgsa(n) etc ..
On appelle spirentier(p,k,n,b) (p>=1) la procédure qui
pour j[0,1...p-1] exécute :
carrentier(j+k,n,b); tgsa(n); puis pour
pour j[p,p+1...2p-1] exécute
carrentier(j+k,n,b); tgsa(n)
4.1 La procédure spirentier(p,k,n,b)
On définit la procédure spirentier(p,k,n,b)
fonction tgsa(n=15) tourne_gauche; saute n; ffonction:; fonction tgav(n=15) tourne_gauche; avance n; ffonction:; fonction spirentier(p,k,n=15,b=12) local j; pour j de 0 jusque p-1 faire carrentier(j+k,n,b); fpour; tgsa(n); pour j de p jusque 2p-1 faire carrentier(j+k,n,b); fpour; tgsa(n); ffonction:;
onload
Voici le début de la spirale,le départ en noir, la première spire en
rouge, la deuxiéme spire en vert avec les nombres écrits avec une
fonte de 12 :
Voici la suite de la spirale, la troisième spire en jaune, la quatriéme
en bleu, la cinqième en magenta et la sixième en cyan avec les nombres
écrits avec une fonte de 10):
4.2 La procédure spiralentier(k0,K,n)
On définit la procédure spiralentier(k0,K,n,b) qui écrit selon une
spirale, les entiers lorsque :
fonction spiralentier(k0,K,n=25,b=6) local k,p; k:=k0; //ecrisdans(k,n);avance n; carrentier(k,n,b); p:=1; k:=k+1; tantque k<=K faire spirentier(p,k,n,b); k:=k+2*p; p:=p+1; ftantque; avance 0; ffonction:;
onload
Remarque et exercice
Si est un entier contenu de spirentier(p,k,n=15), montrer que
spiralentier(k0,K,n,b) écrit selon une spirale, les entiers
.
spiralentier(k0,K,n,b) écrit les entiers contenus dans une spire donc
spiralentier(k0,K,n,b) écrit selon une spirale, les entiers de
jusqu’à si .
Par exemple si :
, on a car ,
spiralentier(1,100,n,b) écrit selon une spirale, les entiers de 1
juqu’à 111 .
, on a car ,
spiralentier(41,100,n,b) écrit selon une spirale, les entiers de 41
juqu’à 113 .
Montrer que ceil.
alors ceil.
Si et spiralentier(k0,K,n,b) écrit les entiers
de 1 jusque car .
Si et spiralentier(k0,K,n,b) écrit les entiers
de 41 jusque car .
Pour vérifier :
Correction
Cherchons le dernier nombre de spirale(p,k0,n,b).
)
On a :
, , .... donc
et .
Etant donné un entier cherchons l’entier tel que :
i.e. .
Soient et () les racines de .
On a et .
Dire que :
veut dire que se trouve entre et
veut dire, puisque , que se trouve dans
donc on a :
donc
est le plus petit entier supérieur ou égal à donc
ceilceil.
Donc lorsque , si ceil,
la procédure spiralentier(k0,K,n,b) écrit selon une spirale,
les entiers .
5 Exercice
Écrire les entiers de jusque selon une spirale en ne dessinant
que la spirale sans dessiner le contour des carrés par exemple :
fonction tgav(n) tourne_gauche; avance n; ffonction:; fonction spirentierexo(p,k,n=25,b=8) local j; pour j de 0 jusque p-1 faire ecrisdans(j+k,n,b);avance n; fpour; tgav(n); pour j de p jusque 2p-1 faire ecrisdans(j+k,n,b);avance n; fpour; tgav(n); ffonction:; fonction spiralentierexo(k0,K,n=25,b=8) local k,p; k:=k0; //ecrisdans(k,n);saute n; carrentier(k,n,b); p:=1; k:=k+1; tantque k<=K faire spirentierexo(p,k,n,b) k:=k+2*p; p:=p+1; ftantque; avance 0; ffonction:;
onload
6 La spirale des nombres premiers
6.1 On écrit les nombres premiers en rouge et les autres en noir
On veut écrire dans la spirale, les nombres premiers en rouge et les nombres non premiers en noir. Pour cela on va modifier les procédures ecrisdans, carrentier en ecrisprem, carreprem :
fonction carreprem(k,n=25,b=8) ecrisprem(k,n,b); isopoly(4,n); saute n; ffonction:; fonction ecrisprem(k,n=25,b=8) pas_de_cote n/2; saute n/2; si est_premier(k) alors crayon 1; sinon crayon 0; fsi; ecris(k,b); saute -n/2; pas_de_cote -n/2; ffonction:; fonction spireprem(p,k,n=25,b=8) local j; pour j de 0 jusque p-1 faire ecrisprem(j+k,n,b); avance n; fpour; tgav(n); pour j de p jusque 2p-1 faire ecrisprem(j+k,n,b); avance n; fpour; tgav(n); ffonction:; fonction spiraleprem(k0,K,n=25,b=8) local j,k,p; k:=k0; carreprem(k,n,b); p:=1; k:=k+1; tantque k<=K faire spireprem(p,k,n,b) k:=k+2*p; p:=p+1; ftantque; avance 0; ffonction:;
onload
Remarque On termine la procédure spiraleprem par avance 0;
pour que la dernière instruction évaluée soit une instruction tortue.
6.2 On repère seulement les nombres premiers à l’aide d’un carré rouge
Dans la spirale, on veut repérer seulement les nombres premiers à l’aide
d’un carré rempli de rouge. Pour cela on va modifier les procédures :
ecrisprem, carreprem en premcarre.
On repère par un disque noir le début de la spirale en .
fonction premcarre(k,n=15) si est_premier(k) alors rectangle_plein(n,n); fsi; saute n; ffonction:; fonction spirepremcarre(p,k,n=15) local j; pour j de 0 jusque p-1 faire premcarre(j+k,n); fpour; tgsa(n); pour j de p jusque 2p-1 faire premcarre(j+k,n); fpour; tgsa(n); ffonction:; fonction spiralepremcarre(k0,K,n) local k,p; k:=k0; crayon 1; premcarre(k,n); saute -n/2; crayon 0; disque 2; saute n/2; p:=1; k:=k+1; crayon 1; tantque k<=K faire spirepremcarre(p,k,n); k:=k+2*p; p:=p+1; ftantque; avance 0; ffonction:;
onload
7 La spirale des nombres premiers jumeaux
On veut repérer dans la spirale que les nombres premiers jumeaux à l’aide d’un carré bleu et les nombres premiers non jumeaux à l’aide d’un carré rouge. Pour cela on va modifier les procédures ecrisprem, carreprem en carrepremjum
fonction tgsa(n) tourne_gauche; saute n; ffonction:; fonction carrepremjum(k,n=15) si est_premier(k) alors si est_premier(k+2) alors crayon 4; rectangle_plein(n,n); sinon si (0+crayon)==4 alors rectangle_plein(n,n);crayon 1; sinon crayon 1;rectangle_plein(n,n); fsi; fsi; fsi; saute n; ffonction:; fonction spirepremjum(p,k,n=15) local j; pour j de 0 jusque p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); pour j de p jusque 2p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); ffonction:; fonction spiralepremjum(k0,K,n=15) local k,p,c; k:=k0; carrepremjum(k,n); c:=0+crayon; saute -n/2; crayon 0;disque 2; saute n/2; crayon c; p:=1; k:=k+1; tantque k<=K faire spirepremjum(p,k,n); k:=k+2*p; p:=p+1; ftantque; avance 0; ffonction:;
onload
8 La spirale, les nombres premiers, la tortue et la récursivité
8.1 Les nombres premiers jumeaux avec une récursivité terminale
On peut décomposer la spirale débutant par k0+1 et se terminant par la spire contenant K en :
- le départ : departspirale(k0,n=15),
- la spirale par une spire de longueur débutant par k0+1 et se
terminant par la spire contenant K : spiralepremjumr(p,k0,K,n=15).
Cette spirale est formée par :- la première spire spirepremjum(p,k0+1,n),
- la fin de la spirale spiralepremjumr(p+1,k0+2*p,K,n).
On écrit les procédures pour avoir les nombres premiers jumeaux et non jumeaux :
departspirale(k0,n=15) traite le nombre en mettant un petit disque
noir pour pouvoir repérer le point de départ.
spirepremjum(p,k0+1,n) a été déjà programmé
spiralepremjumr(p+1,k0,K,n=15) est la procédure récursive qui se termine lorsque on écrit alors la dernière valeur traitée.
fonction departspirale(k0,n=15) carrepremjum(k0,n); c:=0+crayon; saute -n/2; crayon 0;disque 2; saute n/2; crayon c; ffonction:; fonction spirepremjum(p,k,n=15) local j; pour j de 0 jusque p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); pour j de p jusque 2p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); ffonction:; fonction spiralepremjumr(p,k0,K,n=15) si k0<K alors spirepremjum(p,k0+1,n); spiralepremjumr(p+1,k0+2*p,K,n); sinon saute -n; ecris k0; fsi; avance 0; ffonction:; fonction spiralepremj(k0,K,n=15) local p; departspirale(k0,n); spiralepremjumr(1,k0,K,n); ffonction:;
onload
8.2 Les nombres premiers avec une récursivité non terminale
Rappel
La ième spire () d’une spirale débutant par k0, commence à
k0+p*(p-1)+1 et se termine par p*(p+1)+k0.
Si K est un nombre contenu dans une spire cette spire est de longueur
2*p avec p:=ceil((-1+sqrt(1+4*(K-k0)))/2) car
k0+p*(p-1)<K<=k0+p*(p+1).
On écrit les procédures pour avoir les nombres premiers avec un carré
rouge. La procédure spiralepremrec(k0,K,n) est récursive et définit
la spirale débutant par k0 et se terminant par la spire contenant
K : cette spirale a donc p:=ceil((-1+sqrt(1+4*(K-k0)))/2) spires.
On décompose cette spirale spiralepremrec(k0,K,n) en
- le début de la spirale qui a p-1 spires donc qui se termine par le nombre K=p*(p-1)+k0 : spiralepremrec(k0,p*(p-1)+k0,n)
- la dernière spire qui est la pième spire qui commence par p*(p-1)+k0+1 : spirepremcarre(p,p*(p-1)+k0+1,n)
On utilise les procédures précédentes qu’on rappelle ici.
fonction tgsa(n) tourne_gauche; saute n; ffonction:; fonction premcarre(k,n=15) si est_premier(k) alors rectangle_plein(n,n); fsi; saute n; ffonction:; fonction spirepremcarre(p,k,n=15) local j; pour j de 0 jusque p-1 faire premcarre(j+k,n); fpour; tgsa(n); pour j de p jusque 2p-1 faire premcarre(j+k,n); fpour; tgsa(n); ffonction:; fonction spiralepremrec(k0,K,n=15) local p; p:=ceil((-1+sqrt(1+4*(K-k0)))/2); si p<=0 alors si est_premier(k0) alors crayon 1 ; rectangle_plein(n,n); fsi; saute n/2;crayon 0;disque(2);crayon 1 ; saute n/2; sinon spiralepremrec(k0,p*(p-1)+k0,n); spirepremcarre(p,p*(p-1)+k0+1,n); fsi; ffonction:;
onload
9 Exercice :les nombres premiers jumeaux avec une récursivité non terminale
Écrire une procédure récursive non terminale pour avoir les nombres premiers jumeaux et non jumeaux en s’aidant de ce qui précède.
fonction tgsa(n) tourne_gauche; saute n; ffonction:; fonction carrepremjum(k,n=15) si est_premier(k) alors si est_premier(k+2) alors crayon 4; rectangle_plein(n,n); sinon si (0+crayon)==4 alors rectangle_plein(n,n);crayon 1; sinon crayon 1;rectangle_plein(n,n); fsi; fsi; fsi; saute n; ffonction:; fonction spirepremjum(p,k,n=15) local j; pour j de 0 jusque p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); pour j de p jusque 2p-1 faire carrepremjum(j+k,n); fpour; tgsa(n); ffonction:; fonction spiralepremjrec(k0,K,n=15) local p,c; p:=ceil((-1+sqrt(1+4*(K-k0)))/2); si p<=0 alors carrepremjum(k0,n); c:=0+crayon; saute -n/2;crayon 0;disque(2); saute n/2;crayon c; sinon spiralepremjrec(k0,p*(p-1)+k0,n); spirepremjum(p,p*(p-1)+k0+1,n); fsi; ffonction:;
onload
10 Les nombres premiers de la forme et pour
On cherche les nombres premiers jumeaux et non jumeaux de la forme et
pour .
On décide de visualiser et par un carré : lorsque la tortue
a comme cap 0,le triangle inférieur gauche représente et le
triangle supérieur droit représente .
Si et sont des nombres premiers jumeaux, on décide
colorier ces 2 triangles en bleu pour obtenir au final un carré bleu.
Si (resp ) est un nombre premier non jumeaux, on décide
colorier son triangle en rouge (l’autre triangle restant blanc).
On range ensuite ces carrés selon une spirale comme précédemment en
utilisant les fonctions déjà écrites tgsa, ecrisdans.
La fonction finale spiraleprem6(k0,P,n=16,b=8) :
- écrit k0 et dessine le carré correspondant à 6*k0-1 et 6*k0+1 puis,
- fait P spires de longueur 1*2, 2*2,...2.
Rappel pour faire une spire de longueur la tortue fait carrés côte à côte puis tourne à gauche, saute et fait à nouveau carrés côte à côte.- la première spire dessine 2 carrés : le carré traitant 6*(k0+1)-1 et 6*(k0+1)+1 et le carré traitant 6*(k0+2)-1 et 6*(k0+2)+1 puis,
- fait la deuxième spire jusqu’à la Pième spire.
Au total, le dessin final trace 1+1*2+2*2+2*3+...+2*P=1+P(P+1) carrés
qui correspondent aux valeurs de k allant de k0 jusqu’à
k0+P*(P+1).
On traite donc les nombres premiers qui vont de 6*k0-1 jusqu’à
6*(k0+P*(P+1))+1.
fonction tgsa(n) tourne_gauche; saute n; ffonction:; fonction ecrisdans(k,n=15,b=14) pas_de_cote n/2; saute n/2; crayon 0; ecris(k,b); saute -n/2; pas_de_cote -n/2; ffonction:; fonction carreprem6(k,n=16) local c1,c2; si est_premier(6*k-1) alors c1:=1; sinon c1:=7; fsi; si est_premier(6*k+1) alors c2:=1; sinon c2:=7; fsi; si c1+c2==2 alors crayon 4; rectangle_plein(n,n); saute n; sinon crayon c2; rectangle_plein(n,n); crayon c1; triangle_plein(n,n); saute n; fsi; ffonction:; fonction spireprem6(p,k,n=16) local j; pour j de 1 jusque p faire carreprem6(k,n); k:=k+1; fpour; tgsa(n); pour j de 1 jusque p faire carreprem6(k,n); k:=k+1; fpour; tgsa(n); ffonction:; fonction spiraleprem6(k0,P,n=16,b=8) local p,k; carreprem6(k0,n); ecrisdans(k0,n,b); saute n; k:=k0+1; pour p de 1 jusque P faire spireprem6(p,k,n); k:=k+2*p; fpour; saute -n; ecrisdans(k-1,n,b); ffonction:;
onload
On a tracé carrés pour allant de à
pour traiter les nombres allant de à .
On a tracé carrés pour allant de à
pour traiter les nombres allant de à
.