prologues:=2; vardef pgcd(expr A,B) = save a,b,r; numeric a,b,r; a := A; b := B; forever: r := a mod b; a := b; b := r; exitunless r > 0; endfor; a enddef; vardef prem(expr P)= boolean reponse; reponse=false; numeric div; div=0; if P=1: div:=1; else: for g=2 upto P-1: if (pgcd(P,g)<>1): div:=div+1; fi; endfor; fi; if div=0: reponse:=true; fi; reponse enddef; vardef ulam(expr nb,pas)= save $; picture $; $=image( if prem(nb)=true: fill fullcircle scaled 8mm withcolor 0.9white; label(TEX(""&decimal(nb)&""),(0,0)); else: label(btex $\star$ etex,(0,0)); fi; pair ptd; ptd=(0,0); u:=8mm; k:=nb; for l=1 upto pas: if (l mod 2)=1: for j=1 upto l: k:=k+1; if prem(k)=true: fill fullcircle scaled 8mm shifted (ptd+u*(0,j)) withcolor 0.9white; label(TEX(""&decimal(k)&""),ptd+u*(0,j)); else: label(btex $\star$ etex,ptd+u*(0,j)); fi; endfor; ptd:=ptd+u*(0,l); for j=1 upto l: k:=k+1; if prem(k)=true: label(TEX(""&decimal(k)&""),ptd+u*(j,0)); else: label(btex $\star$ etex,ptd+u*(j,0)); fi; endfor; ptd:=ptd+u*(l,0); fi; if (l mod 2)=0: for j=1 upto l: k:=k+1; if prem(k)=true: label(TEX(""&decimal(k)&""),ptd+u*(0,-j)); else: label(btex $\star$ etex,ptd+u*(0,-j)); fi; endfor; ptd:=ptd+u*(0,-l); for j=1 upto l: k:=k+1; if prem(k)=true: label(TEX(""&decimal(k)&""),ptd+u*(-j,0)); else: label(btex $\star$ etex,ptd+u*(-j,0)); fi; endfor; ptd:=ptd+u*(-l,0); fi; endfor; ); $ enddef; input TEX; beginfig(1); draw ulam(1,10); endfig; beginfig(2); draw ulam(41,15); endfig; end