HP Forums
Ulam spiral - Printable Version

+- HP Forums (http://www.hpmuseum.org/forum)
+-- Forum: HP Software Libraries (/forum-10.html)
+--- Forum: HP Prime Software Library (/forum-15.html)
+--- Thread: Ulam spiral (/thread-209.html)



Ulam spiral - Tugdual - 12-22-2013 03:15 PM

Explanation is here http://en.wikipedia.org/wiki/Ulam_spiral
The code is nothing special...

Code:

EXPORT Ulam()
BEGIN
   local x, y, level, i, n;
   x:=320/2;
   y:=240/2;
   level:=1;
   n:=1;

   rect_p(0);

   // center: initial state, level 1
   if isprime(n) then pixon_p(x,y); end;
   
   while x>=0 and x<320 and y>=0 and y<240 do
      // end of level -> move right
      x:=x+1;
      n:=n+1;
      level:=level+2;
      if isprime(n) then pixon_p(x,y,#FFFFFFh); end;

      // move up
      for i from 3 to level do
         y:=y-1;
         n:=n+1;
         if isprime(n) then pixon_p(x,y,#FFFFFFh); end;
      end;
      
      // move left
      for i from 2 to level do
         x:=x-1;
         n:=n+1;
         if isprime(n) then pixon_p(x,y,#FFFFFFh); end;
      end;

      // move down
      for i from 2 to level do
         y:=y+1;
         n:=n+1;
         if isprime(n) then pixon_p(x,y,#FFFFFFh); end;
      end;

      // move right
      for i from 2 to level do
         x:=x+1;
         n:=n+1;
         if isprime(n) then pixon_p(x,y,#FFFFFFh); end;
      end;   
   end;

freeze;
END;


And here is the Sacks version (note: why do I have to use approx???)
Code:

EXPORT Sacks()
BEGIN
local r, a, n, x, y;
rect_p(0);
n:=0;
   while x>=0 and x<320 and y>=0 and y<240 do
      if isprime(n) then
         r:=√n;
         a:=r*2*π;
         x:=approx(r*cos(a)+160);
         y:=approx(120-r*sin(a));
         pixon_p(x,y,#FFFFFF);
      end;
      n:=n+1;
   end;
freeze;
END;



RE: Ulam spiral - Damien - 12-25-2013 01:09 PM

Posted by Gilles Carpentier on 22 July 2013, 5:38 p.m.

Code:

EXPORT Ulam
BEGIN
 LOCAL a,b,xy:={160,120}, n:=1, m:=.9, d:={{1,0}, {0,1}, {-1,0}, {0,-1}};
 RECT();
 WHILE n<100000 DO
  FOR a FROM 1 TO 4 DO
   m:=m+.5;
   FOR b FROM 1 TO m DO
    IF isprime(n) THEN PIXON_P(xy,127);END;
    xy:=xy+d(a);
    n:=n+1;
   END;
  END;
 END;
 FREEZE;
END;

another one !

Regards,

Damien.