Eisenstein primes: Difference between revisions
Content added Content deleted
m (→{{header|Julia}}: syntax) |
(Added Wren) |
||
Line 117: | Line 117: | ||
</pre> |
</pre> |
||
[[File:Plot eisenstein primes julia example.svg|center|Eisenstein primes]] |
[[File:Plot eisenstein primes julia example.svg|center|Eisenstein primes]] |
||
=={{header|Wren}}== |
|||
{{libheader|DOME}} |
|||
{{libheader|Wren-plot}} |
|||
{{libheader|Wren-iterate}} |
|||
{{libheader|Wren-complex}} |
|||
{{libheader|Wren-math}} |
|||
{{libheader|Wren-fmt}} |
|||
<syntaxhighlight lang="ecmascript">import "dome" for Window |
|||
import "graphics" for Canvas, Color |
|||
import "./plot" for Axes |
|||
import "./iterate" for Stepped |
|||
import "./complex" for Complex |
|||
import "./math2" for Math, Int |
|||
import "./fmt" for Fmt |
|||
var OMEGA = Complex.new(-0.5, 3.sqrt * 0.5) |
|||
class Eisenstein { |
|||
construct new(a, b) { |
|||
_a = a |
|||
_b = b |
|||
_n = OMEGA * b + a |
|||
} |
|||
a { _a } |
|||
b { _b } |
|||
n { _n } |
|||
real { _n.real } |
|||
imag { _n.imag } |
|||
norm { _a *_a - _a * _b + _b * _b } |
|||
isPrime { |
|||
if (_a == 0 || _b == 0 || _a == _b) { |
|||
var c = Math.max(_a.abs, _b.abs) |
|||
return Int.isPrime(c) && c % 3 == 2 |
|||
} |
|||
return Int.isPrime(norm) |
|||
} |
|||
toString { _n.toString } |
|||
} |
|||
var eprimes = [] |
|||
for (a in -100..100) { |
|||
for (b in -100..100) { |
|||
var e = Eisenstein.new(a, b) |
|||
if (e.isPrime) eprimes.add(e) |
|||
} |
|||
} |
|||
// try to replicate Julia sort order for easy comparison |
|||
eprimes.sort { |e1, e2| |
|||
if (e1.norm < e2.norm) return true |
|||
if (e1.norm == e2.norm) { |
|||
if (e1.imag < e2.imag) return true |
|||
if (e1.imag == e2.imag) return e1.real < e2.real |
|||
return false |
|||
} |
|||
return false |
|||
} |
|||
// convert to Complex numbers for easy display |
|||
eprimes = eprimes.map { |e| e.n } |
|||
// display first 100 to terminal |
|||
System.print("First 100 Eisenstein primes nearest zero:") |
|||
Fmt.tprint("$ 6.4z ", eprimes.take(100), 4) |
|||
// generate points for the plot |
|||
var Pts = eprimes.map { |e| [e.real, e.imag] }.toList |
|||
class Main { |
|||
construct new() { |
|||
Window.title = "Eisenstein primes with norm <= 100 (%(Pts.count) points)" |
|||
Canvas.resize(1000, 600) |
|||
Window.resize(1000, 600) |
|||
Canvas.cls(Color.white) |
|||
var axes = Axes.new(100, 500, 800, 400, -160..160, -100..100) |
|||
axes.draw(Color.black, 2) |
|||
var xMarks = Stepped.new(-150..150, 50) |
|||
var yMarks = Stepped.new(-75..75, 25) |
|||
axes.mark(xMarks, yMarks, Color.black, 2) |
|||
axes.label(xMarks, yMarks, Color.black, 2, Color.black) |
|||
axes.plot(Pts, Color.black, "·") // uses interpunct character 0xb7 |
|||
} |
|||
init() {} |
|||
update() {} |
|||
draw(alpha) {} |
|||
} |
|||
var Game = Main.new()</syntaxhighlight> |
|||
{{out}} |
|||
Terminal output: |
|||
<pre> |
|||
First 100 Eisenstein primes nearest zero: |
|||
0.0000 - 1.7321i -1.5000 - 0.8660i 1.5000 - 0.8660i -1.5000 + 0.8660i |
|||
1.5000 + 0.8660i 0.0000 + 1.7321i -1.0000 - 1.7321i 1.0000 - 1.7321i |
|||
-2.0000 + 0.0000i 2.0000 + 0.0000i -1.0000 + 1.7321i 1.0000 + 1.7321i |
|||
-0.5000 - 2.5981i 0.5000 - 2.5981i -2.0000 - 1.7321i 2.0000 - 1.7321i |
|||
-2.5000 - 0.8660i 2.5000 - 0.8660i -2.5000 + 0.8660i 2.5000 + 0.8660i |
|||
-2.0000 + 1.7321i 2.0000 + 1.7321i -0.5000 + 2.5981i 0.5000 + 2.5981i |
|||
-1.0000 - 3.4641i 1.0000 - 3.4641i -2.5000 - 2.5981i 2.5000 - 2.5981i |
|||
-3.5000 - 0.8660i 3.5000 - 0.8660i -3.5000 + 0.8660i 3.5000 + 0.8660i |
|||
-2.5000 + 2.5981i 2.5000 + 2.5981i -1.0000 + 3.4641i 1.0000 + 3.4641i |
|||
-0.5000 - 4.3301i 0.5000 - 4.3301i -3.5000 - 2.5981i 3.5000 - 2.5981i |
|||
-4.0000 - 1.7321i 4.0000 - 1.7321i -4.0000 + 1.7321i 4.0000 + 1.7321i |
|||
-3.5000 + 2.5981i 3.5000 + 2.5981i -0.5000 + 4.3301i 0.5000 + 4.3301i |
|||
-2.5000 - 4.3301i 2.5000 - 4.3301i -5.0000 + 0.0000i 5.0000 + 0.0000i |
|||
-2.5000 + 4.3301i 2.5000 + 4.3301i -2.0000 - 5.1962i 2.0000 - 5.1962i |
|||
-3.5000 - 4.3301i 3.5000 - 4.3301i -5.5000 - 0.8660i 5.5000 - 0.8660i |
|||
-5.5000 + 0.8660i 5.5000 + 0.8660i -3.5000 + 4.3301i 3.5000 + 4.3301i |
|||
-2.0000 + 5.1962i 2.0000 + 5.1962i -0.5000 - 6.0622i 0.5000 - 6.0622i |
|||
-5.0000 - 3.4641i 5.0000 - 3.4641i -5.5000 - 2.5981i 5.5000 - 2.5981i |
|||
-5.5000 + 2.5981i 5.5000 + 2.5981i -5.0000 + 3.4641i 5.0000 + 3.4641i |
|||
-0.5000 + 6.0622i 0.5000 + 6.0622i -2.5000 - 6.0622i 2.5000 - 6.0622i |
|||
-4.0000 - 5.1962i 4.0000 - 5.1962i -6.5000 - 0.8660i 6.5000 - 0.8660i |
|||
-6.5000 + 0.8660i 6.5000 + 0.8660i -4.0000 + 5.1962i 4.0000 + 5.1962i |
|||
-2.5000 + 6.0622i 2.5000 + 6.0622i -0.5000 - 7.7942i 0.5000 - 7.7942i |
|||
-6.5000 - 4.3301i 6.5000 - 4.3301i -7.0000 - 3.4641i 7.0000 - 3.4641i |
|||
-7.0000 + 3.4641i 7.0000 + 3.4641i -6.5000 + 4.3301i 6.5000 + 4.3301i |
|||
</pre> |
|||
[[File:Eisenstein_primes_wren.png|500px|thumb|center]] |