I was just playing with this for funsies after seeing a youtube video from Vi Hart about Ulam's Spiral.
http://www.youtube.com/embed/Yhlv5Aeuo_k
So, I wrote the following spiral generator that writes the output to a SVG file. It takes about 10 seconds on my laptop to generate a graph of all primes between 1 and 10,000,000.
I see now that lot's of other people have taken a crack at this, but TMTOWTDI :)
#!/usr/bin/perl
my $x = 1;
my $y = 1;
use Math::Prime::XS qw(is_prime);
my $maxcount = 1000000;
open(WRT,">primegrid.svg");
print WRT q(<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1"
height="1"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="New document 1">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="42.250643"
inkscape:cx="8.8460039"
inkscape:cy="2.865365"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1073"
inkscape:window-height="740"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>);
my $gridholder;
my $direction;
foreach my $number ( 1 ... $maxcount ){
print "$number\r";
if($direction eq ""){
$gridholder->{$x}->{$y} = $number;
markprime($x,$y,$number);
$direction = 'r';
next;
}
if($direction eq 'r'){
$x++;
$gridholder->{$x}->{$y} = $number;
markprime($x,$y,$number);
my $yp = $y + 1;
if($gridholder->{$x}->{$yp} eq ""){
$direction = 'd';
}
next;
}
if($direction eq 'd'){
$y++;
$gridholder->{$x}->{$y} = $number;
markprime($x,$y,$number);
my $xp = $x - 1;
if($gridholder->{$xp}->{$y} eq ""){
$direction = 'l';
}
next;
}
if($direction eq 'l'){
$x--;
$gridholder->{$x}->{$y} = $number;
markprime($x,$y,$number);
my $yp = $y - 1;
if($gridholder->{$x}->{$yp} eq ""){
$direction = 'u';
}
next;
}
if($direction eq 'u'){
$y--;
$gridholder->{$x}->{$y} = $number;
markprime($x,$y,$number);
my $xp = $x + 1;
if($gridholder->{$xp}->{$y} eq ""){
$direction = 'r';
}
next;
}
}
sub markprime {
my ($x, $y, $number) = @_;
if(is_prime($number)){
print WRT qq( <rect
style="fill:#000000;fill-opacity:1;stroke:none"
id="rect2985"
width="1"
height="1"
x="$x"
y="$y"
ry="0" />
);
}
return();
}
print WRT q(
</svg>);
print "done\n";
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.