Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Spirale de Ulam | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Spirale de Ulam Ven 21 Oct 2016 - 16:47 | |
| - Code:
-
rem ============================================================================ rem Spirale de Ulam rem Par Papydall rem ============================================================================ rem Stanislas Marcin Ulam assistait à une conférence fort ennuyeuse et longue. rem Pour tromper l ennui, il prit son crayon et écrivit les entiers naturels en rem colimaçon en utilisant les carreaux de sa page. rem Puis il noircit les cases occupées par les nombres premiers. rem Il s apperçut que d étranges alignements apparaissaient qu il fallait expliquer. rem La spirale qui porte son nom était née. rem On l’appelle aussi spirale des nombres premiers ou horloge d’Ulam. rem ============================================================================ rem En effet, ces alignements correspondent à des polynômes du 2ème degré du type: rem ______________________ rem | | rem | y = a.x² + b.x + c | rem |______________________| | rem rem ============================================================================ rem Déjà Euler avait proposé la formule n² - n + 41 qui, pour n compris entre 1 rem et 40 ne donne que des nombres premiers. rem Les plus célèbres sont les suivantes: rem _________________________ rem | | rem | y = 4x² + 4x + 3 | rem | y = 4x² + 18x + 26 | rem | y = 4x² + 24x + 43 | rem | y = 4x² + 12x + 7 | rem | y = 4x² + 162x + 1681 | rem | y = x² + x + 17 | rem | y = x² + x + 41 | <---- Formule découverte par Euler rem |_________________________| rem ============================================================================ Init() ' Exécutez successivement ces deux Spirales Spirale_Ulam(12) ' Spirale_Ulam_2(70) caption 0,"Terminé" end rem ============================================================================ SUB Init() dim prem, p, q, c1, c2, i, j, n$ width 0,screen_y : height 0,screen_y picture 10 : width 10,width(0)-50 : height 10,height(0)-50 top 10,10 : left 10,25 : color 10,0,0,0 print_target_is 10 : 2d_target_is 10 : font_color 10,0,0,0 : font_bold 10 c1 = width(10)/2-40 : c2 = height(10)/2-40+30 2d_pen_color 255,0,0 : 2d_fill_on alpha 20 : top 20,20 : left 20,150 : font_bold 20 : font_size 20,14: font_color 20,200,100,50 hide 20 END_SUB rem ============================================================================ ' Calculer la position d'un entier q quelconque SUB placer(q) dim_local d : ' d est la distance entre le nombre q et le plus petit nombre de la couronne p. dim_local e : ' e+1 est le numéro du coté de la couronne où se trouve q. d = q - 2 * p * 2 * p - 1 e = Int(d / (1 + 2 * p)) select e case 0 : i = 0 + 4 * p * p + p - q + 1 : j = 0 - p case 1 : i = 0 - p : j = 0 - 4 * p * p - 3 * p - 1 + q case 2 : i = 0 - 4 * p * p - 5 * p - 2 + q : j = 0 + p + 1 case 3 : i = 0 + p + 1 : j = 0 + 4 * p * p + 7 * p + 4 - q end_select End_Sub rem ============================================================================ ' Déterminer si q est premier SUB premier(q) dim_local a,m prem = 1 m = 2 : a = 1 While ((m * m <= q) And (a <> 0)) a = mod(q,m) : m = m + 1 end_while If ((a <> 0) And (q > 1)) prem = 1 Else prem = 0 end_if END_SUB rem ============================================================================ SUB Spirale_Ulam(couronne) for p = 0 to couronne caption 0,"Couronne : " + str$(p)+ " / " + str$(couronne) for q = 4*p*p+1 to (2*p+2)*(2*p+2) n$ = str$(q) while len(n$) < 3 : n$ = "0" + n$ : end_while Premier(q) : Placer(q) if prem = 1 2d_fill_color 255,0,0 : 2d_circle 10+c1+30*i,8+c2+30*j,15 end_if if n$ = "001" font_color 10,255,255,255 : 2d_fill_color 0,0,255 else font_color 10,000,000,000 : 2d_fill_color 255,255,0 end_if print_locate c1+30*i,c2+30*j : print n$ next q next p caption 20," Les cercles rouges contiennent les nombres premiers " : show 20 END_SUB rem ============================================================================ SUB Spirale_Ulam_2(couronne) for p = 0 to couronne caption 0,"Couronne : " + str$(p)+ " / " + str$(couronne) for q = 4*p*p+1 to (2*p+2)*(2*p+2) n$ = str$(q) while len(n$) < 3 : n$ = "0" + n$ : end_while Premier(q) : Placer(q) if prem = 1 2d_pen_color 255,0,0 : 2d_circle c1+4*i,c2+4*j,2 end_if next q next p caption 20," Observez ces alignements des nombres premiers " : show 20 END_SUB rem ============================================================================
Bon divertissement ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Spirale de Ulam Dim 23 Oct 2016 - 5:02 | |
| Je sais parfaitement que la spirale d'Ulam n’est pas une spirale facile à comprendre. En voici une autre, moins coriace. - Code:
-
rem ============================================================================ rem Une autre spirale rem ============================================================================
dim xc,yc,c,c2,theta,r,i,x,y full_space 0 : color 0,0,0,0 : 2d_fill_on xc = width(0)/2 : yc = height(0)/2 c = 4 : c2 = 1.5*c for i = 1 to 4000 theta = sqr(i) * 2 * pi : r = sqr(i) x = 0-cos(sqr(i)*2*pi)*sqr(i) y = sin(sqr(i)*2*pi)*sqr(i) 2d_fill_color mod(theta,255),abs(255-theta),mod(theta,100) 2d_circle xc+c2*x,yc+c2*y,c next i rem ============================================================================
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Spirale de Ulam Lun 24 Oct 2016 - 8:57 | |
| Merci papydall !
Voilà encore de bons candidats pour une adaptation en FBPano.
Cela me rappelle que j'ai écrit une DLL pour calculer sur de grands nombres entiers. Elle aussi mériterait d'être intégrée à FBPano.
Sans doute pour la prochaine mise à jour ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Spirale de Ulam Lun 24 Oct 2016 - 15:16 | |
| Salut Jean_debord et merci ! Voici un autre algorithme pour tracer une spirale carrée. - Code:
-
rem ============================================================================ rem Spirale carrée rem ============================================================================ dim x, y, pas , dist, NbTour width 0 , screen_x *.75 : height 0 , screen_y *.75 x = width(0)/2 : y = height(0)/2 pas = 1 : ' pas de déplacement dist = 10 : ' distance entre les spires NbTour = 50 : ' Nombre de spires de la spirales 2d_pen_width 2 : 2d_poly_from x, y : ' Départ repeat y = y + dist*pas : 2d_poly_to x,y : ' Vers le bas x = x + dist*pas : 2d_poly_to x,y : ' Vers la droite pas = pas + 1 : ' pour ne pas repasser ultérieurement par un point déjà parcouru y = y - dist*pas : 2d_poly_to x,y : ' Vers le haut x = x - dist*pas : 2d_poly_to x,y : ' Vers la gauche pas = pas + 1 until pas > NbTour rem ============================================================================
NB : Le code de la Spirale d’Ulam, ci-haut posté mérite d’être examiné de près, notamment la SUB Placer(q)
Dernière édition par papydall le Lun 23 Jan 2017 - 12:54, édité 1 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Lun 24 Oct 2016 - 17:24 | |
| La dernière spirale est sans doute à relier au mouvement cubiste ? (Bravo, en tout cas !) | |
| | | Contenu sponsorisé
| Sujet: Re: Spirale de Ulam | |
| |
| | | | Spirale de Ulam | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |