Safe primes and unsafe primes: Difference between revisions

Added Easylang
(Added Easylang)
 
(28 intermediate revisions by 19 users not shown)
Line 31:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
<langsyntaxhighlight lang="algol68"># find and count safe and unsafe primes #
# safe primes are primes p such that ( p - 1 ) / 2 is also prime #
# unsafe primes are primes that are not safe #
Line 102:
print( ( newline ) );
print( ( "unsafe primes below 1,000,000: ", commatise( unsafe1 ), newline ) );
print( ( "unsafe primes below 10,000,000: ", commatise( unsafe10 ), newline ) )</langsyntaxhighlight>
{{out}}
<pre>
Line 114:
unsafe primes below 10,000,000: 633,922
</pre>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">-- Heavy-duty Sieve of Eratosthenes handler.
-- Returns a list containing either just the primes up to a given limit ('crossingsOut' = false) or, as in this task,
-- both the primes and 'missing values' representing the "crossed out" non-primes ('crossingsOut' = true).
on sieveForPrimes given limit:limit, crossingsOut:keepingZaps
if (limit < 1) then return {}
-- Build a list initially containing only 'missing values'. For speed, and to reduce the likelihood of hanging,
-- do this by building sublists of at most 5000 items and concatenating them afterwards.
script o
property sublists : {}
property numberList : {}
end script
set sublistSize to 5000
set mv to missing value -- Use a single 'missing value' instance for economy.
repeat sublistSize times
set end of o's numberList to mv
end repeat
-- Start with a possible < 5000-item sublist.
if (limit mod sublistSize > 0) then set end of o's sublists to items 1 thru (limit mod sublistSize) of o's numberList
-- Then any 5000-item sublists needed.
if (limit ≥ sublistSize) then
set end of o's sublists to o's numberList
repeat (limit div sublistSize - 1) times
set end of o's sublists to o's numberList's items
end repeat
end if
-- Concatenate them more-or-less evenly.
set subListCount to (count o's sublists)
repeat until (subListCount is 1)
set o's numberList to {}
repeat with i from 2 to subListCount by 2
set end of o's numberList to (item (i - 1) of o's sublists) & (item i of o's sublists)
end repeat
if (i < subListCount) then set last item of o's numberList to (end of o's numberList) & (end of o's sublists)
set o's sublists to o's numberList
set subListCount to subListCount div 2
end repeat
set o's numberList to beginning of o's sublists
-- Set the relevant list positions to 2, 3, 5, and numbers which aren't multiples of them.
if (limit > 1) then set item 2 of o's numberList to 2
if (limit > 2) then set item 3 of o's numberList to 3
if (limit > 4) then set item 5 of o's numberList to 5
if (limit < 36) then
set n to -23
else
repeat with n from 7 to (limit - 29) by 30
set item n of o's numberList to n
tell (n + 4) to set item it of o's numberList to it
tell (n + 6) to set item it of o's numberList to it
tell (n + 10) to set item it of o's numberList to it
tell (n + 12) to set item it of o's numberList to it
tell (n + 16) to set item it of o's numberList to it
tell (n + 22) to set item it of o's numberList to it
tell (n + 24) to set item it of o's numberList to it
end repeat
end if
repeat with n from (n + 30) to limit
if ((n mod 2 > 0) and (n mod 3 > 0) and (n mod 5 > 0)) then set item n of o's numberList to n
end repeat
-- "Cross out" inserted numbers which are multiples of others.
set inx to {0, 4, 6, 10, 12, 16, 22, 24}
repeat with n from 7 to ((limit ^ 0.5) div 1) by 30
repeat with inc in inx
tell (n + inc)
if (item it of o's numberList is it) then
repeat with multiple from (it * it) to limit by it
set item multiple of o's numberList to mv
end repeat
end if
end tell
end repeat
end repeat
if (keepingZaps) then return o's numberList
return o's numberList's numbers
end sieveForPrimes
 
-- Task code:
on doTask()
set {safeQuantity, unsafeQuantity, max1, max2} to {35, 40, 1000000 - 1, 10000000 - 1}
set {safePrimes, unsafePrimes, safeCount1, safeCount2, unsafeCount1, unsafeCount2} to {{}, {}, 0, 0, 0, 0}
-- Get a list of 9,999,999 primes and "crossed out" non-primes! Also one with just the primes.
script o
property primesAndZaps : sieveForPrimes with crossingsOut given limit:max2
property primesOnly : my primesAndZaps's numbers
end script
-- Work through the primes-only list, using the other as an indexable look-up to check the related numbers.
set SophieGermainLimit to (max2 - 1) div 2
repeat with n in o's primesOnly
set n to n's contents
if (n ≤ SophieGermainLimit) then
tell (n * 2 + 1)
if (item it of o's primesAndZaps is it) then
if (safeCount2 < safeQuantity) then set end of safePrimes to it
if (it < max1) then set safeCount1 to safeCount1 + 1
set safeCount2 to safeCount2 + 1
end if
end tell
end if
if ((n is 2) or (item ((n - 1) div 2) of o's primesAndZaps is missing value)) then
if (unsafeCount2 < unsafeQuantity) then set end of unsafePrimes to n
if (n < max1) then set unsafeCount1 to unsafeCount1 + 1
set unsafeCount2 to unsafeCount2 + 1
end if
end repeat
-- Format and output the results.
set output to {}
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to ", "
set end of output to "First 35 safe primes:"
set end of output to safePrimes as text
set end of output to "There are " & safeCount1 & " safe primes < 1,000,000 and " & safeCount2 & " < 10,000,000."
set end of output to ""
set end of output to "First 40 unsafe primes:"
set end of output to unsafePrimes as text
set end of output to "There are " & unsafeCount1 & " unsafe primes < 1,000,000 and " & unsafeCount2 & " < 10,000,000."
set AppleScript's text item delimiters to linefeed
set output to output as text
set AppleScript's text item delimiters to astid
return output
end doTask
 
return doTask()</syntaxhighlight>
 
{{output}}
<syntaxhighlight lang="applescript">"First 35 safe primes:
5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619
There are 4324 safe primes < 1,000,000 and 30657 < 10,000,000.
 
First 40 unsafe primes:
2, 3, 13, 17, 19, 29, 31, 37, 41, 43, 53, 61, 67, 71, 73, 79, 89, 97, 101, 103, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 173, 181, 191, 193, 197, 199, 211, 223, 229, 233
There are 74174 unsafe primes < 1,000,000 and 633922 < 10,000,000."</syntaxhighlight>
=={{header|Arturo}}==
<syntaxhighlight lang="arturo">primes: select 2..10000000 => prime?
 
safe?: function [n]->
prime? (n-1)/2
 
unsafe?: function [n]->
not? safe? n
 
printWithCommas: function [lst]->
join.with:", " to [:string] lst
 
print ["first 35 safe primes:"
primes | select.first:35 => safe?
| printWithCommas]
 
print ["safe primes below 1M:"
primes | select 'x -> x < 1000000
| enumerate => safe?]
 
print ["safe primes below 10M:"
primes | enumerate => safe?]
 
print ["first 40 unsafe primes:"
primes | select.first:40 => unsafe?
| printWithCommas]
 
print ["unsafe primes below 1M:"
primes | select 'x -> x < 1000000
| enumerate => unsafe?]
 
print ["unsafe primes below 10M:"
primes | enumerate => unsafe?]</syntaxhighlight>
 
{{out}}
 
<pre>first 35 safe primes: 5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619
safe primes below 1M: 4324
safe primes below 10M: 30657
first 40 unsafe primes: 2, 3, 13, 17, 19, 29, 31, 37, 41, 43, 53, 61, 67, 71, 73, 79, 89, 97, 101, 103, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 173, 181, 191, 193, 197, 199, 211, 223, 229, 233
unsafe primes below 1M: 74174
unsafe primes below 10M: 633922</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f SAFE_PRIMES_AND_UNSAFE_PRIMES.AWK
BEGIN {
for (i=1; i<1E7; i++) {
if (is_prime(i)) {
arr[i] = ""
}
}
# safe:
stop1 = 35 ; stop2 = 1E6 ; stop3 = 1E7
count1 = count2 = count3 = 0
printf("The first %d safe primes:",stop1)
for (i=3; count1<stop1; i+=2) {
if (i in arr && ((i-1)/2 in arr)) {
count1++
printf(" %d",i)
}
}
printf("\n")
for (i=3; i<stop3; i+=2) {
if (i in arr && ((i-1)/2 in arr)) {
count3++
if (i < stop2) {
count2++
}
}
}
printf("Number below %d: %d\n",stop2,count2)
printf("Number below %d: %d\n",stop3,count3)
# unsafe:
stop1 = 40 ; stop2 = 1E6 ; stop3 = 1E7
count1 = count2 = count3 = 1 # since (2-1)/2 is not prime
printf("The first %d unsafe primes: 2",stop1)
for (i=3; count1<stop1; i+=2) {
if (i in arr && !((i-1)/2 in arr)) {
count1++
printf(" %d",i)
}
}
printf("\n")
for (i=3; i<stop3; i+=2) {
if (i in arr && !((i-1)/2 in arr)) {
count3++
if (i < stop2) {
count2++
}
}
}
printf("Number below %d: %d\n",stop2,count2)
printf("Number below %d: %d\n",stop3,count3)
exit(0)
}
function is_prime(n, d) {
d = 5
if (n < 2) { return(0) }
if (n % 2 == 0) { return(n == 2) }
if (n % 3 == 0) { return(n == 3) }
while (d*d <= n) {
if (n % d == 0) { return(0) }
d += 2
if (n % d == 0) { return(0) }
d += 4
}
return(1)
}
</syntaxhighlight>
{{out}}
<pre>
The first 35 safe primes: 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
Number below 1000000: 4324
Number below 10000000: 30657
The first 40 unsafe primes: 2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
Number below 1000000: 74174
Number below 10000000: 633922
</pre>
 
=={{header|BASIC256}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic256">arraybase 1
max = 1000000
sc1 = 0: usc1 = 0: sc2 = 0: usc2 = 0
safeprimes$ =""
unsafeprimes$ = ""
 
redim criba(max)
# False = prime, True = no prime
criba[0] = True
criba[1] = True
 
for i = 4 to max step 2
criba[i] = 1
next i
for i = 3 to sqr(max) +1 step 2
if criba[i] = False then
for j = i * i to max step i * 2
criba[j] = True
next j
end if
next
 
usc1 = 1
unsafeprimes$ = "2"
for i = 3 to 3001 step 2
if criba[i] = False then
if criba[i \ 2] = False then
sc1 += 1
if sc1 <= 35 then safeprimes$ += " " + string(i)
else
usc1 += 1
if usc1 <= 40 then unsafeprimes$ += " " + string(i)
end if
end if
next i
 
for i = 3003 to max \ 10 step 2
if criba[i] = False then
if criba[i \ 2] = False then
sc1 += 1
else
usc1 += 1
end if
end if
next i
 
sc2 = sc1
usc2 = usc1
for i = max \ 10 + 1 to max step 2
if criba[i] = False then
if criba[i \ 2] = False then
sc2 += 1
else
usc2 += 1
end if
end if
next i
 
print "the first 35 Safeprimes are: "; safeprimes$
print
print "the first 40 Unsafeprimes are: "; unsafeprimes$
print
print " Safeprimes Unsafeprimes"
print " Below -------------------------"
print max \ 10, sc1, usc1
print max , sc2, usc2
end</syntaxhighlight>
 
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdbool.h>
#include <stdio.h>
 
Line 209 ⟶ 535:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>First 35 safe primes:
Line 223 ⟶ 549:
=={{header|C sharp}}==
{{works with|C sharp|7}}
<langsyntaxhighlight lang="csharp">using static System.Console;
using System;
using System.Collections;
Line 264 ⟶ 590:
}
 
}</langsyntaxhighlight>
{{out}}
<pre>
Line 277 ⟶ 603:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <iostreamalgorithm>
#include <iomanipiostream>
#include <iterator>
#include <locale>
#include <sstreamvector>
#include "prime_sieve.hpp"
 
const int limit1 = 1000000;
int main() {
const int limit1limit2 = 100000010000000;
const int limit2 = 10000000;
const int max_print[2] = { 35, 40 };
 
class prime_info {
public:
explicit prime_info(int max) : max_print(max) {}
void add_prime(int prime);
void print(std::ostream& os, const char* name) const;
private:
int max_print;
int count1 = 0;
int count2 = 0;
std::vector<int> primes;
};
 
void prime_info::add_prime(int prime) {
++count2;
if (prime < limit1)
++count1;
if (count2 <= max_print)
primes.push_back(prime);
}
 
void prime_info::print(std::ostream& os, const char* name) const {
os << "First " << max_print << " " << name << " primes: ";
std::copy(primes.begin(), primes.end(), std::ostream_iterator<int>(os, " "));
os << '\n';
os << "Number of " << name << " primes below " << limit1 << ": " << count1 << '\n';
os << "Number of " << name << " primes below " << limit2 << ": " << count2 << '\n';
}
 
int main() {
// find the prime numbers up to limit2
prime_sieve sieve(limit2);
Line 293 ⟶ 647:
// write numbers with groups of digits separated according to the system default locale
std::cout.imbue(std::locale(""));
std::cout << std::fixed;
 
// count and print safe/unsafe prime numbers
prime_info safe_primes(35);
int count1[2] = { 0 };
prime_info unsafe_primes(40);
int count2[2] = { 0 };
std::ostringstream out[2];
const char* safety[2] = { "safe", "unsafe" };
for (int p = 2; p < limit2; ++p) {
if (!sieve.is_prime(p)) {
continue;if (sieve.is_prime((p - 1)/2))
int safe = sieve.is_prime((p - 1)/2) ? 0 : 1safe_primes.add_prime(p);
++count2[safe]; else
if (p < limit1 unsafe_primes.add_prime(p);
++count1[safe];
if (count2[safe] <= max_print[safe]) {
if (count2[safe] > 1)
out[safe] << ' ';
out[safe] << p;
}
}
safe_primes.print(std::cout, "safe");
for (int i = 0; i < 2; ++i) {
unsafe_primes.print(std::cout, "unsafe");
std::cout << "First " << max_print[i] << " " << safety[i] << " primes: " << out[i].str() << '\n';
std::cout << "Number of " << safety[i] << " primes below " << limit1 << ": " << count1[i] << '\n';
std::cout << "Number of " << safety[i] << " primes below " << limit2 << ": " << count2[i] << '\n';
}
return 0;
}</langsyntaxhighlight>
 
Contents of prime_sieve.hpp:
<langsyntaxhighlight lang="cpp">#ifndef PRIME_SIEVE_HPP
#define PRIME_SIEVE_HPP
 
Line 373 ⟶ 716:
}
 
#endif</langsyntaxhighlight>
 
{{out}}
<pre>
First 35 safe primes: 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 10191,019 11871,187 12831,283 13071,307 13191,319 13671,367 14391,439 14871,487 15231,523 1,619 1619
Number of safe primes below 1,000,000: 4,324
Number of safe primes below 10,000,000: 30,657
First 40 unsafe primes: 2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
Number of unsafe primes below 1,000,000: 74,174
Number of unsafe primes below 10,000,000: 633,922
</pre>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">isqrt = proc (s: int) returns (int)
x0: int := s/2
if x0=0 then return(s) end
x1: int := (x0 + s/x0)/2
while x1 < x0 do
x0 := x1
x1 := (x0 + s/x0)/2
end
return(x0)
end isqrt
 
sieve = proc (n: int) returns (array[bool])
prime: array[bool] := array[bool]$fill(0,n+1,true)
prime[0] := false
prime[1] := false
for p: int in int$from_to(2, isqrt(n)) do
if prime[p] then
for c: int in int$from_to_by(p*p,n,p) do
prime[c] := false
end
end
end
return(prime)
end sieve
 
start_up = proc ()
primeinfo = record [
name: string,
ps: array[int],
maxps, n_1e6, n_1e7: int
]
po: stream := stream$primary_output()
prime: array[bool] := sieve(10000000)
safe: primeinfo := primeinfo${
name: "safe",
ps: array[int]$[],
maxps: 35,
n_1e6: 0,
n_1e7: 0
}
unsafe: primeinfo := primeinfo${
name: "unsafe",
ps: array[int]$[],
maxps: 40,
n_1e6: 0,
n_1e7: 0
}
for p: int in int$from_to(2, 10000000) do
if ~prime[p] then continue end
ir: primeinfo
if prime[(p-1)/2]
then ir := safe
else ir := unsafe
end
if array[int]$size(ir.ps) < ir.maxps then
array[int]$addh(ir.ps,p)
end
if p<1000000 then ir.n_1e6 := ir.n_1e6 + 1 end
if p<10000000 then ir.n_1e7 := ir.n_1e7 + 1 end
end
for ir: primeinfo in array[primeinfo]$elements(
array[primeinfo]$[safe, unsafe]) do
stream$putl(po, "First " || int$unparse(ir.maxps)
|| " " || ir.name || " primes:")
for i: int in array[int]$elements(ir.ps) do
stream$puts(po, int$unparse(i) || " ")
end
stream$putl(po, "\nThere are " || int$unparse(ir.n_1e6)
|| " " || ir.name || " primes < 1,000,000.")
stream$putl(po, "There are " || int$unparse(ir.n_1e7)
|| " " || ir.name || " primes < 1,000,000.\n")
end
end start_up</syntaxhighlight>
{{out}}
<pre>
First 35 safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
There are 4324 safe primes < 1,000,000.
There are 30657 safe primes < 1,000,000.
 
First 40 unsafe primes:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
There are 74174 unsafe primes < 1,000,000.
There are 633922 unsafe primes < 1,000,000.</pre>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio;
 
immutable PRIMES = [
Line 479 ⟶ 914:
}
writefln("There are %6d unsafe primes below %9d", count, end);
}</langsyntaxhighlight>
{{out}}
<pre>First 35 safe primes:
Line 490 ⟶ 925:
There are 74174 unsafe primes below 1000000
There are 633922 unsafe primes below 10000000</pre>
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
 
 
<syntaxhighlight lang="Delphi">
{Uses seive object that creates an array of flags that tells whether a particular number is prime or not}
 
 
function GetSafeUnsafePrimes(MaxCount,MaxPrime: integer; ShowSafe, Display: boolean): string;
{MaxCount = Maximum number of Safe/Unsafe primes to find}
{MaxPrime = Maximum number of primes tested}
{ShowSafe = Controls whether we are looking for Save/Unsafe primes}
{Display = Controls whether the primes are displayed or just counted}
var I,Cnt: integer;
var Sieve: TPrimeSieve;
var IsSafe: boolean;
 
procedure CountAndDisplay;
begin
Inc(Cnt);
if Display then Result:=Result+Format('%7D',[I]);
If Display and ((Cnt mod 5)=0) then Result:=Result+CRLF;
end;
 
begin
{Create sieve and set sieve size}
Sieve:=TPrimeSieve.Create;
try
Sieve.Intialize(MaxPrime*2);
Cnt:=0;
Result:='';
I:=2;
while true do
begin
if I>=MaxPrime then break;
IsSafe:=(I>3) and Sieve[(I-1) div 2];
if IsSafe=ShowSafe then CountAndDisplay;
if Cnt>=MaxCount then break;
I:=Sieve.NextPrime(I);
end;
Result:=Result+'Count = '+FloatToStrF(Cnt,ffNumber,18,0);
finally Sieve.Free; end;
end;
 
 
procedure ShowSafeUnsafePrimes(Memo: TMemo);
var S: string;
begin
Memo.Lines.Add('The first 35 safe primes: ');
S:=GetSafeUnsafePrimes(35,10000000,True,True);
Memo.Lines.Add(S);
Memo.Lines.Add('Safe Primes Under 1,000,000: ');
S:=GetSafeUnsafePrimes(high(integer),1000000,True,False);
Memo.Lines.Add(S);
Memo.Lines.Add('Safe Primes Under 10,000,000: ');
S:=GetSafeUnsafePrimes(high(integer),10000000,True,False);
Memo.Lines.Add(S);
 
Memo.Lines.Add('The first 40 Unsafe primes: ');
S:=GetSafeUnsafePrimes(40,10000000,False,True);
Memo.Lines.Add(S);
Memo.Lines.Add('Unsafe Primes Under 1,000,000: ');
S:=GetSafeUnsafePrimes(high(integer),1000000,False,False);
Memo.Lines.Add(S);
Memo.Lines.Add('Unsafe Primes Under 10,000,000: ');
S:=GetSafeUnsafePrimes(high(integer),10000000,False,False);
Memo.Lines.Add(S);
end;
 
 
</syntaxhighlight>
{{out}}
<pre>
The first 35 safe primes:
5 7 11 23 47
59 83 107 167 179
227 263 347 359 383
467 479 503 563 587
719 839 863 887 983
1019 1187 1283 1307 1319
1367 1439 1487 1523 1619
Count = 35
Safe Primes Under 1,000,000:
Count = 4,324
Safe Primes Under 10,000,000:
Count = 30,657
The first 40 Unsafe primes:
2 3 13 17 19
29 31 37 41 43
53 61 67 71 73
79 89 97 101 103
109 113 127 131 137
139 149 151 157 163
173 181 191 193 197
199 211 223 229 233
Count = 40
Unsafe Primes Under 1,000,000:
Count = 74,174
Unsafe Primes Under 10,000,000:
Count = 633,922
Elapsed Time: 816.075 ms.
</pre>
 
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight>
fastfunc isprim num .
if num < 2
return 0
.
if num mod 2 = 0
if num = 2
return 1
.
return 0
.
i = 3
while i <= sqrt num
if num mod i = 0
return 0
.
i += 2
.
return 1
.
print "First 35 safe primes:"
for i = 2 to 999999
if isprim i = 1 and isprim ((i - 1) / 2) = 1
if count < 35
write i & " "
.
count += 1
.
.
print ""
print "There are " & count & " safe primes below 1000000"
for i = i to 9999999
if isprim i = 1 and isprim ((i - 1) / 2) = 1
count += 1
.
.
print "There are " & count & " safe primes below 10000000"
print ""
count = 0
print "First 40 unsafe primes:"
for i = 2 to 999999
if isprim i = 1 and isprim ((i - 1) / 2) = 0
if count < 40
write i & " "
.
count += 1
.
.
print ""
print "There are " & count & " unsafe primes below 1000000"
for i = i to 9999999
if isprim i = 1 and isprim ((i - 1) / 2) = 0
count += 1
.
.
print "There are " & count & " unsafe primes below 10000000"
</syntaxhighlight>
 
{{out}}
<pre>
First 35 safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
There are 4324 safe primes below 1000000
There are 30657 safe primes below 10000000
 
First 40 unsafe primes:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
There are 74174 unsafe primes below 1000000
There are 633922 unsafe primes below 10000000
</pre>
 
=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]<langsyntaxhighlight lang="fsharp">
pCache |> Seq.filter(fun n->isPrime((n-1)/2)) |> Seq.take 35 |> Seq.iter (printf "%d ")
</syntaxhighlight>
</lang>
{{out}}
<pre>
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
</pre>
<langsyntaxhighlight lang="fsharp">
printfn "There are %d safe primes less than 1000000" (pCache |> Seq.takeWhile(fun n->n<1000000) |> Seq.filter(fun n->isPrime((n-1)/2)) |> Seq.length)
</syntaxhighlight>
</lang>
{{out}}
<pre>
There are 4324 safe primes less than 10000000
</pre>
<langsyntaxhighlight lang="fsharp">
printfn "There are %d safe primes less than 10000000" (pCache |> Seq.takeWhile(fun n->n<10000000) |> Seq.filter(fun n->isPrime((n-1)/2)) |> Seq.length)
</syntaxhighlight>
</lang>
{{out}}
<pre>
There are 30657 safe primes less than 10000000
</pre>
<langsyntaxhighlight lang="fsharp">
pCache |> Seq.filter(fun n->not (isPrime((n-1)/2))) |> Seq.take 40 |> Seq.iter (printf "%d ")
</syntaxhighlight>
</lang>
{{out}}
<pre>
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
</pre>
<langsyntaxhighlight lang="fsharp">
printfn "There are %d unsafe primes less than 1000000" (pCache |> Seq.takeWhile(fun n->n<1000000) |> Seq.filter(fun n->not (isPrime((n-1)/2))) |> Seq.length);;
</syntaxhighlight>
</lang>
{{out}}
<pre>
There are 74174 unsafe primes less than 1000000
</pre>
<langsyntaxhighlight lang="fsharp">
printfn "There are %d unsafe primes less than 10000000" (pCache |> Seq.takeWhile(fun n->n<10000000) |> Seq.filter(fun n->not (isPrime((n-1)/2))) |> Seq.length);;
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 537 ⟶ 1,149:
=={{header|Factor}}==
Much like the Raku example, this program uses an in-built primes generator to efficiently obtain the first ten million primes. If memory is a concern, it wouldn't be unreasonable to perform primality tests on the (odd) numbers below ten million, however.
<langsyntaxhighlight lang="factor">USING: fry interpolate kernel literals math math.primes
sequences tools.memory.private ;
IN: rosetta-code.safe-primes
Line 565 ⟶ 1,177:
Unsafe prime count below 1,000,000: ${1}
Unsafe prime count below 10,000,000: ${}
I]</langsyntaxhighlight>
{{out}}
<pre>
Line 580 ⟶ 1,192:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 19-01-2019
' compile with: fbc -s console
 
Line 654 ⟶ 1,266:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre>the first 35 Safeprimes are: 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
Line 666 ⟶ 1,278:
 
=={{header|Frink}}==
<langsyntaxhighlight lang="frink">
safePrimes[end=undef] := select[primes[5,end], {|p| isPrime[(p-1)/2] }]
unsafePrimes[end=undef] := select[primes[2,end], {|p| p<5 or isPrime[(p-1)/2] }]
Line 677 ⟶ 1,289:
println["Unsafe primes below 1,000,000: " + length[unsafePrimes[1_000_000]]]
println["Unsafe primes below 10,000,000: " + length[unsafePrimes[10_000_000]]]
</syntaxhighlight>
</lang>
 
{{out}}
Line 690 ⟶ 1,302:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 791 ⟶ 1,403:
}
fmt.Println("The number of unsafe primes below 10,000,000 is", commatize(count), "\n")
}</langsyntaxhighlight>
 
{{out}}
Line 811 ⟶ 1,423:
=={{header|Haskell}}==
Uses Numbers.Prime library: http://hackage.haskell.org/package/primes-0.2.1.0/docs/Data-Numbers-Primes.html
<langsyntaxhighlight lang="haskell">
import Text.Printf (printf)
import Data.Numbers.Primes (isPrime, primes)
Line 826 ⟶ 1,438:
where safe = filter (\n -> isPrime ((n-1) `div` 2)) primes
unsafe = filter (\n -> not (isPrime((n-1) `div` 2))) primes
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 895 ⟶ 1,507:
</pre>
Essentially we have
<syntaxhighlight lang="j">
<lang J>
primeQ =: 1&p:
safeQ =: primeQ@:-:@:<:
Line 903 ⟶ 1,515:
SAFE =: safeQ Filter PRIMES
UNSAFE =: PRIMES -. SAFE
</syntaxhighlight>
</lang>
The rest of the display is mere window dressing.
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">public class SafePrimes {
public static void main(String... args) {
// Use Sieve of Eratosthenes to find primes
Line 972 ⟶ 1,584:
return;
}
}</langsyntaxhighlight>
{{out}}
<pre>First 35 safe primes: 5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619
Line 980 ⟶ 1,592:
Number of unsafe primes below 1,000,000: 74174
Number of unsafe primes below 10,000,000: 633922</pre>
 
=={{header|jq}}==
{{works with|jq}}
To save memory, we use a memory-less `is_prime` algorithm, but with a long preamble.
<syntaxhighlight lang="jq">
def is_prime:
. as $n
| if ($n < 2) then false
elif ($n % 2 == 0) then $n == 2
elif ($n % 3 == 0) then $n == 3
elif ($n % 5 == 0) then $n == 5
elif ($n % 7 == 0) then $n == 7
elif ($n % 11 == 0) then $n == 11
elif ($n % 13 == 0) then $n == 13
elif ($n % 17 == 0) then $n == 17
elif ($n % 19 == 0) then $n == 19
elif ($n % 23 == 0) then $n == 23
elif ($n % 29 == 0) then $n == 29
elif ($n % 31 == 0) then $n == 31
else 37
| until( (. * .) > $n or ($n % . == 0); . + 2)
| . * . > $n
end;
 
def task:
 
# a helper function for keeping count:
def record($p; counter6; counter7):
if $p < 10000000
then counter7 += 1
| if $p < 1000000
then counter6 += 1
else .
end
else .
end;
 
# a helper function for recording up to $max values
def recordValues($max; $p; a; done):
if done then .
elif a|length < $max
then a += [$p] | done = ($max == (a|length))
else .
end;
 
10000000 as $n
| reduce (2, range(3;$n;2)) as $p ({};
if $p|is_prime
then if (($p - 1) / 2) | is_prime
then recordValues(35; $p; .safeprimes; .safedone)
| record($p; .nsafeprimes6; .nsafeprimes7)
else recordValues(40; $p; .unsafeprimes; .unsafedone)
| record($p; .nunsafeprimes6; .nunsafeprimes7)
end
else .
end )
| "The first 35 safe primes are: ", .safeprimes[0:35],
"\nThere are \(.nsafeprimes6) safe primes less than 1 million.",
"\nThere are \(.nsafeprimes7) safe primes less than 10 million.",
"",
"\nThe first 40 unsafe primes are:", .unsafeprimes[0:40],
"\nThere are \(.nunsafeprimes6) unsafe primes less than 1 million.",
"\nThere are \(.nunsafeprimes7) unsafe primes less than 10 million."
;
 
task</syntaxhighlight>
{{out}}
<pre>
The first 35 safe primes are:
[5,7,11,23,47,59,83,107,167,179,227,263,347,359,383,467,479,503,563,587,719,839,863,887,983,1019,1187,1283,1307,1319,1367,1439,1487,1523,1619]
 
There are 4324 safe primes less than 1 million.
 
There are 30657 safe primes less than 10 million.
 
 
The first 40 unsafe primes are:
[2,3,13,17,19,29,31,37,41,43,53,61,67,71,73,79,89,97,101,103,109,113,127,131,137,139,149,151,157,163,173,181,191,193,197,199,211,223,229,233]
 
There are 74174 unsafe primes less than 1 million.
 
There are 633922 unsafe primes less than 10 million.
 
</pre>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">using Primes, Formatting
 
function parseprimelist()
Line 1,004 ⟶ 1,700:
 
parseprimelist()
</langsyntaxhighlight> {{output}} <pre>
The first 35 unsafe primes are: [5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619]
There are 4,324 safe primes less than 1 million.
Line 1,015 ⟶ 1,711:
=={{header|Kotlin}}==
{{trans|Go}}
<langsyntaxhighlight lang="scala">// Version 1.2.70
 
fun sieve(limit: Int): BooleanArray {
Line 1,082 ⟶ 1,778:
}
System.out.printf("The number of unsafe primes below 10,000,000 is %,d\n\n", count)
}</langsyntaxhighlight>
 
{{output}}
Line 1,100 ⟶ 1,796:
The number of unsafe primes below 10,000,000 is 633,922
</pre>
 
=={{header|Ksh}}==
<syntaxhighlight lang="ksh">
#!/bin/ksh
 
# Safe primes and unsafe primes
 
# # Variables:
#
integer safecnt=0 safedisp=35 safecnt1M=0
integer unsacnt=0 unsadisp=40 unsacnt1M=0
typeset -a safeprime unsafeprime
 
# # Functions:
#
 
# # Function _isprime(n) return 1 for prime, 0 for not prime
#
function _isprime {
typeset _n ; integer _n=$1
typeset _i ; integer _i
 
(( _n < 2 )) && return 0
for (( _i=2 ; _i*_i<=_n ; _i++ )); do
(( ! ( _n % _i ) )) && return 0
done
return 1
}
 
# # Function _issafe(p) return 1 for safe prime, 0 for not
#
function _issafe {
typeset _p ; integer _p=$1
 
_isprime $(( (_p - 1) / 2 ))
return $?
}
 
######
# main #
######
 
for ((n=3; n<=10000000; n++)); do
_isprime ${n}
(( ! $? )) && continue
_issafe ${n}
if (( $? )); then
(( safecnt++ ))
(( safecnt < safedisp)) && safeprime+=( ${n} )
(( n <= 999999 )) && safecnt1M=${safecnt}
else
(( unsacnt++ ))
(( unsacnt < unsadisp)) && unsafeprime+=( ${n} )
(( n <= 999999 )) && unsacnt1M=${unsacnt}
fi
done
 
print "Safe primes:\n${safeprime[*]}"
print "There are ${safecnt1M} under 1,000,000"
print "There are ${safecnt} under 10,000,000\n"
 
print "Unsafe primes:\n${unsafeprime[*]}"
print "There are ${unsacnt1M} under 1,000,000"
print "There are ${unsacnt} under 10,000,000"
</syntaxhighlight>
{{out}}<pre>
Safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
There are 4324 under 1,000,000
There are 30657 under 10,000,000
Unsafe primes:
3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
There are 74173 under 1,000,000
There are 633921 under 10,000,000</pre>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">-- FUNCS:
local function T(t) return setmetatable(t, {__index=table}) end
table.filter = function(t,f) local s=T{} for _,v in ipairs(t) do if f(v) then s[#s+1]=v end end return s end
Line 1,121 ⟶ 1,891:
print("First 40 unsafe primes : " .. unsafe:firstn(40):map(commafy):concat(" "))
print("# unsafe primes < 1,000,000 : " .. commafy(#unsafe:filter(function(v) return v<1e6 end)))
print("# unsafe primes < 10,000,000: " .. commafy(#unsafe))</langsyntaxhighlight>
{{out}}
<pre>First 35 safe primes : 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1,019 1,187 1,283 1,307 1,319 1,367 1,439 1,487 1,523 1,619
Line 1,131 ⟶ 1,901:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">showSafePrimes := proc(n::posint)
local prime_list, k;
prime_list := [5];
Line 1,171 ⟶ 1,941:
countSafePrimes(10000000);
countUnsafePrimes(1000000);
countUnsafePrimes(10000000);</langsyntaxhighlight>
{{out}}
<pre>[5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619]
Line 1,179 ⟶ 1,949:
74174
633922</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">ClearAll[SafePrimeQ, UnsafePrimeQ]
SafePrimeQ[n_Integer] := PrimeQ[n] \[And] PrimeQ[(n - 1)/2]
UnsafePrimeQ[n_Integer] := PrimeQ[n] \[And] ! PrimeQ[(n - 1)/2]
 
res = {};
i = 1;
While[Length[res] < 35,
test = SafePrimeQ[Prime[i]];
If[test, AppendTo[res, Prime[i]]];
i++
]
res
 
Count[Range[PrimePi[10^6]], _?(Prime /* SafePrimeQ)]
Count[Range[PrimePi[10^7]], _?(Prime /* SafePrimeQ)]
 
res = {};
i = 1;
While[Length[res] < 40,
test = UnsafePrimeQ[Prime[i]];
If[test, AppendTo[res, Prime[i]]];
i++
]
res
 
Count[Range[PrimePi[10^6]], _?(Prime /* UnsafePrimeQ)]
Count[Range[PrimePi[10^7]], _?(Prime /* UnsafePrimeQ)]</syntaxhighlight>
{{out}}
<pre>{5,7,11,23,47,59,83,107,167,179,227,263,347,359,383,467,479,503,563,587,719,839,863,887,983,1019,1187,1283,1307,1319,1367,1439,1487,1523,1619}
4324
30657
{2,3,13,17,19,29,31,37,41,43,53,61,67,71,73,79,89,97,101,103,109,113,127,131,137,139,149,151,157,163,173,181,191,193,197,199,211,223,229,233}
74174
633922</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import sequtils, strutils
 
const N = 10_000_000
 
# Erathostene's Sieve. Only odd values are represented. False value means prime.
var sieve: array[N div 2 + 1, bool]
sieve[0] = true # 1 is not prime.
 
for i in 1..sieve.high:
if not sieve[i]:
let n = 2 * i + 1
for k in countup(n * n, N, 2 * n):
sieve[k shr 1] = true
 
 
proc isprime(n: Positive): bool =
## Check if a number is prime.
n == 2 or (n and 1) != 0 and not sieve[n shr 1]
 
 
proc classifyPrimes(): tuple[safe, unsafe: seq[int]] =
## Classify prime numbers in safe and unsafe numbers.
for n in 2..N:
if n.isprime():
if (n shr 1).isprime():
result[0].add n
else:
result[1].add n
 
when isMainModule:
 
let (safe, unsafe) = classifyPrimes()
 
echo "First 35 safe primes:"
echo safe[0..<35].join(" ")
echo "Count of safe primes below 1_000_000:",
($safe.filterIt(it < 1_000_000).len).insertSep(',').align(7)
echo "Count of safe primes below 10_000_000:",
($safe.filterIt(it < 10_000_000).len).insertSep(',').align(7)
 
echo "First 40 unsafe primes:"
echo unsafe[0..<40].join(" ")
echo "Count of unsafe primes below 1_000_000:",
($unsafe.filterIt(it < 1_000_000).len).insertSep(',').align(8)
echo "Count of unsafe primes below 10_000_000:",
($unsafe.filterIt(it < 10_000_000).len).insertSep(',').align(8)</syntaxhighlight>
 
{{out}}
<pre>First 35 safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
Count of safe primes below 1_000_000: 4,324
Count of safe primes below 10_000_000: 30,657
First 40 unsafe primes:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
Count of unsafe primes below 1_000_000: 74,174
Count of unsafe primes below 10_000_000: 633,922</pre>
 
=={{header|Pascal}}==
Line 1,184 ⟶ 2,048:
Using unit mp_prime of Wolfgang Erhardt ( RIP ) , of which I use two sieve, to simplify things.
Generating small primes and checked by the second, which starts to run 2x ahead.Sieving of consecutive prime number is much faster than primality check.
<langsyntaxhighlight lang="pascal">program Sophie;
{ Find and count Sophie Germain primes }
{ uses unit mp_prime out of mparith of Wolfgang Ehrhardt
Line 1,292 ⟶ 2,156:
T1 :=gettickcount64;
writeln('runtime ',T1-T0,' ms');
end.</langsyntaxhighlight>
{{output}}
<pre>First 35 safe primes
Line 1,309 ⟶ 2,173:
The module <code>ntheory</code> does fast prime generation and testing.
{{libheader|ntheory}}
<langsyntaxhighlight lang="perl">use ntheory qw(forprimes is_prime);
 
my $upto = 1e7;
Line 1,332 ⟶ 2,196:
$s =~ s/,(-?)$/$1/;
$s = reverse $s;
}</langsyntaxhighlight>
{{out}}
<pre>The first 35 safe primes are:
Line 1,344 ⟶ 2,208:
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>sequence safe = {}, unsafe = {}
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
function filter_range(integer lo, hi)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">safe</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000000;">unsafe</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
while true do
<span style="color: #008080;">function</span> <span style="color: #000000;">filter_range</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hi</span><span style="color: #0000FF;">)</span>
integer p = get_prime(lo)
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
if p>hi then return lo end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">)</span>
if p>2 and is_prime((p-1)/2) then
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">></span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">lo</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
safe &= p
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">></span><span style="color: #000000;">2</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">is_prime</span><span style="color: #0000FF;">((</span><span style="color: #000000;">p</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
else
<span style="color: #000000;">safe</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">p</span>
unsafe &= p
<span style="color: #008080;">else</span>
end if
<span style="color: #000000;">unsafe</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">p</span>
lo += 1
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end while
<span style="color: #000000;">lo</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
integer lo = filter_range(1,1_000_000),
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
ls = length(safe),
<span style="color: #004080;">integer</span> <span style="color: #000000;">lo</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filter_range</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1_000_000</span><span style="color: #0000FF;">),</span>
lu = length(unsafe)
<span style="color: #000000;">ls</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">safe</span><span style="color: #0000FF;">),</span>
{} = filter_range(lo,10_000_000)
<span style="color: #000000;">lu</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">unsafe</span><span style="color: #0000FF;">)</span>
printf(1,"The first 35 safe primes: %v\n",{safe[1..35]})
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">filter_range</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10_000_000</span><span style="color: #0000FF;">)</span>
printf(1,"Count of safe primes below 1,000,000: %,d\n",ls)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The first 35 safe primes: %v\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">safe</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">35</span><span style="color: #0000FF;">]})</span>
printf(1,"Count of safe primes below 10,000,000: %,d\n",length(safe))
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Count of safe primes below 1,000,000: %,d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ls</span><span style="color: #0000FF;">)</span>
printf(1,"The first 40 unsafe primes: %v\n",{unsafe[1..40]})
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Count of safe primes below 10,000,000: %,d\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">safe</span><span style="color: #0000FF;">))</span>
printf(1,"Count of unsafe primes below 1,000,000: %,d\n",lu)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The first 40 unsafe primes: %v\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">unsafe</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">40</span><span style="color: #0000FF;">]})</span>
printf(1,"Count of unsafe primes below 10,000,000: %,d\n",length(unsafe))</lang>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Count of unsafe primes below 1,000,000: %,d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lu</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Count of unsafe primes below 10,000,000: %,d\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">unsafe</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
{{out}}
<pre style="font-size: 11px">
Line 1,375 ⟶ 2,242:
Count of unsafe primes below 1,000,000: 74,174
Count of unsafe primes below 10,000,000: 633,922
</pre>
 
=={{header|PureBasic}}==
<syntaxhighlight lang="purebasic">#MAX=10000000
Global Dim P.b(#MAX) : FillMemory(@P(),#MAX,1,#PB_Byte)
Global NewList Primes.i()
Global NewList SaveP.i()
Global NewList UnSaveP.i()
 
For n=2 To Sqr(#MAX)+1 : If P(n) : m=n*n : While m<=#MAX : P(m)=0 : m+n : Wend : EndIf : Next
For i=2 To #MAX : If p(i) : AddElement(Primes()) : Primes()=i : EndIf : Next
 
ForEach Primes()
If P((Primes()-1)/2) And Primes()>3 : AddElement(SaveP()) : SaveP()=Primes() : If Primes()<1000000 : c1+1 : EndIf
Else
AddElement(UnSaveP()) : UnSaveP()=Primes() : If Primes()<1000000 : c2+1 : EndIf
EndIf
Next
 
OpenConsole()
PrintN("First 35 safe primes:")
If FirstElement(SaveP())
For i=1 To 35 : Print(Str(SaveP())+" ") : NextElement(SaveP()) : Next
EndIf
PrintN(~"\nThere are "+FormatNumber(c1,0,".","'")+" safe primes below 1'000'000")
PrintN("There are "+FormatNumber(ListSize(SaveP()),0,".","'")+" safe primes below 10'000'000")
PrintN("")
PrintN("First 40 unsafe primes:")
If FirstElement(UnSaveP())
For i=1 To 40 : Print(Str(UnSaveP())+" ") : NextElement(UnSaveP()) : Next
EndIf
PrintN(~"\nThere are "+FormatNumber(c2,0,".","'")+" unsafe primes below 1'000'000")
PrintN("There are "+FormatNumber(ListSize(UnSaveP()),0,".","'")+" unsafe primes below 10'000'000")
Input()</syntaxhighlight>
{{out}}
<pre>First 35 safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
There are 4'324 safe primes below 1'000'000
There are 30'657 safe primes below 10'000'000
 
First 40 unsafe primes:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
There are 74'174 unsafe primes below 1'000'000
There are 633'922 unsafe primes below 10'000'000
</pre>
 
=={{header|Python}}==
<syntaxhighlight lang="python">
<lang Python>
primes =[]
sp =[]
Line 1,404 ⟶ 2,315:
print('There are '+str(len(usp[:1000000]))+' unsafe primes below 1,000,000')
print('There are '+str(len(usp))+' safe primes below 10,000,000')
</syntaxhighlight>
</lang>
{{out}}
<pre style="font-size: 11px">
Line 1,422 ⟶ 2,333:
Raku has a built-in method .is-prime to test for prime numbers. It's great for testing individual numbers or to find/filter a few thousand numbers, but when you are looking for millions, it becomes a drag. No fear, the Raku ecosystem has a fast prime sieve module available which can produce 10 million primes in a few seconds. Once we have the primes, it is just a small matter of filtering and formatting them appropriately.
 
<syntaxhighlight lang="raku" perl6line>sub comma { $^i.flip.comb(3).join(',').flip }
 
use Math::Primesieve;
Line 1,443 ⟶ 2,354:
 
say '';
}</langsyntaxhighlight>
{{out}}
<pre>The first 35 safe primes are:
Line 1,456 ⟶ 2,367:
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program lists a sequence (or a count) of ──safe── or ──unsafe── primes. */
parse arg N kind _ . 1 . okind; upper kind /*obtain optional arguments from the CL*/
if N=='' | N=="," then N= 35 /*Not specified? Then assume default.*/
Line 1,505 ⟶ 2,416:
else return add() /*is " " " */
else if @.? == '' then return add() /*is an unsafe prime.*/
else return 0 /*not " " " */</langsyntaxhighlight>
This REXX program makes use of &nbsp; '''LINESIZE''' &nbsp; REXX program (or BIF) which is used to determine
the screen width (or linesize) of the terminal (console). &nbsp; Some REXXes don't have this BIF.
Line 1,552 ⟶ 2,463:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
load "stdlib.ring"
 
Line 1,637 ⟶ 2,548:
 
see "done..." + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,652 ⟶ 2,563:
</pre>
 
 
 
{{works with|HP|49g}}
1 - 2 /
'''IFERR''' ISPRIME? '''THEN''' DROP 0 '''END'''
≫ '<span style="color:blue">SAFE?</span>' STO
≪ → function count
≪ { } 2
'''WHILE''' OVER SIZE count < '''REPEAT '''
'''IF''' DUP function EVAL '''THEN''' SWAP OVER + SWAP '''END'''
NEXTPRIME
'''END'''
DROP
≫ ≫ '<span style="color:blue">FIRSTSEQ</span>' STO
≪ → function max
≪ 0 2
'''WHILE''' DUP max < '''REPEAT '''
'''IF''' DUP function EVAL '''THEN''' SWAP 1 + SWAP '''END'''
NEXTPRIME
'''END'''
DROP
≫ ≫ '<span style="color:blue">CNTSEQ</span>' STO
 
≪ <span style="color:blue">SAFE?</span> ≫ 35 <span style="color:blue">FIRSTSEQ</span>
≪ <span style="color:blue">SAFE?</span> ≫ 10000 <span style="color:blue">CNTSEQ</span>
≪ <span style="color:blue">SAFE?</span> NOT ≫ 40 <span style="color:blue">FIRSTSEQ</span>
≪ <span style="color:blue">SAFE?</span> NOT ≫ 10000 <span style="color:blue">CNTSEQ</span>
Counting safe numbers up to one million would take an hour, without really creating any opportunity to improve the algorithm or the code.
{{out}
<pre>
4: {5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619}
3: 115
2: {2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233}
1: 1114
</pre>
 
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">require "prime"
class Integer
def safe_prime? #assumes prime
Line 1,674 ⟶ 2,623:
p Prime.each.lazy.reject(&:safe_prime?).take(40).to_a
puts format_parts(10_000_000)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,685 ⟶ 2,634:
There are 30657 safes and 633922 unsafes below 10000000.
 
</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">fn is_prime(n: i32) -> bool {
for i in 2..n {
if i * i > n {
return true;
}
if n % i == 0 {
return false;
}
}
n > 1
}
 
fn is_safe_prime(n: i32) -> bool {
is_prime(n) && is_prime((n - 1) / 2)
}
 
fn is_unsafe_prime(n: i32) -> bool {
is_prime(n) && !is_prime((n - 1) / 2)
}
 
fn next_prime(n: i32) -> i32 {
for i in (n+1).. {
if is_prime(i) {
return i;
}
}
0
}
 
fn main() {
let mut safe = 0;
let mut unsf = 0;
let mut p = 2;
 
print!("first 35 safe primes: ");
while safe < 35 {
if is_safe_prime(p) {
safe += 1;
print!("{} ", p);
}
p = next_prime(p);
}
println!("");
 
p = 2;
 
print!("first 35 unsafe primes: ");
while unsf < 35 {
if is_unsafe_prime(p) {
unsf += 1;
print!("{} ", p);
}
p = next_prime(p);
}
println!("");
 
p = 2;
safe = 0;
unsf = 0;
 
while p < 1000000 {
if is_safe_prime(p) {
safe += 1;
} else {
unsf += 1;
}
p = next_prime(p);
}
println!("safe primes below 1,000,000: {}", safe);
println!("unsafe primes below 1,000,000: {}", unsf);
 
while p < 10000000 {
if is_safe_prime(p) {
safe += 1;
} else {
unsf += 1;
}
p = next_prime(p);
}
println!("safe primes below 10,000,000: {}", safe);
println!("unsafe primes below 10,000,000: {}", unsf);
}</syntaxhighlight>
<pre>
first 35 safe primes: 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
first 35 unsafe primes: 2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197
safe primes below 1,000,000: 4324
unsafe primes below 1,000,000: 74174
safe primes below 10,000,000: 30657
unsafe primes below 10,000,000: 633922
</pre>
 
=={{header|Shale}}==
<syntaxhighlight lang="shale">#!/usr/local/bin/shale
 
// Safe and unsafe primes.
//
// Safe prime p: (p - 1) / 2 is prime
// Unsafe prime: any prime that is not a safe prime
 
primes library
 
init dup var {
pl sieve type primes::()
10000000 0 pl generate primes::()
} =
 
isSafe dup var {
1 - 2 / pl isprime primes::()
} =
 
comma dup var {
n dup var swap =
t dup var n 1000 / =
b dup var n 1000 % =
 
t 0 == {
b print
} {
t.value comma() b ",%03d" printf
} if
} =
 
go dup var {
n var
c1 var
c10 var
i var
p var
 
"The first 35 safe primes are:" print
n 0 =
c1 0 =
c10 0 =
i 0 =
{ i count pl:: < } {
p i pl get primes::() =
p isSafe() {
n 35 < {
p " %d" printf
n++
n 35 == { "" println } ifthen
} ifthen
 
p 1000000 < { c1++ } ifthen
 
c10++
} ifthen
 
i++
} while
"Number of safe primes below 1,000,000 is " print c1.value comma() "" println
"Number of safe primes below 10,000,000 is " print c10.value comma() "" println
 
"The first 40 unsafe primes are:" print
n 0 =
c1 0 =
c10 0 =
i 0 =
{ i count pl:: < } {
p i pl get primes::() =
p isSafe() not {
n 40 < {
p " %d" printf
n++
n 40 == { "" println } ifthen
} ifthen
 
p 1000000 < { c1++ } ifthen
 
c10++
} ifthen
 
i++
} while
"Number of unsafe primes below 1,000,000 is " print c1.value comma() "" println
"Number of unsafe primes below 10,000,000 is " print c10.value comma() "" println
} =
 
init()
go()
</syntaxhighlight>
 
{{out}}
 
<pre>The first 35 safe primes are: 5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
Number of safe primes below 1,000,000 is 4,324
Number of safe primes below 10,000,000 is 30,657
The first 40 unsafe primes are: 2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
Number of unsafe primes below 1,000,000 is 74,174
Number of unsafe primes below 10,000,000 is 633,922
</pre>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func is_safeprime(p) {
is_prime(p) && is_prime((p-1)/2)
}
Line 1,714 ⟶ 2,856:
say ''
say "There are #{safeprime_count(1, 1e7)} safe-primes bellow 10^7"
say "There are #{unsafeprime_count(1, 1e7)} unsafe-primes bellow 10^7"</langsyntaxhighlight>
{{out}}
<pre>
Line 1,731 ⟶ 2,873:
 
=={{header|Simula}}==
<langsyntaxhighlight lang="simula">
BEGIN
 
Line 1,873 ⟶ 3,015:
 
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,895 ⟶ 3,037:
=={{header|Smalltalk}}==
{{works with|Smalltalk/X}}
<langsyntaxhighlight lang="smalltalk">[
| isSafePrime printFirstNElements |
Line 1,936 ⟶ 3,078:
Transcript showCR:nUnsaveBelow10M printStringWithThousandsSeparator.
]
] benchmark:'runtime: safe primes'</langsyntaxhighlight>
{{out}}
<pre>
Line 1,956 ⟶ 3,098:
But, who cares, these days ;-)
<br>3) time is on a 2012 MacBook 2.5Ghz i5; interpreted not jitted. Compiled/jitted time is 738ms.
 
=={{header|Swift}}==
<syntaxhighlight lang="swift">import Foundation
 
class PrimeSieve {
var composite: [Bool]
init(size: Int) {
composite = Array(repeating: false, count: size/2)
var p = 3
while p * p <= size {
if !composite[p/2 - 1] {
let inc = p * 2
var q = p * p
while q <= size {
composite[q/2 - 1] = true
q += inc
}
}
p += 2
}
}
func isPrime(number: Int) -> Bool {
if number < 2 {
return false
}
if (number & 1) == 0 {
return number == 2
}
return !composite[number/2 - 1]
}
}
 
func commatize(_ number: Int) -> String {
let n = NSNumber(value: number)
return NumberFormatter.localizedString(from: n, number: .decimal)
}
 
let limit1 = 1000000
let limit2 = 10000000
 
class PrimeInfo {
let maxPrint: Int
var count1: Int
var count2: Int
var primes: [Int]
init(maxPrint: Int) {
self.maxPrint = maxPrint
count1 = 0
count2 = 0
primes = []
}
func addPrime(prime: Int) {
count2 += 1
if prime < limit1 {
count1 += 1
}
if count2 <= maxPrint {
primes.append(prime)
}
}
func printInfo(name: String) {
print("First \(maxPrint) \(name) primes: \(primes)")
print("Number of \(name) primes below \(commatize(limit1)): \(commatize(count1))")
print("Number of \(name) primes below \(commatize(limit2)): \(commatize(count2))")
}
}
 
var safePrimes = PrimeInfo(maxPrint: 35)
var unsafePrimes = PrimeInfo(maxPrint: 40)
 
let sieve = PrimeSieve(size: limit2)
 
for prime in 2..<limit2 {
if sieve.isPrime(number: prime) {
if sieve.isPrime(number: (prime - 1)/2) {
safePrimes.addPrime(prime: prime)
} else {
unsafePrimes.addPrime(prime: prime)
}
}
}
 
safePrimes.printInfo(name: "safe")
unsafePrimes.printInfo(name: "unsafe")</syntaxhighlight>
 
{{out}}
<pre>
First 35 safe primes: [5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479, 503, 563, 587, 719, 839, 863, 887, 983, 1019, 1187, 1283, 1307, 1319, 1367, 1439, 1487, 1523, 1619]
Number of safe primes below 1,000,000: 4,324
Number of safe primes below 10,000,000: 30,657
First 40 unsafe primes: [2, 3, 13, 17, 19, 29, 31, 37, 41, 43, 53, 61, 67, 71, 73, 79, 89, 97, 101, 103, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 173, 181, 191, 193, 197, 199, 211, 223, 229, 233]
Number of unsafe primes below 1,000,000: 74,174
Number of unsafe primes below 10,000,000: 633,922
</pre>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}Dependent on using .NET Core 2.1 or 2.0, or .NET Framework 4.7.2
<langsyntaxhighlight lang="vbnet">Imports System.Console
 
Namespace safety
Line 1,992 ⟶ 3,233:
End Function
End Module
End Namespace</langsyntaxhighlight>
If not using the latest version of the '''System.Linq''' namespace, you can implement the ''Enumerable.ToHashSet()'' method by adding <langsyntaxhighlight lang="vbnet">Imports System.Runtime.CompilerServices</langsyntaxhighlight> to the top and this module inside the '''safety''' namespace:<langsyntaxhighlight lang="vbnet"> Module Extensions
<Extension()>
Function ToHashSet(Of T)(ByVal src As IEnumerable(Of T), ByVal Optional _
Line 1,999 ⟶ 3,240:
Return New HashSet(Of T)(src, IECmp)
End Function
End Module</langsyntaxhighlight>
{{out}}
<pre>The first 35 safe primes are:
Line 2,007 ⟶ 3,248:
Of the primes below 1,000,000: 4,324 are safe, and 74,174 are unsafe.
Of the primes below 10,000,000: 30,657 are safe, and 633,922 are unsafe.
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-math}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./math" for Int
import "./fmt" for Fmt
 
var c = Int.primeSieve(1e7, false) // need primes up to 10 million here
var safe = List.filled(35, 0)
var count = 0
var i = 3
while (count < 35) {
if (!c[i] && !c[(i-1)/2]) {
safe[count] = i
count = count + 1
}
i = i + 2
}
System.print("The first 35 safe primes are:\n%(safe.join(" "))\n")
 
count = 35
while (i < 1e6) {
if (!c[i] && !c[(i-1)/2]) count = count + 1
i = i + 2
}
Fmt.print("The number of safe primes below 1,000,000 is $,d.\n", count)
 
while (i < 1e7) {
if (!c[i] && !c[(i-1)/2]) count = count + 1
i = i + 2
}
Fmt.print("The number of safe primes below 10,000,000 is $,d.\n", count)
 
var unsafe = List.filled(40, 0)
unsafe[0] = 2
count = 1
i = 3
while (count < 40) {
if (!c[i] && c[(i-1)/2]) {
unsafe[count] = i
count = count + 1
}
i = i + 2
}
System.print("The first 40 unsafe primes are:\n%(unsafe.join(" "))\n")
 
count = 40
while (i < 1e6) {
if (!c[i] && c[(i-1)/2]) count = count + 1
i = i + 2
}
Fmt.print("The number of unsafe primes below 1,000,000 is $,d.\n", count)
 
while (i < 1e7) {
if (!c[i] && c[(i-1)/2]) count = count + 1
i = i + 2
}
Fmt.print("The number of unsafe primes below 10,000,000 is $,d.\n", count)</syntaxhighlight>
 
{{out}}
<pre>
The first 35 safe primes are:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1019 1187 1283 1307 1319 1367 1439 1487 1523 1619
 
The number of safe primes below 1,000,000 is 4,324.
 
The number of safe primes below 10,000,000 is 30,657.
 
The first 40 unsafe primes are:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
 
The number of unsafe primes below 1,000,000 is 74,174.
 
The number of unsafe primes below 10,000,000 is 633,922.
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">proc NumOut(Num); \Output positive integer with commas
int Num, Dig, Cnt;
[Cnt:= [0];
Num:= Num/10;
Dig:= rem(0);
Cnt(0):= Cnt(0)+1;
if Num then NumOut(Num);
Cnt(0):= Cnt(0)-1;
ChOut(0, Dig+^0);
if rem(Cnt(0)/3)=0 & Cnt(0) then ChOut(0, ^,);
];
 
func IsPrime(N); \Return 'true' if N is prime
int N, I;
[if N <= 2 then return N = 2;
if (N&1) = 0 then \even >2\ return false;
for I:= 3 to sqrt(N) do
[if rem(N/I) = 0 then return false;
I:= I+1;
];
return true;
];
 
int N, SafeCnt, UnsafeCnt Unsafes(40);
[SafeCnt:= 0; UnsafeCnt:= 0;
Text(0, "First 35 safe primes:^M^J");
for N:= 1 to 10_000_000-1 do
[if IsPrime(N) then
[if IsPrime( (N-1)/2 ) then
[SafeCnt:= SafeCnt+1;
if SafeCnt <= 35 then
[NumOut(N); ChOut(0, ^ )];
]
else
[Unsafes(UnsafeCnt):= N;
UnsafeCnt:= UnsafeCnt+1;
];
];
if N = 999_999 then
[Text(0, "^M^JSafe primes below 1,000,000: ");
NumOut(SafeCnt);
Text(0, "^M^JUnsafe primes below 1,000,000: ");
NumOut(UnsafeCnt);
];
];
Text(0, "^M^JFirst 40 unsafe primes:^M^J");
for N:= 0 to 40-1 do
[NumOut(Unsafes(N)); ChOut(0, ^ )];
Text(0, "^M^JSafe primes below 10,000,000: ");
NumOut(SafeCnt);
Text(0, "^M^JUnsafe primes below 10,000,000: ");
NumOut(UnsafeCnt);
CrLf(0);
]</syntaxhighlight>
 
{{out}}
<pre>
First 35 safe primes:
5 7 11 23 47 59 83 107 167 179 227 263 347 359 383 467 479 503 563 587 719 839 863 887 983 1,019 1,187 1,283 1,307 1,319 1,367 1,439 1,487 1,523 1,619
Safe primes below 1,000,000: 4,324
Unsafe primes below 1,000,000: 74,174
First 40 unsafe primes:
2 3 13 17 19 29 31 37 41 43 53 61 67 71 73 79 89 97 101 103 109 113 127 131 137 139 149 151 157 163 173 181 191 193 197 199 211 223 229 233
Safe primes below 10,000,000: 30,657
Unsafe primes below 10,000,000: 633,922
</pre>
 
Line 2,014 ⟶ 3,398:
 
[[Extensible prime generator#zkl]] could be used instead.
<langsyntaxhighlight lang="zkl">var [const] BI=Import("zklBigNum"); // libGMP
// saving 664,578 primes (vs generating them on the fly) seems a bit overkill
 
Line 2,027 ⟶ 3,411:
println("The first %d safe primes are: %s".fmt(sN,safe[0,sN].concat(",")));
println("The first %d unsafe primes are: %s".fmt(nsN,notSafe[0,nsN].concat(",")));
}(35,40);</langsyntaxhighlight>
{{out}}
<pre>
Line 2,034 ⟶ 3,418:
</pre>
safetyList could also be written as:
<langsyntaxhighlight lang="zkl">println("The first %d safe primes are: %s".fmt(N:=35,
Walker(BI(1).nextPrime) // gyrate (vs Walker.filter) because p mutates
.pump(N,String,safePrime,Void.Filter,String.fp1(","))));
println("The first %d unsafe primes are: %s".fmt(N=40,
Walker(BI(1).nextPrime) // or save as List
.pump(N,List,safePrime,'==(False),Void.Filter,"toInt").concat(",")));</langsyntaxhighlight>
Time to count:
<langsyntaxhighlight lang="zkl">fcn safetyCount(N,s=0,ns=0,p=BI(2)){
do{
if(safePrime(p)) s+=1; else ns+=1;
Line 2,053 ⟶ 3,437:
s,ns,p := safetyCount(1_000_000);
println();
safetyCount(10_000_000,s,ns,p);</langsyntaxhighlight>
{{out}}
<pre>
1,983

edits