Gaussian primes: Difference between revisions
Content deleted Content added
Realize in F# |
Added Sidef |
||
(22 intermediate revisions by 11 users not shown) | |||
Line 1:
{{
A [[wp:Gaussian Integer|Gaussian Integer]] is a complex number such that its real and imaginary parts are both integers.
Line 33:
=={{header|11l}}==
{{trans|Python}}
<syntaxhighlight lang="11l">
F is_prime(a)
I a == 2
R 1B
I a < 2 | a % 2 == 0
R 0B
L(i) (3 .. Int(sqrt(a))).step(2)
I a % i == 0
R 0B
R 1B
F is_gaussian_prime(n)
V (r, c) = (Int(abs(n.real)), Int(abs(n.imag)))
R is_prime(r * r + c * c) | (c == 0 & is_prime(r) & (r - 3) % 4 == 0) | (r == 0 & is_prime(c) & (c - 3) % 4 == 0)
F norm(c)
R c.real * c.real + c.imag * c.imag
V limitsquared = 100
V lim = Int(sqrt(limitsquared))
V testvals = multiloop((-lim .< lim), (-lim .< lim), (r, c) -> Complex(r, c))
testvals .= filter(c -> is_gaussian_prime(c) & norm(c) < :limitsquared)
V gprimes = sorted(enumerate(testvals).map((i, c) -> (c, i)), key' c -> (norm(c[0]), c[1]))
print(‘Gaussian primes within ’lim‘ of the origin on the complex plane:’)
L(c) gprimes
print(String(c[0]).ljust(9), end' I (L.index + 1) % 10 == 0 {"\n"} E ‘’)
</syntaxhighlight>
{{out}}
<pre>
Gaussian primes within 10 of the origin on the complex plane:
-1-1i -1+1i 1-1i 1+1i -2-1i -2+1i -1-2i -1+2i 1-2i 1+2i
2-1i 2+1i -3 -3i 3i 3 -3-2i -3+2i -2-3i -2+3i
2-3i 2+3i 3-2i 3+2i -4-1i -4+1i -1-4i -1+4i 1-4i 1+4i
4-1i 4+1i -5-2i -5+2i -2-5i -2+5i 2-5i 2+5i 5-2i 5+2i
-6-1i -6+1i -1-6i -1+6i 1-6i 1+6i 6-1i 6+1i -5-4i -5+4i
-4-5i -4+5i 4-5i 4+5i 5-4i 5+4i -7 -7i 7i 7
-7-2i -7+2i -2-7i -2+7i 2-7i 2+7i 7-2i 7+2i -6-5i -6+5i
-5-6i -5+6i 5-6i 5+6i 6-5i 6+5i -8-3i -8+3i -3-8i -3+8i
3-8i 3+8i 8-3i 8+3i -8-5i -8+5i -5-8i -5+8i 5-8i 5+8i
8-5i 8+5i -9-4i -9+4i -4-9i -4+9i 4-9i 4+9i 9-4i 9+4i
</pre>
=={{header|ALGOL 68}}==
{{libheader|ALGOL 68-primes}}
The ALGOL 68-primes source is on a page in Rosetta Code - see the link above.
<syntaxhighlight lang="algol68">
BEGIN # find and plot Gaussian primes: complex numbers with integer real and #
# imaginary parts where: #
# either the real and imaginary parts are non 0 and the norm #
# (sum of squares of the real and imaginary parts) is prime #
# or one of the real/imaginary parts is zero and the other is #
# +/- a prime of the form 4n + 3 #
PR read "primes.incl.a68" PR # include prime utilities #
[]BOOL primes = PRIMESIEVE 10 000; # sieve the primes to 10 000 #
# applies gp to the Gaussian primes with within radius of 0+0i #
PROC process gaussian primes = ( INT radius, PROC(INT,INT)VOID gp )VOID:
BEGIN
INT r2 = radius * radius;
FOR rp FROM - radius TO radius DO
FOR ip FROM - radius TO radius DO
IF INT norm = ( rp * rp ) + ( ip * ip );
norm < r2
THEN
IF rp /= 0 AND ip /= 0 THEN
IF primes[ norm ] THEN gp( rp, ip ) FI
ELIF rp /= 0 OR ip /= 0 THEN
IF INT abs sum parts = ABS ( rp + ip );
primes[ abs sum parts ]
AND ( abs sum parts - 3 ) MOD 4 = 0
THEN
gp( rp, ip )
FI
FI
FI
OD
OD
END # process gaussian primes # ;
# show Gaussian primes within a radius (root of the norm) of 10 of 0+0i #
INT gp count := 0;
process gaussian primes( 10
, ( INT rp, ip )VOID:
BEGIN
print( ( " "
, IF rp > 0 THEN " " ELSE "-" FI, whole( ABS rp, 0 )
, IF ip < 0 THEN "-" ELSE "+" FI, whole( ABS ip, 0 )
, "i"
)
),
IF ( gp count +:= 1 ) MOD 12 = 0 THEN print( ( newline ) ) FI
END
);
# plot the Gaussian primes within a radius of 50 of the origin (0+0i) #
[ -50 : 50, -50 : 50 ]CHAR plot;
FOR i FROM 1 LWB plot TO 1 UPB plot DO
FOR j FROM 2 LWB plot TO 2 UPB plot DO
plot[ i, j ] := IF i = 0 THEN "-" ELSE " " FI
OD;
plot[ i, 0 ] := "|"
OD;
plot[ 0, 0 ] := "+";
process gaussian primes( 50, ( INT rp, ip )VOID: plot[ rp, ip ] := "*" );
print( ( newline, newline ) );
FOR i FROM 1 LWB plot TO 1 UPB plot DO
FOR j FROM 2 LWB plot TO 2 UPB plot DO
print( ( " ", plot[ i, j ] ) )
OD;
print( ( newline ) )
OD
END
</syntaxhighlight>
{{out}}
<pre>
-9-4i -9+4i -8-5i -8-3i -8+3i -8+5i -7-2i -7+0i -7+2i -6-5i -6-1i -6+1i
-6+5i -5-8i -5-6i -5-4i -5-2i -5+2i -5+4i -5+6i -5+8i -4-9i -4-5i -4-1i
-4+1i -4+5i -4+9i -3-8i -3-2i -3+0i -3+2i -3+8i -2-7i -2-5i -2-3i -2-1i
-2+1i -2+3i -2+5i -2+7i -1-6i -1-4i -1-2i -1-1i -1+1i -1+2i -1+4i -1+6i
-0-7i -0-3i -0+3i -0+7i 1-6i 1-4i 1-2i 1-1i 1+1i 1+2i 1+4i 1+6i
2-7i 2-5i 2-3i 2-1i 2+1i 2+3i 2+5i 2+7i 3-8i 3-2i 3+0i 3+2i
3+8i 4-9i 4-5i 4-1i 4+1i 4+5i 4+9i 5-8i 5-6i 5-4i 5-2i 5+2i
5+4i 5+6i 5+8i 6-5i 6-1i 6+1i 6+5i 7-2i 7+0i 7+2i 8-5i 8-3i
8+3i 8+5i 9-4i 9+4i
</pre>
<pre style="font-size:60%;">
|
|
* * | * *
* | *
* * * * * * *
* * * * | * * * *
* * * * | * * * *
* * * * | * * * *
* * * * * * * * *
* * * * * | * * * * *
* * * * | * * * *
* * * * * * | * * * * * *
* * | * *
* * * * * * * | * * * * * * *
* * * * * * | * * * * * *
* * * * | * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * | * * * * * * *
* * * * * | * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * | * * * * * *
* * * * * | * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * | * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * | * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * * * * * * | * * * * * * * * * *
* * * * * * * * * * | * * * * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * * * * * * | * * * * * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * | * * * * * * * * * * * * * *
* * * * * * * | * * * * * * *
* * * * * * * * * * * * | * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * * * * * * * * * | * * * * * * * * * * * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * | * * * * * * * * * * * * *
* * * * * * * * * * * * | * * * * * * * * * * * *
- - - * - - - * - - - - - - - - - - - * - - - - - - - * - - - * - - - - - - - * - - - * - - - * - - + - - * - - - * - - - * - - - - - - - * - - - * - - - - - - - * - - - - - - - - - - - * - - - * - - -
* * * * * * * * * * * * | * * * * * * * * * * * *
* * * * * * * * * * * * * | * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * * * * * * * * * * * | * * * * * * * * * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * | * * * * * * * * * * * *
* * * * * * * | * * * * * * *
* * * * * * * * * * * * * * | * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * * * * * | * * * * * * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * * * * * | * * * * * * * * * *
* * * * * * * * * * | * * * * * * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * | * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * | * * * * *
* * * * * * * * * * * | * * * * * * * * * * *
* * * * * * * * * | * * * * * * * * *
* * * * * | * * * * *
* * * * * * | * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * * | * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * * | * * * * *
* * * * * * * | * * * * * * *
* * * * * * * * | * * * * * * * *
* * * * | * * * *
* * * * * * | * * * * * *
* * * * * * * | * * * * * * *
* * | * *
* * * * * * | * * * * * *
* * * * | * * * *
* * * * * | * * * * *
* * * * * * * * *
* * * * | * * * *
* * * * | * * * *
* * * * | * * * *
* * * * * * *
* | *
* * | * *
|
</pre>
=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_functions Extensible Prime Generator (F#)]
<
// Gaussian primes. Nigel Galloway: July 29th., 2022
let isGP=function (n,0)|(0,n)->let n=abs n in n%4=3 && isPrime n |(n,g)->isPrime(n*n+g*g)
Seq.allPairs [-9..9] [-9..9]|>Seq.filter isGP|>Seq.iter(fun(n,g)->printf $"""%d{n}%s{match g with 0->"" |g->sprintf $"%+d{g}i"} """); printfn ""
</syntaxhighlight>
{{out}}
<pre>
-9-4i -9+4i -8-7i -8-5i -8-3i -8+3i -8+5i -8+7i -7-8i -7-2i -7 -7+2i -7+8i -6-5i -6-1i -6+1i -6+5i -5-8i -5-6i -5-4i -5-2i -5+2i -5+4i -5+6i -5+8i -4-9i -4-5i -4-1i -4+1i -4+5i -4+9i -3-8i -3-2i -3 -3+2i -3+8i -2-7i -2-5i -2-3i -2-1i -2+1i -2+3i -2+5i -2+7i -1-6i -1-4i -1-2i -1-1i -1+1i -1+2i -1+4i -1+6i 0-7i 0-3i 0+3i 0+7i 1-6i 1-4i 1-2i 1-1i 1+1i 1+2i 1+4i 1+6i 2-7i 2-5i 2-3i 2-1i 2+1i 2+3i 2+5i 2+7i 3-8i 3-2i 3 3+2i 3+8i 4-9i 4-5i 4-1i 4+1i 4+5i 4+9i 5-8i 5-6i 5-4i 5-2i 5+2i 5+4i 5+6i 5+8i 6-5i 6-1i 6+1i 6+5i 7-8i 7-2i 7 7+2i 7+8i 8-7i 8-5i 8-3i 8+3i 8+5i 8+7i 9-4i 9+4i
</pre>
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">'#include "isprime.bas"
Function isGaussianPrime(realPart As Integer, imagPart As Integer) As Boolean
Dim As Integer norm = realPart * realPart + imagPart * imagPart
If realPart = 0 Andalso imagPart <> 0 Then
Return (Abs(imagPart) Mod 4 = 3) Andalso isPrime(Abs(imagPart))
Elseif imagPart = 0 And realPart <> 0 Then
Return (Abs(realPart) Mod 4 = 3) Andalso isPrime(Abs(realPart))
Else
Return isPrime(norm)
End If
End Function
Print "Gaussian primes within 10 of the origin on the complex plane:"
Dim As Integer i, j, norm, radius = 50
For i = -radius To radius
For j = -radius To radius
norm = i * i + j * j
If norm < 100 Andalso isGaussianPrime(i, j) Then
Print Using "##"; i;
Print Iif(j >= 0, "+", "");
Print j & "i",
End If
Next j
Next i
Sleep</syntaxhighlight>
=={{header|J}}==
Implementation: <
if. 1 p: (*+) y do. 1 return. end.
int=. |(+.y)-.0
if. 1=#int do. {.(1 p: int) * 3=4|int else. 0 end.
}}"0</
[https://jsoftware.github.io/j-playground/bin/html2/#code=isgpri%3D%3A%20%7B%7B%0A%20%20if.%201%20p%3A%20%28*%2B%29%20y%20do.%201%20return.%20end.%0A%20%20int%3D.%20%7C%28%2B.y%29-.0%0A%20%20if.%201%3D%23int%20do.%20%7B.%281%20p%3A%20int%29%20*%203%3D4%7Cint%20else.%200%20end.%0A%7D%7D%220%0A%0Arequire'viewmat'%0A%0Aviewmat%20%28isgpri%20*%20R%3E%3A%7C%29j.%2F~i%3AR%3D%3A%20100 Online plot of gaussian primes up to radius 100]. (Hit "Run" in the upper right-hand corner.)
Plot of gaussian primes up to radius 50: <
<pre style="font-size:60%;"> |
# # | # #
Line 157 ⟶ 421:
</pre>
Gaussian primes less than radius 10 (sorted by radius):<
_1j_1 _1j1 1j_1 1j1 _2j_1 _2j1 _1j_2 _1j2 1j_2 1j2
2j_1 2j1 _3 0j_3 0j3 3 _3j_2 _3j2 _2j_3 _2j3
Line 167 ⟶ 431:
_5j_6 _5j6 5j_6 5j6 6j_5 6j5 _8j_3 _8j3 _3j_8 _3j8
3j_8 3j8 8j_3 8j3 _8j_5 _8j5 _5j_8 _5j8 5j_8 5j8
8j_5 8j5 _9j_4 _9j4 _4j_9 _4j9 4j_9 4j9 9j_4 9j4</
=={{header|jq}}==
In this entry, complex numbers are uniformly represented by a two-element array, [real, imaginary], and the function Gprimes(r) emits the Gaussian primes with norm less than r. For the first task, they are displayed in groups, with each group having the same real part.
To use gnuplot to create a plot of the Gaussian primes with norm less than 100, run
the program with `plot(100)` (using the jq options `-nr`) to create a file, say gaussian.dat,
and then run the gnuplot command:
<pre>
plot "gaussian.dat" with dots
</pre>
'''Preliminaries'''
<syntaxhighlight lang=jq>
### Complex numbers
# For clarity:
def real: first;
def imag: last;
# Complex or real
def norm:
def sq: .*.;
if type == "number" then sq
else map(sq) | add
end;
# Complex or real
def abs:
if type == "array" then norm | sqrt
elif . < 0 then - . else .
end;
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
# Input should be an integer
def isPrime:
. as $n
| if ($n < 2) then false
elif ($n % 2 == 0) then $n == 2
elif ($n % 3 == 0) then $n == 3
else 5
| until( . <= 0;
if .*. > $n then -1
elif ($n % . == 0) then 0
else . + 2
| if ($n % . == 0) then 0
else . + 4
end
end)
| . == -1
end;
# Given a stream of non-null values,
# group by the values of `x|filter` that occur in a run.
def runs(stream; filter):
foreach (stream, null) as $x ({emit: false, array: []};
if $x == null
then .emit = .array
elif .array == [] or ($x|filter) == (.array[0]|filter)
then .array += [$x] | .emit = false
else {emit: .array, array: [$x]}
end;
select(.emit).emit) ;
</syntaxhighlight>
'''Gaussian Primes'''
<syntaxhighlight lang=jq>
# emit a stream of Gaussian primes with real and imaginary parts within the given radius
def GPrimes($Radius):
def check: abs | isPrime and ((. - 3) % 4 == 0);
($Radius | norm) as $R2
| range(-$Radius; $Radius + 1) as $r
| range(-$Radius; $Radius + 1) as $i
| [$r, $i]
| norm as $norm
| select( $norm < $R2 )
| if $i == 0 then select($r|check)
elif $r == 0 then select($i|check)
else select($norm|isPrime)
end ;
def plot($Radius):
"# X Y",
(GPrimes($Radius) | "\(first) \(last)");
</syntaxhighlight>
'''Tasks'''
<syntaxhighlight lang=jq>
# For the first task:
"Gaussian primes with norm < 100, grouped by the real part:",
(runs(GPrimes(10); real) | map(tostring) | join(" "))
# For the plot:
# plot(100)
</syntaxhighlight>
{{Output}}
Invocation: jq -nc -f gaussian-primes.jq
<pre>
Gaussian primes with norm < 100, grouped by the real part:
[-9,-4] [-9,4]
[-8,-5] [-8,-3] [-8,3] [-8,5]
[-7,-2] [-7,0] [-7,2]
[-6,-5] [-6,-1] [-6,1] [-6,5]
[-5,-8] [-5,-6] [-5,-4] [-5,-2] [-5,2] [-5,4] [-5,6] [-5,8]
[-4,-9] [-4,-5] [-4,-1] [-4,1] [-4,5] [-4,9]
[-3,-8] [-3,-2] [-3,0] [-3,2] [-3,8]
[-2,-7] [-2,-5] [-2,-3] [-2,-1] [-2,1] [-2,3] [-2,5] [-2,7]
[-1,-6] [-1,-4] [-1,-2] [-1,-1] [-1,1] [-1,2] [-1,4] [-1,6]
[0,-7] [0,-3] [0,3] [0,7]
[1,-6] [1,-4] [1,-2] [1,-1] [1,1] [1,2] [1,4] [1,6]
[2,-7] [2,-5] [2,-3] [2,-1] [2,1] [2,3] [2,5] [2,7]
[3,-8] [3,-2] [3,0] [3,2] [3,8]
[4,-9] [4,-5] [4,-1] [4,1] [4,5] [4,9]
[5,-8] [5,-6] [5,-4] [5,-2] [5,2] [5,4] [5,6] [5,8]
[6,-5] [6,-1] [6,1] [6,5]
[7,-2] [7,0] [7,2]
[8,-5] [8,-3] [8,3] [8,5]
[9,-4] [9,4]
</pre>
=={{header|Julia}}==
<
using Plots
using Primes
Line 200 ⟶ 582:
testgaussprimes()
</
<pre>
Gaussian primes within 10 of the origin on the complex plane:
Line 213 ⟶ 595:
-8 - 3im 8 - 3im 3 - 8im -3 - 8im 8 + 5im -5 - 8im -5 + 8im 5 - 8im -8 + 5im -8 - 5im
8 - 5im 5 + 8im -4 + 9im -4 - 9im 9 + 4im -9 + 4im 9 - 4im -9 - 4im 4 - 9im 4 + 9im
</pre>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">n = 100;
digs = Reap@Do[If[Norm[i + I j]^2 < n, If[PrimeQ[i + I j, GaussianIntegers -> True], Sow[i + I j]]],
{i,Floor[-Sqrt[n]], Ceiling[Sqrt[n]]}, {j, Floor[-Sqrt[n]], Ceiling[Sqrt[n]]}
];
Multicolumn[digs[[2, 1]], Appearance -> "Horizontal"]
n = 50^2;
digs = Table[If[Norm[i + I j]^2 < n, If[PrimeQ[i + I j, GaussianIntegers -> True], "*", " "], " "],
{i,Floor[-Sqrt[n]], Ceiling[Sqrt[n]]}, {j, Floor[-Sqrt[n]], Ceiling[Sqrt[n]]}
];
digs //= Map[StringJoin];
digs //= StringRiffle[#, "\n"] &;
digs</syntaxhighlight>
{{out}}
<pre>-9-4 I -9+4 I -8-5 I -8-3 I -8+3 I -8+5 I -7-2 I -7 -7+2 I -6-5 I
-6-I -6+I -6+5 I -5-8 I -5-6 I -5-4 I -5-2 I -5+2 I -5+4 I -5+6 I
-5+8 I -4-9 I -4-5 I -4-I -4+I -4+5 I -4+9 I -3-8 I -3-2 I -3
-3+2 I -3+8 I -2-7 I -2-5 I -2-3 I -2-I -2+I -2+3 I -2+5 I -2+7 I
-1-6 I -1-4 I -1-2 I -1-I -1+I -1+2 I -1+4 I -1+6 I -7 I -3 I
3 I 7 I 1-6 I 1-4 I 1-2 I 1-I 1+I 1+2 I 1+4 I 1+6 I
2-7 I 2-5 I 2-3 I 2-I 2+I 2+3 I 2+5 I 2+7 I 3-8 I 3-2 I
3 3+2 I 3+8 I 4-9 I 4-5 I 4-I 4+I 4+5 I 4+9 I 5-8 I
5-6 I 5-4 I 5-2 I 5+2 I 5+4 I 5+6 I 5+8 I 6-5 I 6-I 6+I
6+5 I 7-2 I 7 7+2 I 8-5 I 8-3 I 8+3 I 8+5 I 9-4 I 9+4 I
* * * *
* *
* * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * *
* * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ** ** * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * ** ** * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * * * *
* * * *
* * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * *
* *
* * * *
</pre>
=={{header|Nim}}==
{{libheader|gnuplotlib.nim}}
<syntaxhighlight lang="Nim">import std/[algorithm, math, strformat]
import gnuplot
type IntComplex = tuple[re, im: int]
func isPrime(n: Natural): bool =
if n < 2: return false
if (n and 1) == 0: return n == 2
var d = 3
while d * d <= n:
if n mod d == 0:
return false
inc d, 2
result = true
func norm(c: IntComplex): Natural =
c.re * c.re + c.im * c.im
func `$`(c: IntComplex): string =
if c.im == 0: return $c.re
if c.re == 0: return $c.im & 'i'
let op = if c.im > 0: '+' else: '-'
result = &"{c.re}{op}{abs(c.im)}i"
func isGaussianPrime(c: IntComplex): bool =
if c.re == 0:
let x = abs(c.im)
return x.isPrime and (x and 3) == 3
if c.im == 0:
let x = abs(c.re)
return x.isPrime and (x and 3) == 3
result = c.norm.isPrime
func gaussianPrimes(maxNorm: Positive): seq[IntComplex] =
var gpList: seq[IntComplex]
let m = sqrt(maxNorm.toFloat).int
for x in -m..m:
for y in -m..m:
let c = (x, y)
if c.norm < maxNorm and c.isGaussianPrime:
gpList.add c
result = gpList.sortedByIt(it.norm)
echo "Gaussian primes with a norm less than 100 sorted by norm:"
for i, gp in gaussianPrimes(100):
stdout.write &"{gp:>5}"
stdout.write if i mod 10 == 9: '\n' else: ' '
var x, y: seq[int]
for gp in gaussianPrimes(150^2):
x.add gp.re
y.add gp.im
withGnuPlot:
cmd "set size ratio -1"
plot(x, y, "Gaussian primes", "with dots lw 2")
</syntaxhighlight>
{{out}}
<pre>Gaussian primes with a norm less than 100 sorted by norm:
-1-1i -1+1i 1-1i 1+1i -2-1i -2+1i -1-2i -1+2i 1-2i 1+2i
2-1i 2+1i -3 -3i 3i 3 -3-2i -3+2i -2-3i -2+3i
2-3i 2+3i 3-2i 3+2i -4-1i -4+1i -1-4i -1+4i 1-4i 1+4i
4-1i 4+1i -5-2i -5+2i -2-5i -2+5i 2-5i 2+5i 5-2i 5+2i
-6-1i -6+1i -1-6i -1+6i 1-6i 1+6i 6-1i 6+1i -5-4i -5+4i
-4-5i -4+5i 4-5i 4+5i 5-4i 5+4i -7 -7i 7i 7
-7-2i -7+2i -2-7i -2+7i 2-7i 2+7i 7-2i 7+2i -6-5i -6+5i
-5-6i -5+6i 5-6i 5+6i 6-5i 6+5i -8-3i -8+3i -3-8i -3+8i
3-8i 3+8i 8-3i 8+3i -8-5i -8+5i -5-8i -5+8i 5-8i 5+8i
8-5i 8+5i -9-4i -9+4i -4-9i -4+9i 4-9i 4+9i 9-4i 9+4i
</pre>
=={{header|Perl}}==
{{libheader|ntheory}}
<
use strict; # https://rosettacode.org/wiki/Gaussian_primes
Line 249 ⟶ 834:
}
return $plot, @primes;
}</
{{out}}
<pre>Primes within 10
Line 369 ⟶ 954:
{{libheader|Phix/online}}
You can run this online [http://phix.x10.mx/p2js/gp.htm here].
<!--<
<span style="color: #000080;font-style:italic;">--
-- demo/rosetta/Gaussian_primes.exw
Line 481 ⟶ 1,066:
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</
Output same as Raku
=={{header|Python}}==
<
from matplotlib.pyplot import scatter
Line 522 ⟶ 1,107:
print(str(c).ljust(9), end='\n' if (i +1) % 10 == 0 else '')
scatter([c.real for c in gprimes], [c.imag for c in gprimes])
</
<pre>
Gaussian primes within 10 of the origin on the complex plane:
Line 536 ⟶ 1,121:
(8-5j) (8+5j) (-9-4j) (-9+4j) (-4-9j) (-4+9j) (4-9j) (4+9j) (9-4j) (9+4j)
</pre>
=={{header|Quackery}}==
<code>eratosthenes</code> and <code>isprime</code> are defined at [[Sieve of Eratosthenes#Quackery]].
<syntaxhighlight lang="Quackery"> [ $ "turtleduck.qky" loadfile ] now!
[ ' [ 0 0 0 ] fill
[ 12 5 circle ] ] is dot ( --> )
[ 6 * 1 fly
-1 4 turn
6 * 1 fly
1 4 turn ] is toxy ( n n --> )
[ 2dup toxy
dot
1 2 turn
toxy
1 2 turn ] is plot ( n n --> )
[ 4 times
[ 300 1 walk
-300 1 fly
1 4 turn ] ] is axes ( --> )
[ dup * ] is ^2 ( n --> n )
[ ^2 swap ^2 + ] is norm ( n n --> n )
4000 eratosthenes
[ 2dup
0 !=
swap 0 != and iff
[ norm isprime ]
done
+ abs
dup 4 mod 3 =
swap isprime and ] is gprime ( n n --> b )
[]
20 ^2 1+ times
[ i^ 20 /mod
10 - dip [ 10 - ]
2dup norm 10 ^2 > iff
2drop done
2dup gprime iff
[ join
nested join ]
else 2drop ]
[] swap
witheach
[ char [ swap
2 times
[ behead rot swap
dup -1 > if
[ swap space join
swap ]
number$ join
swap ]
drop
char ] join
nested join ]
72 wrap$
turtle
0 frames
axes
100 ^2 1+ times
[ i^ 100 /mod
50 - dip [ 50 - ]
2dup norm 50 ^2 > iff
2drop done
2dup gprime iff
plot else 2drop ]
1 frames</syntaxhighlight>
{{out}}
<pre>[-9-4] [-9 4] [-8-5] [-8-3] [-8 3] [-8 5] [-7-2] [-7 0] [-7 2] [-6-5]
[-6-1] [-6 1] [-6 5] [-5-8] [-5-6] [-5-4] [-5-2] [-5 2] [-5 4] [-5 6]
[-5 8] [-4-9] [-4-5] [-4-1] [-4 1] [-4 5] [-4 9] [-3-8] [-3-2] [-3 0]
[-3 2] [-3 8] [-2-7] [-2-5] [-2-3] [-2-1] [-2 1] [-2 3] [-2 5] [-2 7]
[-1-6] [-1-4] [-1-2] [-1-1] [-1 1] [-1 2] [-1 4] [-1 6] [ 0-7] [ 0-3]
[ 0 3] [ 0 7] [ 1-6] [ 1-4] [ 1-2] [ 1-1] [ 1 1] [ 1 2] [ 1 4] [ 1 6]
[ 2-7] [ 2-5] [ 2-3] [ 2-1] [ 2 1] [ 2 3] [ 2 5] [ 2 7] [ 3-8] [ 3-2]
[ 3 0] [ 3 2] [ 3 8] [ 4-9] [ 4-5] [ 4-1] [ 4 1] [ 4 5] [ 4 9] [ 5-8]
[ 5-6] [ 5-4] [ 5-2] [ 5 2] [ 5 4] [ 5 6] [ 5 8] [ 6-5] [ 6-1] [ 6 1]
[ 6 5] [ 7-2] [ 7 0] [ 7 2] [ 8-5] [ 8-3] [ 8 3] [ 8 5] [ 9-4] [ 9 4]</pre>
[[File:Quackery Gaussian primes plot.png|center|frame]]
=={{header|Raku}}==
Plotting the points up to a radius of 150.
<syntaxhighlight lang="raku"
my @next = { :1x, :1y, :2n },;
Line 586 ⟶ 1,263:
|@points
],
);</
{{out}}
<pre>Gaussian primes with a norm less than 100 sorted by norm:
Line 601 ⟶ 1,278:
Off-site SVG image: [https://raw.githubusercontent.com/thundergnat/rc/master/img/gaussian-primes-raku.svg gaussian-primes-raku.svg]
=={{header|RPL}}==
« → radius
« { }
1 radius '''FOR''' a
0 a '''FOR''' b
'''IF''' a SQ b SQ + radius SQ ≤ '''THEN'''
{ }
'''IF''' b '''THEN'''
'''IF''' a SQ b SQ + ISPRIME? '''THEN'''
a b R→C DUP CONJ OVER NEG DUP CONJ 4 →LIST +
'''END'''
'''ELSE'''
'''IF''' a ISPRIME? a 4 MOD 3 == AND '''THEN'''
a DUP NEG 2 →LIST +
'''END'''
'''END'''
'''IF''' DUP SIZE '''THEN '''
'''IF''' a b ≠ '''THEN''' DUP (0,1) * + '''END'''
+
'''ELSE''' DROP '''END'''
'''END'''
'''NEXT NEXT '''
» » '<span style="color:blue">GPRIMES</span>' STO
« 10 <span style="color:blue">GPRIMES</span>
(-50 -50) PMIN (50 50) PMAX ERASE
50 <span style="color:blue">GPRIMES</span> 1 « '''IF''' DUP IM NOT '''THEN''' 0 R→C '''END''' PIXON » DOLIST
{ } PVIEW
» '<span style="color:blue">TASK</span>' STO
[[File:Gaussian primes.png|thumb|alt=Gaussian primes within radius 50|HP-48G emulator screenshot]]
{{out}}
<pre>
1: { (1.,1.) (1.,-1.) (-1.,-1.) (-1.,1.) (2.,1.) (2.,-1.) (-2.,-1.) (-2.,1.) (-1.,2.) (1.,2.) (1.,-2.) (-1.,-2.) 3 -3 (0.,3.) (0.,-3.) (3.,2.) (3.,-2.) (-3.,-2.) (-3.,2.) (-2.,3.) (2.,3.) (2.,-3.) (-2.,-3.) (4.,1.) (4.,-1.) (-4.,-1.) (-4.,1.) (-1.,4.) (1.,4.) (1.,-4.) (-1.,-4.) (5.,2.) (5.,-2.) (-5.,-2.) (-5.,2.) (-2.,5.) (2.,5.) (2.,-5.) (-2.,-5.) (5.,4.) (5.,-4.) (-5.,-4.) (-5.,4.) (-4.,5.) (4.,5.) (4.,-5.) (-4.,-5.) (6.,1.) (6.,-1.) (-6.,-1.) (-6.,1.) (-1.,6.) (1.,6.) (1.,-6.) (-1.,-6.) (6.,5.) (6.,-5.) (-6.,-5.) (-6.,5.) (-5.,6.) (5.,6.) (5.,-6.) (-5.,-6.) 7 -7 (0.,7.) (0.,-7.) (7.,2.) (7.,-2.) (-7.,-2.) (-7.,2.) (-2.,7.) (2.,7.) (2.,-7.) (-2.,-7.) (8.,3.) (8.,-3.) (-8.,-3.) (-8.,3.) (-3.,8.) (3.,8.) (3.,-8.) (-3.,-8.) (8.,5.) (8.,-5.) (-8.,-5.) (-8.,5.) (-5.,8.) (5.,8.) (5.,-8.) (-5.,-8.) (9.,4.) (9.,-4.) (-9.,-4.) (-9.,4.) (-4.,9.) (4.,9.) (4.,-9.) (-4.,-9.) }
</pre>
=={{header|Sidef}}==
{{trans|Perl}}
<syntaxhighlight lang="ruby">func gaussianprimes(size) {
var plot = (2*size + 1 -> of { 2*size + 1 -> of(' ') })
var primes = []
for A in (-size .. size) {
var limit = isqrt(size**2 - A**2)
for B in (-limit .. limit) {
var n = Gauss(A, B)
if (n.is_prime) {
primes << n.to_n
plot[B + size + 1][A + size + 1] = 'X'
}
}
}
return (plot, primes)
}
with(10) {|n|
var(_plot, primes) = gaussianprimes(n)
say "Primes within #{n}:"
primes.slices(10).each { .map{'%7s'%_}.join(", ").say }
}
with (50) {|n|
var (plot) = gaussianprimes(n)
say "\nPlot within #{n}"
plot.each { .join('').say }
}</syntaxhighlight>
{{out}}
<pre>
Primes within 10:
-9 - 4i, -9 + 4i, -8 - 5i, -8 - 3i, -8 + 3i, -8 + 5i, -7 - 2i, -7, -7 + 2i, -6 - 5i
-6 - 1i, -6 + 1i, -6 + 5i, -5 - 8i, -5 - 6i, -5 - 4i, -5 - 2i, -5 + 2i, -5 + 4i, -5 + 6i
-5 + 8i, -4 - 9i, -4 - 5i, -4 - 1i, -4 + 1i, -4 + 5i, -4 + 9i, -3 - 8i, -3 - 2i, -3
-3 + 2i, -3 + 8i, -2 - 7i, -2 - 5i, -2 - 3i, -2 - 1i, -2 + 1i, -2 + 3i, -2 + 5i, -2 + 7i
-1 - 6i, -1 - 4i, -1 - 2i, -1 - 1i, -1 + 1i, -1 + 2i, -1 + 4i, -1 + 6i, -7i, -3i
3i, 7i, 1 - 6i, 1 - 4i, 1 - 2i, 1 - 1i, 1 + 1i, 1 + 2i, 1 + 4i, 1 + 6i
2 - 7i, 2 - 5i, 2 - 3i, 2 - 1i, 2 + 1i, 2 + 3i, 2 + 5i, 2 + 7i, 3 - 8i, 3 - 2i
3, 3 + 2i, 3 + 8i, 4 - 9i, 4 - 5i, 4 - 1i, 4 + 1i, 4 + 5i, 4 + 9i, 5 - 8i
5 - 6i, 5 - 4i, 5 - 2i, 5 + 2i, 5 + 4i, 5 + 6i, 5 + 8i, 6 - 5i, 6 - 1i, 6 + 1i
6 + 5i, 7 - 2i, 7, 7 + 2i, 8 - 5i, 8 - 3i, 8 + 3i, 8 + 5i, 9 - 4i, 9 + 4i
</pre>
The plot up to 50 is identical to the one produced by the Perl entry.
=={{header|Wren}}==
Line 609 ⟶ 1,367:
{{libheader|wren-fmt}}
Plots the points up to a radius of 150 to produce a similar image to the Raku example.
<
import "graphics" for Canvas, Color
import "./plot" for Axes
Line 644 ⟶ 1,402:
}
System.print("Gaussian primes with a norm less than 100 sorted by norm:")
Fmt.tprint("($
GPrimes = GPrimes.map { |c| c.toPair }.toList
Line 664 ⟶ 1,422:
}
var Game = Main.new()</
{{out}}
Line 670 ⟶ 1,428:
<pre>
Gaussian primes with a norm less than 100 sorted by norm:
( 1 +
( 2 -
(-2 +
(-3 +
(-2 +
( 4 -
(-4 +
( 2 -
( 6 +
(-1 -
( 4 +
(-5 -
( 7 +
(-2 -
( 5 +
(-6 -
(-3 +
( 8 -
(-8 +
( 4 -
</pre>
|