Fichier spirale_ulam.jps — Modifié le 6 Juillet 2006 à 12 h 02

spirale_ulam.pdf
Source
-20 20 setxrange
-20 20 setyrange
20 setxunit

0 setlinewidth 
/fillstyle {-10 10 .95 {rouge} {blanc} 0 gradientcirclefill} def

%% version naive pour savoir si un nb est premier
/isprime {
3 dict begin
   /x exch def
   /i 3 def
   /n x sqrt floor 1 add def

   x 2 eq {
      true
   } {
      x 2 lt x 2 mod 0 eq {
         %% x < 2 ou x pair
         false
      } {
         {
            x i mod 0 eq {
               %% x divisible par i
               x i eq {
         	  true 
               } {
         	  false 
               } ifelse
               exit
            } {
               /i i 2 add store
               i n gt {
         	  true
         	  exit
               } if
            } ifelse
         } loop

      } ifelse
   } ifelse

end
} def

/decalage [0 1 0 -1] def
/decalunit 2 def
/decalx_ind 0 def
/decaly_ind 3 def
/n 1 def
/gradnumlines 50 def

/M {0 0} def

/nombre 41 def

20 setfontsize
setTimes

nombre isprime {
   /fillstyle {-10 10 .95 {bleu} {blanc} 0 gradientcirclefill} store
} if
O 1 cercle*
nombre (   ) cvs M cctext

30 {
   /decalx_ind decalx_ind 1 add 4 mod store
   /decaly_ind decaly_ind 1 add 4 mod store
   /decalx decalage decalx_ind get def
   /decaly decalage decaly_ind get def
   n floor cvi {
      M decalx decaly decalunit mulv addv /M defpoint
      /nombre nombre 1 add store
      nombre isprime {
         /fillstyle {-10 10 .95 {bleu} {blanc} 0 gradientcirclefill} store
      } {
         /fillstyle {-10 10 .95 {rouge} {blanc} 0 gradientcirclefill} store
      } ifelse
      M 1 cercle*
      nombre (   ) cvs M cctext
   } repeat
   /n n .5 add store
} repeat