Sequence of primes by trial division: Difference between revisions

m
(→‎{{header|Ada}}: move here ATS entry from Sieve of Eratosthenes task)
m (→‎{{header|Wren}}: Minor tidy)
 
(188 intermediate revisions by 76 users not shown)
Line 1:
{{task|Prime Numbers}}Generate a sequence of primes by means of trial division.
 
;Task:
Trial division is an algorithm where a candidate number is tested for being a prime by trying to divide it by other numbers. You may use primes, or any numbers of your choosing, as long as the result is indeed a sequence of primes.
Generate a sequence of primes by means of trial division.
 
The sequence may be bounded (i.e. up to some limit), unbounded, starting from the start (i.e. 2) or above some given value. Organize your function as you wish, in particular, it might resemble a filtering operation, or a sieving operation. If you want to use a ready-made <code>is_prime</code> function, use one from the [[Primality by trial division]] page (i.e., add yours there if it isn't there already).
 
Trial division is an algorithm where a candidate number is tested for being a prime by trying to divide it by other numbers.
* Closely related to: [[Primality by trial division]], [[Sieve of Eratosthenes]].
 
You may use primes, or any numbers of your choosing, as long as the result is indeed a sequence of primes.
 
The sequence may be bounded (i.e. up to some limit), unbounded, starting from the start (i.e. 2) or above some given value.
 
Organize your function as you wish, in particular, it might resemble a filtering operation, or a sieving operation.
 
If you want to use a ready-made <code>is_prime</code> function, use one from the [[Primality by trial division]] page (i.e., add yours there if it isn't there already).
 
 
;Related tasks:
* &nbsp; [[count in factors]]
* &nbsp; [[prime decomposition]]
* &nbsp; [[factors of an integer]]
* &nbsp; [[Sieve of Eratosthenes]]
* &nbsp; [[primality by trial division]]
* &nbsp; [[factors of a Mersenne number]]
* &nbsp; [[trial factoring of a Mersenne number]]
* &nbsp; [[partition an integer X into N primes]]
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F prime(a)
R !(a < 2 | any((2 .. Int(a ^ 0.5)).map(x -> @a % x == 0)))
 
F primes_below(n)
R (0 .< n).filter(i -> prime(i))
 
print(primes_below(100))</syntaxhighlight>
 
{{out}}
<pre>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">BYTE FUNC IsPrime(CARD a)
CARD i
 
IF a<=1 THEN
RETURN (0)
FI
FOR i=2 TO a/2
DO
IF a MOD i=0 THEN
RETURN (0)
FI
OD
RETURN (1)
 
PROC PrintPrimes(CARD begin,end)
BYTE notFirst
CARD i
 
notFirst=0
FOR i=begin TO end
DO
IF IsPrime(i) THEN
IF notFirst THEN
Print(", ")
FI
notFirst=1
PrintC(i)
FI
OD
RETURN
 
PROC Main()
CARD begin=[2000],end=[3000]
PrintF("Primes in range [%U..%U]:%E",begin,end)
PrintPrimes(begin,end)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Sequence_of_primes_by_trial_division.png Screenshot from Atari 8-bit computer]
<pre>
Primes in range [2000..3000]:
2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137,
2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293,
2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609,
2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879,
2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999
</pre>
 
=={{header|Ada}}==
Line 11 ⟶ 99:
Use the generic function Prime_Numbers.Is_Prime, as specified in [[Prime decomposition#Ada]]. The program reads two numbers A and B from the command line and prints all primes between A and B (inclusive).
 
<langsyntaxhighlight Adalang="ada">with Prime_Numbers, Ada.Text_IO, Ada.Command_Line;
 
procedure Sequence_Of_Primes is
Line 28 ⟶ 116:
end if;
end loop;
end Sequence_Of_Primes;</langsyntaxhighlight>
 
{{out}}
<pre>>./sequence_of_primes 50 99
53 59 61 67 71 73 79 83 89 97</pre>
 
=={{header|ALGOL 68}}==
Simple bounded sequence using the "is prime" routine from [[Primality by trial division#ALGOL 68]]
<syntaxhighlight lang="algol68"># is prime PROC from the primality by trial division task #
MODE ISPRIMEINT = INT;
PROC is prime = ( ISPRIMEINT p )BOOL:
IF p <= 1 OR ( NOT ODD p AND p/= 2) THEN
FALSE
ELSE
BOOL prime := TRUE;
FOR i FROM 3 BY 2 TO ENTIER sqrt(p)
WHILE prime := p MOD i /= 0 DO SKIP OD;
prime
FI;
# end of code from the primality by trial division task #
 
# returns an array of n primes >= start #
PROC prime sequence = ( INT start, INT n )[]INT:
BEGIN
[ n ]INT seq;
INT prime count := 0;
FOR p FROM start WHILE prime count < n DO
IF is prime( p ) THEN
prime count +:= 1;
seq[ prime count ] := p
FI
OD;
seq
END; # prime sequence #
 
# find 20 primes >= 30 #
[]INT primes = prime sequence( 30, 20 );
print( ( "20 primes starting at 30: " ) );
FOR p FROM LWB primes TO UPB primes DO
print( ( " ", whole( primes[ p ], 0 ) ) )
OD;
print( ( newline ) )</syntaxhighlight>
{{out}}
<pre>
20 primes starting at 30: 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
</pre>
 
=={{header|ALGOL W}}==
Uses the ALGOL W isPrime procedure from the Primality by Trial Division task.
<syntaxhighlight lang="algolw">begin
% use the isPrime procedure from the Primality by Trial Division task %
logical procedure isPrime ( integer value n ) ; algol "isPrime" ;
% sets the elements of p to the first n primes. p must have bounds 1 :: n %
procedure getPrimes ( integer array p ( * )
; integer value n
) ;
if n > 0 then begin
% have room for at least oe prime %
integer pPos, possiblePrime;
p( 1 ) := 2;
pPos := 2;
possiblePrime := 3;
while pPos <= n do begin
if isPrime( possiblePrime ) then begin
p( pPos ) := possiblePrime;
pPos := pPos + 1;
end;
possiblePrime := possiblePrime + 1
end
end getPrimes ;
 
begin % test getPrimes %
integer array p( 1 :: 100 );
getPrimes( p, 100 );
for i := 1 until 100 do begin
if i rem 20 = 1 then write( i_w := 4, s_w := 1, p( i ) )
else writeon( i_w := 4, s_w := 1, p( i ) )
end for_i
end
 
end.</syntaxhighlight>
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541
</pre>
 
=={{header|ALGOL-M}}==
The approach here follows an example given by Edsger Dijkstra in his classic 1969 paper, Notes on Structured Programming. Only odd numbers above 2 are checked for primality, and only the prime numbers previously found (up to the square root of the number under examination) are tested as divisors.
<syntaxhighlight lang="algol">
BEGIN
 
INTEGER I, K, M, N, S, NPRIMES, DIVISIBLE, FALSE, TRUE;
 
COMMENT COMPUTE P MOD Q;
INTEGER FUNCTION MOD (P, Q);
INTEGER P, Q;
BEGIN
MOD := P - Q * (P / Q);
END;
 
COMMENT MAIN PROGRAM BEGINS HERE;
 
WRITE ("HOW MANY PRIMES DO YOU WANT TO GENERATE?");
READ (NPRIMES);
BEGIN
INTEGER ARRAY P[1:NPRIMES];
FALSE := 0;
TRUE := -1;
 
% INITIALIZE P WITH FIRST (AND ONLY EVEN) PRIME NUMBER %
P[1] := 2;
WRITE (1, ":", P[1]);
 
I := 1; % COUNT OF PRIME NUMBERS FOUND SO FAR %
K := 1; % INDEX OF LARGEST PRIME <= SQRT OF N %
N := 3; % CURRENT NUMBER BEING CHECKED %
WHILE I < NPRIMES DO
BEGIN
S := P[K] * P[K];
IF S <= N THEN K := K + 1;
DIVISIBLE := FALSE;
M := 2; % INDEX OF POSSIBLE DIVISORS (EXCLUDING 2) %
WHILE M <= K AND DIVISIBLE = FALSE DO
BEGIN
IF MOD(N, P[M]) = 0 THEN DIVISIBLE := TRUE;
M := M + 1;
END;
IF DIVISIBLE = FALSE THEN
BEGIN
I := I + 1;
P[I] := N;
WRITE (I, ":", N);
END;
N := N + 2;
END;
END;
 
END
</syntaxhighlight>
 
{{out}}
<pre>
HOW MANY PRIMES DO YOU WANT TO GENERATE?
-> 10
1: 2
2: 3
3: 5
4: 7
5: 11
6: 13
7: 17
8: 19
9: 23
10: 29
</pre>
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program trialprime.s */
 
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language ARM assembly*/
.include "../constantes.inc"
 
//.include "../../ficmacros32.inc" @ for debugging developper
/************************************/
/* Initialized data */
/************************************/
.data
szMessPrime: .asciz " is prime.\n"
szMessNotPrime: .asciz " is not prime.\n"
szCarriageReturn: .asciz "\n"
szMessStart: .asciz "Program 32 bits start.\n"
/************************************/
/* UnInitialized data */
/************************************/
.bss
sZoneConv: .skip 24
/************************************/
/* code section */
/************************************/
.text
.global main
main: @ entry of program
ldr r0,iAdrszMessStart
bl affichageMess
ldr r4,iStart @ start number
ldr r5,iLimit @ end number
tst r4,#1
addeq r4,#1
1:
mov r0,r4
ldr r1,iAdrsZoneConv
bl conversion10 @ decimal conversion
ldr r0,iAdrsZoneConv
bl affichageMess
mov r0,r4
bl isPrime
cmp r0,#0
beq 2f
ldr r0,iAdrszMessPrime
bl affichageMess
b 3f
2:
ldr r0,iAdrszMessNotPrime
bl affichageMess
3:
add r4,r4,#2
cmp r4,r5
blt 1b
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
swi 0 @ perform the system call
iAdrsZoneConv: .int sZoneConv
iAdrszMessPrime: .int szMessPrime
iAdrszMessNotPrime: .int szMessNotPrime
iAdrszCarriageReturn: .int szCarriageReturn
iAdrszMessStart: .int szMessStart
iStart: .int 4000000000
iLimit: .int 4000000020
/******************************************************************/
/* test if number is prime */
/******************************************************************/
/* r0 contains the number */
/* r0 return 1 if prime else return 0 */
isPrime:
push {r4,lr} @ save registers
cmp r0,#1 @ <= 1 ?
movls r0,#0 @ not prime
bls 100f
cmp r0,#3 @ 2 and 3 prime
movls r0,#1
bls 100f
tst r0,#1 @ even ?
moveq r0,#0 @ not prime
beq 100f
mov r4,r0 @ save number
mov r1,#3 @ first divisor
1:
mov r0,r4 @ number
bl division
add r1,r1,#2 @ increment divisor
cmp r3,#0 @ remainder = zero ?
moveq r0,#0 @ not prime
beq 100f
cmp r1,r2 @ divisors<=quotient ?
ble 1b @ loop
mov r0,#1 @ return prime
 
100:
pop {r4,pc} @ restaur registers
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language ARM assembly*/
.include "../affichage.inc"
</syntaxhighlight>
{{Out}}
<pre>
Program 32 bits start.
4000000001 is not prime.
4000000003 is not prime.
4000000005 is not prime.
4000000007 is prime.
4000000009 is prime.
4000000011 is not prime.
4000000013 is not prime.
4000000015 is not prime.
4000000017 is not prime.
4000000019 is prime.
</pre>
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">getPrimes: function [upto][
result: new [2]
loop range.step:2 3 upto 'x [
divisible: false
loop 2..inc x/2 'z [
if zero? x%z ->
divisible: true
]
if not? divisible ->
'result ++ x
]
return result
]
 
print getPrimes 100</syntaxhighlight>
 
{{out}}
 
<pre>2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97</pre>
 
=={{header|AsciiDots}}==
Program to generate all prime numbers up to the input (inclusive). This implementation is very inefficient currently since the primality test checks every number from 2 to N rather than checking up to the square root, excluding even numbers from the factor checks, etc.
<syntaxhighlight lang="asciidots">
``warps
%$ABCPR
 
``outputs all primes up to and including the input
.-#?-A
B-P/$_#$_" "
R-*~
\/
 
``primality test
/---------------*-\
//-----------{*}*~-+\
///--#1--\ /#1>/ \/ ||
\\*/#2>*-\-~#0*>R ||
/*>*+--++{%}/ \+>C || ``signal to C triggers next number
|\--/>-/| || || ``to be input from for loop
| /-~*--+-------^| ||
| |[<]\ | */ ||
| \-* | | | /--+/
|/-[+]|[*]------+-<1#*
|\1#* \-+-------+----/
| ~---* ^--\
| \---/ | |
\------\ | |
/-----~\ /-----~#0/
P*#2{<}/\-*#2{=}/ ``hardcode <=1 and 2
\---/ \---/
 
``for loop
``only outputs next number once C receives any input
.-\C#1-*--\ /--B
# /-{+}-+-*--\
1 | /---+----~
*->-*\ \---\|
A{+}>*{-}*-{>}+/
//| \#0/ |
\{*}-------/
</syntaxhighlight>
 
{{out}}
Output shown for input of 100
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
=={{header|ATS}}==
<syntaxhighlight lang="ats">(*
<lang ATS>(*
// Lazy-evaluation:
// sieve for primes
Line 104 ⟶ 536:
end // end of [main0]
 
(* ****** ****** *)</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f SEQUENCE_OF_PRIMES_BY_TRIAL_DIVISION.AWK
BEGIN {
low = 1
high = 100
for (i=low; i<=high; i++) {
if (is_prime(i) == 1) {
printf("%d ",i)
count++
}
}
printf("\n%d prime numbers found in range %d-%d\n",count,low,high)
exit(0)
}
function is_prime(x, i) {
if (x <= 1) {
return(0)
}
for (i=2; i<=int(sqrt(x)); i++) {
if (x % i == 0) {
return(0)
}
}
return(1)
}
</syntaxhighlight>
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
25 prime numbers found in range 1-100
</pre>
 
=={{header|BASIC256}}==
<syntaxhighlight lang="freebasic">function isPrime(v)
if v < 2 then return False
if v mod 2 = 0 then return v = 2
if v mod 3 = 0 then return v = 3
d = 5
while d * d <= v
if v mod d = 0 then return False else d += 2
end while
return True
end function
 
for i = 101 to 999
if isPrime(i) then print string(i); " ";
next i
end</syntaxhighlight>
{{out}}
<pre>Igual que la entrada de FreeBASIC.</pre>
 
=={{header|Batch File}}==
<syntaxhighlight lang="batch file">
@echo off
::Prime list using trial division
:: Unbounded (well, up to 2^31-1, but you'll kill it before :)
:: skips factors of 2 and 3 in candidates and in divisors
:: uses integer square root to find max divisor to test
:: outputs numbers in rows of 10 right aligned primes
setlocal enabledelayedexpansion
 
cls
echo prime list
set lin= 0:
set /a num=1, inc1=4, cnt=0
call :line 2
call :line 3
 
 
:nxtcand
set /a num+=inc1, inc1=6-inc1,div=1, inc2=4
call :sqrt2 %num% & set maxdiv=!errorlevel!
 
:nxtdiv
set /a div+=inc2, inc2=6-inc2, res=(num%%div)
if %div% gtr !maxdiv! call :line %num% & goto nxtcand
if %res% equ 0 (goto :nxtcand ) else ( goto nxtdiv)
 
:sqrt2 [num] calculates integer square root
if %1 leq 0 exit /b 0
set /A "x=%1/(11*1024)+40, x=(%1/x+x)>>1, x=(%1/x+x)>>1, x=(%1/x+x)>>1, x=(%1/x+x)>>1, x=(%1/x+x)>>1, x+=(%1-x*x)>>31,sq=x*x
if sq gtr %1 set x-=1
exit /b !x!
goto:eof
 
:line formats output in 10 right aligned columns
set num1= %1
set lin=!lin!%num1:~-7%
set /a cnt+=1,res1=(cnt%%10)
if %res1% neq 0 goto:eof
echo %lin%
set cnt1= !cnt!
set lin=!cnt1:~-5!:
goto:eof
</syntaxhighlight>
{{Out}}
<pre>
prime list
0: 2 3 5 7 11 13 17 19 23 29
10: 31 37 41 43 47 53 59 61 67 71
20: 73 79 83 89 97 101 103 107 109 113
30: 127 131 137 139 149 151 157 163 167 173
40: 179 181 191 193 197 199 211 223 227 229
50: 233 239 241 251 257 263 269 271 277 281
60: 283 293 307 311 313 317 331 337 347 349
70: 353 359 367 373 379 383 389 397 401 409
80: 419 421 431 433 439 443 449 457 461 463
90: 467 479 487 491 499 503 509 521 523 541
100: 547 557 563 569 571 577 587 593 599 601
110: 607 613 617 619 631 641 643 647 653 659
120: 661 673 677 683 691 701 709 719 727 733
130: 739 743 751 757 761 769 773 787 797 809
140: 811 821 823 827 829 839 853 857 859 863
150: 877 881 883 887 907 911 919 929 937 941
160: 947 953 967 971 977 983 991 997 1009 1013
170: 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069
180: 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151
190: 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223
200: 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291
210: 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373
220: 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451
230: 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511
240: 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583
250: 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657
260: 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733
270: 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811
280: 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889
</pre>
 
=={{header|bc}}==
<syntaxhighlight lang="bc">l = 100
 
a[0] = 2
a[o = 1] = 3
for (n = 5; n < l; n += 2) {
for (i = 1; n % (p = a[i]) != 0; ++i) {
if (p * p > n) {
a[++o] = n
break
}
}
}
 
for (i = 0; i <= o; ++i) a[i]</syntaxhighlight>
 
=={{header|Befunge}}==
Based on the test in the [[Primality_by_trial_division#Befunge|Primality by trial division]] task, this list all primes between 2 and 1,000,000.
 
<syntaxhighlight lang="befunge">2>:::"}"8*:*>`#@_48*:**2v
v_v#`\*:%*:*84\/*:*84::+<
v#>::48*:*/\48*:*%%!#v_1^
<^+1$_.#<5#<5#<+#<,#<<0:\</syntaxhighlight>
 
{{out}}
<pre>2
3
5
7
11
13
.
.
.
999931
999953
999959
999961
999979
999983</pre>
 
=={{header|C}}==
<syntaxhighlight lang="c">
#include<stdio.h>
 
int isPrime(unsigned int n)
{
unsigned int num;
if ( n < 2||!(n & 1))
return n == 2;
 
for (num = 3; num <= n/num; num += 2)
if (!(n % num))
return 0;
return 1;
}
 
int main()
{
unsigned int l,u,i,sum=0;
printf("Enter lower and upper bounds: ");
scanf("%ld%ld",&l,&u);
for(i=l;i<=u;i++){
if(isPrime(i)==1)
{
printf("\n%ld",i);
sum++;
}
}
printf("\n\nPrime numbers found in [%ld,%ld] : %ld",l,u,sum);
return 0;
}
</syntaxhighlight>
Output :
<pre>
Enter lower and upper bounds: 1 100
 
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
 
Prime numbers found in [1,100] : 25
</pre>
 
=={{header|C sharp}}==
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using System.Linq;
 
public class Program
{
static void Main() {
Console.WriteLine(string.Join(" ", Primes(100)));
}
 
static IEnumerable<int> Primes(int limit) => Enumerable.Range(2, limit-1).Where(IsPrime);
static bool IsPrime(int n) => Enumerable.Range(2, (int)Math.Sqrt(n)-1).All(i => n % i != 0);
}</syntaxhighlight>
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">
#include <math.h>
#include <iostream>
#include <iomanip>
 
bool isPrime( unsigned u ) {
if( u < 4 ) return u > 1;
if( /*!( u % 2 ) ||*/ !( u % 3 ) ) return false;
 
unsigned q = static_cast<unsigned>( sqrt( static_cast<long double>( u ) ) ),
c = 5;
while( c <= q ) {
if( !( u % c ) || !( u % ( c + 2 ) ) ) return false;
c += 6;
}
return true;
}
int main( int argc, char* argv[] )
{
unsigned mx = 100000000,
wid = static_cast<unsigned>( log10( static_cast<long double>( mx ) ) ) + 1;
 
std::cout << "[" << std::setw( wid ) << 2 << " ";
unsigned u = 3, p = 1; // <- start computing from 3
while( u < mx ) {
if( isPrime( u ) ) { std::cout << std::setw( wid ) << u << " "; p++; }
u += 2;
}
std::cout << "]\n\n Found " << p << " primes.\n\n";
return 0;
}
</syntaxhighlight>
{{out}}
<pre>
[ 2 3 5 7 11 13 17 19
23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89
97 ...
 
</pre>
 
=={{header|Clojure}}==
<syntaxhighlight lang="lisp">(ns test-p.core
(:require [clojure.math.numeric-tower :as math]))
 
(defn prime? [a]
" Uses trial division to determine if number is prime "
(or (= a 2)
(and (> a 2)
(> (mod a 2) 0)
(not (some #(= 0 (mod a %))
(range 3 (inc (int (Math/ceil (math/sqrt a)))) 2))))))
; 3 to sqrt(a) stepping by 2
 
(defn primes-below [n]
" Finds primes below number n "
(for [a (range 2 (inc n))
:when (prime? a)]
a))
 
(println (primes-below 100))</syntaxhighlight>
 
{{Output}}
<pre>(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</pre>
 
=={{header|Common Lisp}}==
<syntaxhighlight lang="lisp">(defun primes-up-to (max-number)
"Compute all primes up to MAX-NUMBER using trial division"
(loop for n from 2 upto max-number
when (notany (evenly-divides n) primes)
collect n into primes
finally (return primes)))
(defun evenly-divides (n)
"Create a function that checks whether its input divides N evenly"
(lambda (x) (integerp (/ n x))))
(print (primes-up-to 100))</syntaxhighlight>
 
Output: <pre>(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</pre>
 
=={{header|Crystal}}==
See https://rosettacode.org/wiki/Primality_by_trial_division#Crystal
<syntaxhighlight lang="ruby">require "big"
 
def primep5?(n) # P5 Prime Generator primality test
# P5 = 30*k + {7,11,13,17,19,23,29,31} # P5 primes candidates sequence
n = n.to_big_i
return [2, 3, 5].includes?(n) if n < 7 # for small and negative values
return false if n.gcd(30) != 1 # 4/15 (8/30) of integers are P5 pc
p = typeof(n).new(7) # first P5 sequence value
until p*p > n
return false if # if n is composite
n % (p) == 0 || n % (p+4) == 0 || n % (p+6) == 0 || n % (p+10) == 0 ||
n % (p+12) == 0 || n % (p+16) == 0 || n % (p+22) == 0 || n % (p+24) == 0
p += 30 # first prime candidate for next kth residues group
end
true
end
 
# Create sequence of primes from 1_000_000_001 to 1_000_000_201
n = 1_000_000_001; n.step(to: n+200, by: 2) { |p| puts p if primep5?(p) }</syntaxhighlight>
{{out}}
<pre>1000000007
1000000009
1000000021
1000000033
1000000087
1000000093
1000000097
1000000103
1000000123
1000000181</pre>
 
=={{header|D}}==
{{trans|Haskell}}
This is a quite inefficient prime generator.
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.algorithm, std.traits,
std.numeric, std.concurrency;
 
Line 131 ⟶ 938:
.take(20)
.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]</pre>
 
=={{header|Delphi}}==
See [https://rosettacode.org/wiki/Sequence_of_primes_by_trial_division#Pascal Pascal].
 
=={{header|EasyLang}}==
<syntaxhighlight lang="easylang">
func prime n .
if n mod 2 = 0 and n > 2
return 0
.
i = 3
while i <= sqrt n
if n mod i = 0
return 0
.
i += 2
.
return 1
.
proc primeSequ first last . sequ[] .
for i = first to last
if prime i = 1
sequ[] &= i
.
.
.
primeSequ 2 100 seq[]
print seq[]
</syntaxhighlight>
 
=={{header|EchoLisp}}==
===Trial division===
<syntaxhighlight lang="scheme">(lib 'sequences)
(define (is-prime? p)
(cond
[(< p 2) #f]
[(zero? (modulo p 2)) (= p 2)]
[else
(for/and ((d [3 5 .. (1+ (sqrt p))] )) (!zero? (modulo p d)))]))
 
(is-prime? 101) → #t </syntaxhighlight>
 
===Bounded - List filter ===
<syntaxhighlight lang="scheme">(filter is-prime? (range 1 100))
→ (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</syntaxhighlight>
 
=== Unbounded - Sequence filter ===
<syntaxhighlight lang="scheme">(define f-primes (filter is-prime? [2 .. ]))
→ # 👓 filter: #sequence [2 3 .. Infinity[
 
(take f-primes 25)
→ (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</syntaxhighlight>
 
=== Unbounded - Stream ===
<syntaxhighlight lang="scheme">(define (s-next-prime n) ;; n odd
(for ((p [n (+ n 2) .. ] ))
#:break (is-prime? p) => (cons p (+ p 2))))
 
(define s-primes (stream-cons 2 (make-stream s-next-prime 3)))
 
 
(take s-primes 25)
→ (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</syntaxhighlight>
 
=== Unbounded - Generator ===
<syntaxhighlight lang="scheme">(define (g-next-prime n)
(define next
(for ((p [n .. ] )) #:break (is-prime? p) => p ))
(yield next)
(1+ next))
 
(define g-primes (make-generator g-next-prime 2))
 
(take g-primes 25)
→ (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)</syntaxhighlight>
 
=== Unbounded - Background task ===
<syntaxhighlight lang="scheme">(lib 'tasks)
(lib 'bigint)
 
(define (t-next-prime n)
(define next
(for ((p [n .. ] )) #:break (is-prime? p) => p ))
(writeln next) ;; or whatever action here
(1+ next)) ;; unbounded : return #f to stop or CTRL-C
 
(define t-primes (make-task t-next-prime 1_000_000_000_000))
 
(task-run t-primes)
→ #task:id:95:running
1000000000039
1000000000061
1000000000063
1000000000091
1000000000121
1000000000163
*stopped*</syntaxhighlight>
 
=={{header|EDSAC order code}}==
To save time, the program omits multiples of 2 and 3, and tests 5, 7, 11, 13, ..., the increments being alternately 2 and 4. Division is done implicitly by using wheels. The program stores possible prime divisors in a list, whose size can be edited. If a prime is found, and the list isn't yet full, the prime is added to the list.
 
Initially, no wheels are active. When the number under test reaches the "milestone" 5^2, the wheel for 5 is activated, and the milestone is updated to 7^2. When that is reached, the wheel for 7 is activated, and the milestone is updated to 11^2; and so on.
 
In the program as posted, the list of possible divisors holds 30 primes, from 5 to 131. The program finds primes less than 131^2 = 17161, the largest being 17159. Assuming 650 orders per second, this would have taken the original EDSAC about an hour.
<syntaxhighlight lang="edsac">
[List of primes by trial division, for Rosetta Code website.]
[EDSAC program, Initial Orders 2.]
[Division is done implicitly by the use of wheels.
One wheel for each possible prime divisor, up to an editable limit.]
 
T51K [G parameter: print subroutine, 54 locations.]
P56F [must be even address]
T47K [M parameter: main routine.]
P110F [must be even address]
 
[============================= M parameter ===============================]
E25KTM
GK
[35-bit values. First clear them completely.
This is done to ensure that the middle bit ("sandwich digit") is zero.]
T#ZPF T2#ZPF T4#ZPF T6#ZPF T8#ZPF
[Back to normal loading]
TZ
[0] PDPF [number under test; initially to 1, pre-inc'd to 5]
[2] P1FPF [increment, alternately 2 and 4]
[4] P12DPF ['milestone', square of prime; initially 25]
[6] PDPF [constant 1]
[8] P3FPF [constant 6]
[17-bit values]
[10] P30F [*EDIT HERE* Number of primes to store (in address field)]
[11] PF [flag < 0 if number is prime; 0 if factor is found]
[12] #F [figure shift]
[13] @F [carriage return]
[14] &F [line feed]
[15] K4096F [null char]
[16] A112@ [A order for list{0}]
[17] T112@ [T order for list{0}]
[18] AF [limit of A order for testing primes]
[19] AF [limit of A order for loading wheels]
[20] TF [limit of T order for storing primes]
[21] O1F [subtract from T order to make A order for previous address]
[22] W1F [add to T order to make U order for next address]
[23] OF [add to A order to make T order for same address]
[24] P2F [to inc an address by 2]
 
[Enter with acc = 0]
[25] O12@ [set teleprinter to figures]
[Set limits for list of trial prime divisors.
The list contains wheels and negatives of primes, thus:
wheel for 5; -5; wheel for 7; -7; wheel for 11; -11; etc]
A10@ [number of items in prime list]
LD [times 2 words per item (wheel + prime)]
A17@ [add T order for list{0}]
U20@ [store T order for exclusive end of wheels]
S21@ [make A order for inclusive end of primes]
T19@ [store it]
A16@ [load A order for start of lise]
U18@ [store as exclusive end of active wheels]
A2F [inc address, exclusive end of active primes]
T100@ [plant in code]
A17@ [load T order to store first wheel]
T89@ [plant in code]
[Main loop: update increment, alternately 2 and 4]
[Assume acc = 0;]
[38] A8#@ [load 6]
S2#@ [subtract incremet]
T2#@ [store new increment]
[First priority: keep the wheels turning]
A16@ [load order that loads first wheel]
U11@ [set prime flag (any negative value will do)]
[43] U49@ [plant order in code]
S18@ [more wheels to test?]
E66@ [if not, jump with acc = 0]
A18@ [restore after test]
A23@ [make order to store wheel]
T62@ [plant in code]
[49] AF [load wheel]
A2@ [apply current inc as 17-bit 2 or 4]
G62@ [if wheel still < 0, just store updated value]
T1F [wheel >= 0, save in 1F]
S1F [wheel = 0?]
G56@ [no, skip next order]
T11@ [yes, so prime flag := 0]
[56] TF [clear acc]
A49@ [make A order for negative of prime]
A2F
T61@ [plant in code]
A1F [load wheel again]
[61] AF [add negative of prime to set wheel < 0]
[62] TF [store updated wheel]
A49@ [on to next wheel]
A24@
G43@ [always jump, since A < 0]
[Update the number under test. Assume acc = 0.]
[66] A#@ [add incrememnt to number under test]
A2#@
U#@ [store new number]
[Test whether we've reached the "milestone", i.e. number = p^2.]
S4#@ [subtract milestone]
E94@ [if reached milestone, jump with acc = 0]
TF [clear acc]
A11@ [acc < 0 if number is prime, 0 if composite]
E38@ [if composite, loop for next number with acc = 0]
[Here when number is found to be prime.]
TF [clear acc]
A#@ [load number]
TD [copy number 0D for printing]
[77] A77@
GG [call print routine, clears acc]
O13@O14@ [print CR, LF]
[If list of primes isn't yet full, store the prime just found.
It's slightly more convenient to store the negative of the prime.
Also, the wheel is initialized to the negative of the prime.]
A89@ [load T order to store ]
S20@ [compare with end of list]
E38@ [if list is full, loop with acc = 0]
A20@ [restore acc after test]
A22@ [make U order for wheel + 1, i.e. for prime]
T88@ [plant in code]
S@ [load negative of latest prime]
[88] UF [store in list]
[89] TF [initialize wheel for this prime]
A89@ [inc address by 2 for next time]
A24@
T89@
E38@ [loop with acc = 0]
[Here when number tested equals the "milestone" p^2 (p prime).
We need to activate the wheel for the prime p,
and update the milestone to the next prime after p.]
[Assume acc = 0.]
[94] A100@ [load A order below]
S19@ [test against A order for end of list]
E110@ [if reached end of list, exit]
A19@ [restore acc after test]
A24@ [inc address in A order]
T100@ [plant in next order]
[100] AF [load negative of prime from list]
TF [to 0F]
HF [to mult reg]
VF [acc := square of prime scaled by 2^(-32)]
R1F [scale by 2^(-34) for 35-bit value]
T4#@ [update]
A18@ [start testing next prime wheel]
A24@
T18@
E38@ [loop with acc = 0]
[Here on exit from program]
[110] O15@ [print null to flush printer buffer]
[111] ZF [stop]
[Array of wheels and primes, immediately after program code]
[112]
 
[============================ G parameter ==================================]
[Modified library subroutine P7.]
[Prints signed integer; up to 10 digits, left-justified.]
[Input: 0D = integer,]
[54 locations. Load at even address. Workspace 4D.]
E25KTG
GKA3FT42@A49@T31@ADE10@T31@A48@T31@SDTDH44#@NDYFLDT4DS43@
TFH17@S17@A43@G23@UFS43@T1FV4DAFG50@SFLDUFXFOFFFSFL4FT4D
A49@T31@A1FA43@G20@XFP1024FP610D@524D!FO46@O26@XFSFL8FT4DE39@
 
[========================= M parameter again ===============================]
E25KTM
GK
E25Z [define entry point]
PF [acc = 0 on entry]
</syntaxhighlight>
{{out}}
<pre>
5
7
11
13
[...]
17047
17053
17077
17093
17099
17107
17117
17123
17137
17159
</pre>
 
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
class
APPLICATION
 
create
make
 
feature
 
make
do
sequence (1, 27)
end
 
sequence (lower, upper: INTEGER)
-- Sequence of primes from 'lower' to 'upper'.
require
lower_positive: lower > 0
upper_positive: upper > 0
lower_smaller: lower < upper
local
i: INTEGER
do
io.put_string ("Sequence of primes from " + lower.out + " up to " + upper.out + ".%N")
i := lower
if i \\ 2 = 0 then
i := i + 1
end
from
until
i > upper
loop
if is_prime (i) then
io.put_integer (i)
io.put_new_line
end
i := i + 2
end
end
 
feature {NONE}
 
is_prime (n: INTEGER): BOOLEAN
-- Is 'n' a prime number?
require
positiv_input: n > 0
local
i: INTEGER
max: REAL_64
math: DOUBLE_MATH
do
create math
if n = 2 then
Result := True
elseif n <= 1 or n \\ 2 = 0 then
Result := False
else
Result := True
max := math.sqrt (n)
from
i := 3
until
i > max
loop
if n \\ i = 0 then
Result := False
end
i := i + 2
end
end
end
 
end
</syntaxhighlight>
{{out}}
<pre>
Sequence of primes from 1 to 27.)
3
5
7
11
13
17
19
23
</pre>
 
=={{header|Elena}}==
ELENA 6.x :
<syntaxhighlight lang="elena">import extensions;
import system'routines;
import system'math;
isPrime =
(n => new Range(2,(n.sqrt() - 1).RoundedInt).allMatchedBy::(i => n.mod(i) != 0));
Primes =
(n => new Range(2, n - 2).filterBy(isPrime));
public program()
{
console.printLine(Primes(100))
}</syntaxhighlight>
{{out}}
<pre>
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
</pre>
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">defmodule Prime do
def sequence do
Stream.iterate(2, &(&1+1)) |> Stream.filter(&is_prime/1)
end
def is_prime(2), do: true
def is_prime(n) when n<2 or rem(n,2)==0, do: false
def is_prime(n), do: is_prime(n,3)
defp is_prime(n,k) when n<k*k, do: true
defp is_prime(n,k) when rem(n,k)==0, do: false
defp is_prime(n,k), do: is_prime(n,k+2)
end
 
IO.inspect Prime.sequence |> Enum.take(20)</syntaxhighlight>
 
{{out}}
<pre>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
</pre>
 
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
PROGRAM PRIME_GENERATOR
 
!$DOUBLE
 
BEGIN
PRINT(CHR$(12);) !CLS
N=1
LOOP
N+=1
FOR F=2 TO N DO
IF F=N THEN PRINT(N;) EXIT END IF
EXIT IF N=F*INT(N/F)
END FOR
END LOOP
END PROGRAM
</syntaxhighlight>
You must press Ctrl+Break to stop the program.
{{out}}
<pre> 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157
163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241
251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347
349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439
443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547
557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643
647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751
757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859
863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061
1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153
1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249
1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327
1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451
1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543
1549 1553 1559 1567 1571 1579 1583 1597 1601 ^C
</pre>
 
=={{header|F Sharp}}==
<syntaxhighlight lang="fsharp">
(*
Nigel Galloway April 7th., 2017.
*)
let SofE =
let rec fg ng = seq{
let n = Seq.item 0 ng
yield n; yield! fg (Seq.cache(Seq.filter (fun g->g%n<>0) (Seq.skip 1 ng)))}
fg (Seq.initInfinite(id)|>Seq.skip 2)
</syntaxhighlight>
Let's print the sequence Prime[23] to Prime[42].
{{out}}
<syntaxhighlight lang="fsharp">
[23..42] |> Seq.iter(fun n->printf "%d " (Seq.item n SofE))
</syntaxhighlight>
<pre>
89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191
</pre>
 
=={{header|Factor}}==
<syntaxhighlight lang="factor">USING: combinators kernel lists lists.lazy math math.functions
math.ranges prettyprint sequences ;
 
: prime? ( n -- ? )
{
{ [ dup 2 < ] [ drop f ] }
{ [ dup even? ] [ 2 = ] }
[ 3 over sqrt 2 <range> [ mod 0 > ] with all? ]
} cond ;
 
! Create an infinite lazy list of primes.
: primes ( -- list ) 0 lfrom [ prime? ] lfilter ;
 
! Show the first fifteen primes.
15 primes ltake list>array .</syntaxhighlight>
{{out}}
<pre>
{ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 }
</pre>
 
=={{header|FileMaker}}==
<syntaxhighlight lang="filemaker">
 
#May 10th., 2018.
 
Set Error Capture [On]
Allow User Abort [Off]
# Set default number of minutes
Set Variable [$maxduration; Value:1]
# Ask user for a desired duration of the test
Show Custom Dialog [ "Setup";
"Enter the number of minutes (0,1-15, 6s increments) you would like this test to run.¶" &
"Hit any of the modifier-keys until the result-dialog appears, when you wish to break off the test.";
$maxduration ]
If [Get ( LastMessageChoice ) = 1]
# Set all start-variables
Set Variable [
$result;
Value: Let ( [
$start = Get ( CurrentTimeUTCMilliseconds ) ;
x = Ceiling ( Abs ( 10 * $maxduration ) ) / 10 ;
y = Case ( x < ,1 ; ,1 ; x > 15 ; 15 ; x ) ;
$time = y * 60000 ; // 1 minute = 60000 milliseconds
$number = 1 ;
$primenumbers = 2 ;
$duration = ""
] ;
""
)]
Loop
# Increase each iteration by 2 (besides 2 there are no even prime numbers)
# exit after duration is exceeded or when a modifier-key is actuated
Exit Loop If [ Let ( [
$number = $number + 2 ;
$i = 1
] ;
$duration > $time or
Get ( ActiveModifierKeys ) ≥ 1
)]
Loop
# Loop until it is determined that a number is or isn't a prime number or the duration is exceeded
# supplement $primenumbers each time one is found, update $duration each iteration
Exit Loop If [ Let ( [
$x = GetValue ( $primenumbers ; ValueCount ( $primenumbers ) - $i ) ;
$d = If ( $x > 0 ; $number / $x ) ;
$e = If ( Floor ( $d ) = $d ; $d ) ;
$i = $i + 1 ;
s = ( $x - 1 ) > $number/2 and $e = "" ;
$primenumbers = If ( $x = "" or s ;
List ( $primenumbers ; $number ) ;
$primenumbers ) ;
$duration = Get ( CurrentTimeUTCMilliseconds ) - $start
] ;
$x = "" or $e > 0 or s or $duration > $time
)]
End Loop
End Loop
# Count the number of primes found
Set Variable [
$result;
Value: Let ( [
$n = ValueCount ( $primenumbers ) ;
$$array = $primenumbers
] ;
""
)]
# Show results to user
Show Custom Dialog [ "Result";
List (
"Prime numbers found: " & $n ;
"Largest prime number: " & GetValue ( $primenumbers ; 1 ) ;
"Duration of test (ms): " & $duration )]
End If
#
</syntaxhighlight>
 
=={{header|Forth}}==
This program stores the generated primes into a user allocated array and uses the primes generated so far to test divisibility of subsequent candidates. In FORTH, the PAD can be used as a large memory area that is always available, and the main .primes word makes use of that.
<syntaxhighlight lang="forth">
variable p-start \ beginning of prime buffer
variable p-end \ end of prime buffer
 
: +prime ( n -- )
p-end @ tuck ! cell+ p-end ! ;
 
: setup-pgen ( addr n -- n )
dup 3 < abort" The buffer must be large enough to store at least three primes."
swap dup p-start ! p-end !
2 +prime 3 +prime 5 +prime 3 - ;
 
: sq s" dup *" evaluate ; immediate
 
: prime? ( n -- f ) \ test a candidate for primality.
>r p-start @ [ 2 cells ] literal + begin
dup @ dup ( a -- a n n )
sq r@ > if rdrop 2drop true exit then
r@ swap mod 0= if rdrop drop false exit then
cell+
again ;
 
: ?+prime ( n1 n2 -- n1 n2 ) \ add n2 to output array if prime and n1 != 0
dup prime? over 0<> and
if
dup +prime swap 1- swap
then ;
 
: genprimes ( addr n -- ) \ store first n primes at address "addr"
setup-pgen 7 \ stack: #found, candidate
begin
?+prime 4 + ?+prime 2 +
over 0= until 2drop ;
 
: .primes ( n -- )
pad swap 2dup genprimes
cells bounds do
i pad - [ 10 cells ] literal mod 0= if cr then
i @ 5 .r
cell +loop ;
</syntaxhighlight>
{{Out}}
<pre>
$ gforth ./td-primes.fs
Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
168 .primes
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541
547 557 563 569 571 577 587 593 599 601
607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733
739 743 751 757 761 769 773 787 797 809
811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941
947 953 967 971 977 983 991 997 ok
</pre>
 
=={{header|Fortran}}==
This version was written for an IBM1130, which offered 16-bit integers. Storage size was 32K words. It was written before the revised dogma that one is not a prime number became common. With punched-card input, using only capital letters was normal. This system offered Fortran IV which lacks the many later developments such as ''if ... then'' style statements, thus the profusion of statement labels and arithmetic if-statements. In ''if (expression) negative,zero,positive'' the sign of the expression is examined to choose the appropriate label to jump to. Labels can only be numbers, alas. There was also no MOD function for determining the remainder.
 
This routine does ''not'' attempt a calculation of sqrt(n), a time-consuming and also potentially inacurrate scheme. For instance, using Trunc(Log10(n)) + 1 to determine how many digits are needed to print ''n'' seems an obvious ad-hoc ploy, and gave 1 for ''n'' = 1 to 9, but it also gave 1 for ''n'' = 10, because Log10(10) was calculated as 0.9999964 or so (single precision on an IBM 390 system), which truncates to zero.
 
Instead, since many successive numbers are to be tested for primality, advantage can be taken of the fact that prime numbers only up to PRIME(LP) need be tried as factors all the way up to N = PRIME(LP + 1)**2 = XP2. This is similar to starting a pass through a Sieve of Eratoshenes at P*P rather than at 2*P. Thus, 5 is the largest factor to try, even beyond 5*5, all the way up to 49, because, if the number were divisible by 7, 7*2 would already have been checked because of 2, 7*3 because of 3, and so on. Only when 7*7 is needed will a further possible factor have to be tried. Likewise, although the last possible factor to try for N up to the integer limit of 32767 is 181 because the square of the next prime (191) exceeds 32767, in order for the method to be able to know this, the PRIME array must have space for this surplus prime. However, it does not know this properly because the square of 191 ''does'' exceed 32767 and so its value in XP2 will be incorrect, but this doesn't matter because only equality to XP2 is checked for and there will never be call to try 191 as a factor because 181 suffices up to the integer limit and the iteration will stop by then. Fortunately, 32767 is not divisible by three so that value will not be excluded as a possible candidate for N, and so the search can correctly end after inspecting the largest possible integer - finding it divisible by seven.
 
This method avoids considering multiples of two and three, leading to the need to pre-load array PRIME and print the first few values explicitly rather than flounder about with special startup tricks. Even so, in order not to pre-load with 7, and to correctly start the factor testing with 5, the first few primes are found with some wasted effort because 5 is not needed at the start. Storing the primes as found has the obvious advantage of enabling divisions only by prime numbers, but care with the startup is needed to ensure that primes have indeed been stored before they are called for.
 
<syntaxhighlight lang="fortran">
CONCOCTED BY R.N.MCLEAN, APPLIED MATHS COURSE, AUCKLAND UNIVERSITY, MCMLXXI.
INTEGER ENUFF,PRIME(44)
CALCULATION SHOWS PRIME(43) = 181, AND PRIME(44) = 191.
INTEGER N,F,Q,XP2
INTEGER INC,IP,LP,PP
INTEGER ALINE(20),LL,I
DATA ENUFF/44/
DATA PP/4/
DATA PRIME(1),PRIME(2),PRIME(3),PRIME(4)/1,2,3,5/
COPY THE KNOWN PRIMES TO THE OUTPUT LINE.
DO 1 I = 1,PP
1 ALINE(I) = PRIME(I)
LL = PP
LP = 3
XP2 = PRIME(LP + 1)**2
N = 5
INC = 4
CONSIDER ANOTHER CANDIDATE. VIA INC, DODGE MULTIPLES OF 2 AND 3.
10 INC = 6 - INC
N = N + INC
IF (N - XP2) 20,11,20
11 LP = LP + 1
XP2 = PRIME(LP + 1)**2
GO TO 40
CHECK SUCCESSIVE PRIMES AS FACTORS, STARTING WITH PRIME(4) = 5.
20 IP = 4
21 F = PRIME(IP)
Q = N/F
IF (Q*F - N) 22,40,22
22 IP = IP + 1
IF (IP - LP) 21,21,30
CAUGHT ANOTHER PRIME.
30 IF (PP - ENUFF) 31,32,32
31 PP = PP + 1
PRIME(PP) = N
32 IF (LL - 20) 35,33,33
33 WRITE (6,34) (ALINE(I), I = 1,LL)
34 FORMAT (20I6)
LL = 0
35 LL = LL + 1
ALINE(LL) = N
COMPLETED?
40 IF (N - 32767) 10,41,41
41 WRITE (6,34) (ALINE(I), I = 1,LL)
END</syntaxhighlight>
 
Start of output:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277
281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401
409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523
541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653
659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797
809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937
941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063
1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213 1217
etc. and ends
32423 32429 32441 32443 32467 32479 32491 32497 32503 32507 32531 32533 32537 32561 32563 32569 32573 32579 32587 32603
32609 32611 32621 32633 32647 32653 32687 32693 32707 32713 32717 32719 32749
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Function isPrime(n As Integer) As Boolean
If n < 2 Then Return False
If n = 2 Then Return True
If n Mod 2 = 0 Then Return False
Dim limit As Integer = Sqr(n)
For i As Integer = 3 To limit Step 2
If n Mod i = 0 Then Return False
Next
Return True
End Function
 
' Print all primes from 101 to 999
For i As Integer = 101 To 999
If isPrime(i) Then
Print Str(i); " ";
End If
Next
 
Print : Print
Print "Press any key to quit"
Sleep</syntaxhighlight>
 
{{out}}
<pre>
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313
317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439
443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691
701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829
839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997
</pre>
 
=={{header|Go}}==
An unbounded cascading filtering method using channels, adapted from the classic concurrent prime sieve example in the "Try Go" window at http://golang.org/, improved by postponing the initiation of the filtering by a prime until the prime's square is seen in the input.
<langsyntaxhighlight lang="go">package main
 
import "fmt"
 
func NumsFromBy(from int, by int, ch chan<- int) {
for i := from; ; i+=by {
Line 146 ⟶ 1,705:
}
}
 
func Filter(in <-chan int, out chan<- int, prime int) {
for {
Line 155 ⟶ 1,714:
}
}
 
func Sieve(out chan<- int) {
out <- 2
out <- 3
q := 9
ps := make(chan int)
go Sieve(ps) // separate primes supply
p := <-ps
p = <-ps
nums := make(chan int)
go NumsFromBy(5,2,nums) // end of setup
Line 171 ⟶ 1,728:
out <- n // n is prime
} else {
ch1 := make(chan int) // n == q == p*p
go Filter(nums, ch1, p) // postponed creation of a filter by p, at p*p
nums = ch1
p = <-ps // next prime
q = p*p // and its square
}
}
}
 
func primes (c chan<- int) {
c <- 2
go Sieve(c)
}
func main() {
ch := make(chan int)
go Sieveprimes(ch)
fmt.Print("First twenty:")
for i := 0; i < 20; i++ {
Line 188 ⟶ 1,750:
}
fmt.Println()
}</langsyntaxhighlight>
{{out}}
<pre>
First twenty: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71
</pre>
A simple iterative method, also unbounded and starting with 2.
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 225 ⟶ 1,787:
}
fmt.Println()
}</langsyntaxhighlight>
{{out}}
<pre>
Line 232 ⟶ 1,794:
 
=={{header|Haskell}}==
The most basic:
[[Primality by trial division#Haskell|Trial division]] can be used to produce short ranges of primes:
<langsyntaxhighlight lang="haskell">primesFromTo[n | n m<- [2..], []==[i filter| isPrimei <- [n2..mn-1], rem n i == 0]]</langsyntaxhighlight>
 
With trial division emulated by additions (the seeds of Sieve):
The following code leaves no "duplicates" in its input by keeping every newly encountered distinct number, defining the equality of any two numbers as them having a GCD above 1:
<syntaxhighlight lang="haskell">[n | n <- [2..], []==[i | i <- [2..n-1], j <- [i,i+i..n], j==n]]</syntaxhighlight>
<lang haskell>import Data.List (nubBy)
 
With recursive filtering (in wrong order, from bigger to smaller natural numbers):
primes = nubBy (((>1).).gcd) [2..]</lang>
<syntaxhighlight lang="haskell">foldr (\x r -> x : filter ((> 0).(`rem` x)) r) [] [2..]</syntaxhighlight>
 
With iterated sieving (in right order, from smaller to bigger primes):
It is very slow.
<syntaxhighlight lang="haskell">Data.List.unfoldr (\(x:xs) -> Just (x, filter ((> 0).(`rem` x)) xs)) [2..]</syntaxhighlight>
 
A proper [[Primality by trial division#Haskell|primality testing by trial division]] can be used to produce short ranges of primes more efficiently:
The classical version has <code>isPrime</code> inlined, and so can ignore the prime 2 while testing only odd numbers:
<syntaxhighlight lang="haskell">primesFromTo n m = filter isPrime [n..m]</syntaxhighlight>
 
The standard optimal trial division version has <code>isPrime</code> in the above inlined:
<lang haskell>primes = 2 : 3 : [n | n <- [5,7..], foldr (\p r-> p*p > n || rem n p > 0 && r)
 
True (drop 1 primes)]</lang>
<syntaxhighlight lang="haskell">-- primes = filter isPrime [2..]
primes = 2 : [n | n <- [3..], foldr (\p r-> p*p > n || rem n p > 0 && r)
True primes]</syntaxhighlight>
 
It is easy to amend this to test only odd numbers by only odd primes, or automatically skip the multiples of ''3'' (also, ''5'', etc.) by construction as well (a ''wheel factorization'' technique):
 
<syntaxhighlight lang="haskell">primes = 2 : 3 : [n | n <- [5,7..], foldr (\p r-> p*p > n || rem n p > 0 && r)
True (drop 1 primes)]
= [2,3,5] ++ [n | n <- scanl (+) 7 (cycle [4,2]),
foldr (\p r-> p*p > n || rem n p > 0 && r)
True (drop 2 primes)]
-- = [2,3,5,7] ++ [n | n <- scanl (+) 11 (cycle [2,4,2,4,6,2,6,4]), ... (drop 3 primes)]</syntaxhighlight>
 
It is also easy to extend the above in generating the factorization wheel automatically as follows:
 
<syntaxhighlight lang="haskell">-- autogenerates wheel primes, first sieve prime, and gaps
wheelGen :: Int -> ([Int],Int,[Int])
wheelGen n = loop 1 3 [2] [2] where
loop i frst wps gps =
if i >= n then (wps, frst, gps) else
let nfrst = frst + head gps
nhts = (length gps) * (frst - 1)
cmpsts = scanl (\ c g -> c + frst * g) (frst * frst) (cycle gps)
cull n (g:gs') cs@(c:cs') og
| nn >= c = cull nn gs' cs' (og + g) -- n == c; never greater!
| otherwise = (og + g) : cull nn gs' cs 0 where nn = n + g
in nfrst `seq` nhts `seq` loop (i + 1) nfrst (wps ++ [frst]) $ take nhts
$ cull nfrst (tail $ cycle gps) cmpsts 0
 
(wheelPrimes, firstSievePrime, gaps) = wheelGen 7
 
primesTDW :: () -> [Int]
primesTDW() = wheelPrimes ++ _Y (
(firstSievePrime :) . sieve (firstSievePrime + head gaps)
(tail $ cycle gaps)) where
_Y g = g (_Y g) -- non-sharing multi-stage fixpoint combinator
sieve cnd gps bps = xtrprms cnd gps where
xtrprms n (g:gs') -- strictly filtered by base primes <= sqrt - faster!
| any ((==) 0 . rem n)
(takeWhile ((<= n) . flip (^) 2) bps) = xtrprms (n + g) gs'
| otherwise = n : xtrprms (n + g) gs'</syntaxhighlight>
 
This is likely about the fastest of the trial division prime generators at just a few seconds to generate the primes up to ten million, which is about the limit of its practical range. An incremental Sieve of Eratosthenes sieve will extend the useful range about ten times this and isn't that much more complex.
 
===Sieve by trial division===
The classic David Turner's 1983 (1976? 1975?) SASL code repeatedly ''sieves'' a stream of candidate numbers from those divisible by a prime at a time, and works even for unbounded streams, thanks to lazy evaluation:
Filtering candidate numbers for non-divisibility, by prime at a time, is a kind of sieving. One often sees a ''"naive"'' version presented as an unbounded [[Sieve of Eratosthenes#Haskell|sieve of Eratosthenes]], similar to David Turner's 1975 SASL code,
<langsyntaxhighlight lang="haskell">primesT = sieve [2..]
where
sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]
-- map head
-- . iterate (\(p:xs) -> [xfilter | x <- xs,((> 0).(`rem x` p)) /= 0]xs) $ [2..]</langsyntaxhighlight>
 
As shown in Melissa O'Neill's paper [http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf "The Genuine Sieve of Eratosthenes"], this is rather a sub-optimal ''trial division'' algorithm. Its complexity is quadratic in number of primes produced whereas that of optimal trial division is <math>O(n^{1.5}/(\log n)^{0.5})</math>, and of true SoE it is <math>O(n\log n\log\log n)</math>, in ''n'' primes produced.
As shown in Melissa O'Neill's paper [http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf "The Genuine Sieve of Eratosthenes"], its complexity is quadratic in number of primes produced whereas that of optimal trial division is <math>O(n^{1.5}/(\log n)^{0.5})</math>, and of true SoE it is <math>O(n\log n\log\log n)</math>, in ''n'' primes produced.
 
Indeed as Eratosthenes sieve works by counting, ''its'' removal step could be prototyped as <code>(\(p:xs)-> minus xs [p,p+p..])</code>, where <code>minus xs ys == xs Data.List.\\ ys</code> for any finite and increasing ''xs'' and ''ys''.
 
===Bounded sieve by trial division===
Bounded formulation has normal trial division complexity, because it can stop early via an explicit guard:
<syntaxhighlight lang ="haskell">primesTo m = 2 : sieve [3,52..m]
where
sieve (p:xs) | p*p > m = p : xs
| otherwise = p : sieve [x | x <- xs, rem x p /= 0]
-- (\(a,b:_) -> map fsthead a ++ b:c where (a,(b,c):_) =. span ((< m).(^2).fsthead)
-- . $ iterate (\(_,p:xs) -> filter ((p, [x | x <- xs, >0).(`rem x `p /= 0])) $xs) ([2, [3,5..m])</langsyntaxhighlight>
 
===Postponed sieve by trial division===
{{trans|Racket}}
To make it unbounded, the guard cannot be simply discarded. The firing up of a filter by a prime should be ''postponed'' until its ''square'' is seen amongst the candidates (so a bigger chunk of input numbers are taken straight away as primes, between each opening up of a new filter, instead of just one head element in the non-postponed algorithm):
<syntaxhighlight lang ="haskell">primesPT = 2sieve : 3 : sieveprimesPT [5,72..] 9 (tail primesPT)
where
sieve ~(p:ps) (x:xs) q= x : after ps@(p:t*p) xs
| x < q = x : sieve xs q ps -- inlined (sieve ps . filter ((span> 0).(<`rem` qp)))
| otherwise = sieveafter [yq (x:xs) f | yx <- xs,q rem= yx p: /=after 0]q (headxs t^2)f t
| otherwise = f (x:xs)
-- ps = concat . map fst
-- fix $ concatMap (fst.fst) . iterate (\((_,(nst),p:t)ps) -> let (h,xs)=span (< p*p) ns in
-- (h,span (< head ps^2) [yx | yx <- xst, rem yx p /=> 0], t)ps)) $. (,) ([2,3], ([5,74..], tail ps))</langsyntaxhighlight>
 
<code>~(p:ps)</code> is a lazy pattern: the matching will be delayed until any of its variables are actually needed. Here it means that on the very first iteration the head of <code>primesPT</code> will be safely accessed only after it is already defined (by <code>x : after (p*p) ...</code>).
 
Note that the above introduced laziness for the evaluation of the head of the base primes list in order to avoid a race isn't necessary for the usual method of just introducing the first of the base primes before starting the computation as follows (use the same `wheelGen` as above for this wheel factorized version):
 
<syntaxhighlight lang="haskell">primesPTDW :: () -> [Int] -- nested filters, no matter how much postponed,
primesPTDW() = -- causes mucho allocation of deferred thunks!
wheelPrimes ++ _Y ((firstSievePrime :) . sieve cndts) where
_Y g = g (_Y g) -- non-sharing multi-stage fixpoint combinator
cndts = scanl (+) (firstSievePrime + head gaps) (tail $ cycle gaps)
sieve xs (bp:bps') = after xs where
q = bp * bp
after (x:xs') | x >= q = sieve (filter ((> 0) . (`rem` bp)) xs') bps'
| otherwise = x : after xs'</syntaxhighlight>
 
However, these postponed solutions are slower than the last of the basic trial division prime generators as the (nested) filters add greatly the the deferred "thunks" stored to the heap rather than the more direct (and more strict) determination of whether a number is prime as it's output.
 
===Segmented Generate and Test===
Explicating the run-time list of ''filters'' (created implicitly by the sieves above) as a list of ''factors to test by'' on each segment between the consecutive squares of primes (so that no testing is done prematurely), and rearranging to avoid recalculations, leads to the following:
<langsyntaxhighlight lang="haskell">import Data.List (inits)
 
primesST = 2 : 3 : sieve 5 9 (drop 2 primesST) (inits $ tail primesST)
where
sieve x q ps (fs:ft) = filter (\y-> all ((/=0).rem y) fs) [x,x+2..q-2]
++ sieve (q+2) (head ps^2) (tail ps) ft</langsyntaxhighlight>
<code>inits</code> makes a stream of (progressively growing) prefixes of an input stream, starting with an empty prefix, here making the <code>fs</code> parameter to get a sequence of values <code>[], [3], [3,5], ...</code>.
 
Line 294 ⟶ 1,922:
 
Implementation:
<langsyntaxhighlight Jlang="j">primTrial=:3 :0
try=. i.&.(p:inv) %: >./ y
candidate=. (y>1)*y=<.y
y #~ candidate*(y e.try) = +/ 0= try|/ y
)</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight Jlang="j"> primTrial 1e6+i.100
1000003 1000033 1000037 1000039 1000081 1000099</langsyntaxhighlight>
 
Note that this is a filter - it selects values from its argument which are prime. If no suitable values are found the resulting sequence of primes will be empty.
 
Note: if you instead want an iterator, 4&p: y returns the next prime after y.
=={{header|Perl 6}}==
 
Here is a straightforward implementation of the naive algorithm.
See also: [[Sieve_of_Eratosthenes#J|Sieve of Eratosthenes]]
<lang perl6>constant @primes = 2, 3, { first * %% none(@_), (@_[* - 1], * + 2 ... *) } ... *;
 
=={{header|Java}}==
{{works with|Java|8}}
<syntaxhighlight lang="java">import java.util.stream.IntStream;
 
public class Test {
 
static IntStream getPrimes(int start, int end) {
return IntStream.rangeClosed(start, end).filter(n -> isPrime(n));
}
 
public static boolean isPrime(long x) {
if (x < 3 || x % 2 == 0)
return x == 2;
 
long max = (long) Math.sqrt(x);
for (long n = 3; n <= max; n += 2) {
if (x % n == 0) {
return false;
}
}
return true;
}
 
public static void main(String[] args) {
getPrimes(0, 100).forEach(p -> System.out.printf("%d, ", p));
}
}</syntaxhighlight>
 
<pre>2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,</pre>
 
=={{header|jq}}==
{{works with|jq|1.4}}
 
This entry uses is_prime/0 as defined at [[Primality_by_trial_division#jq]].
<syntaxhighlight lang="jq"># Produce a (possibly empty) stream of primes in the range [m,n], i.e. m <= p <= n
def primes(m; n):
([m,2] | max) as $m
| if $m > n then empty
elif $m == 2 then 2, primes(3;n)
else (1 + (2 * range($m/2 | floor; (n + 1) /2 | floor))) | select( is_prime )
end;</syntaxhighlight>
 
'''Examples:'''
<syntaxhighlight lang="jq">primes(0;10)</syntaxhighlight>
<syntaxhighlight lang="sh">2
3
5
7</syntaxhighlight>
Produce an array of primes, p, satisfying 50 <= p <= 99:
<syntaxhighlight lang="jq">[primes(50;99)]</syntaxhighlight>
[53,59,61,67,71,73,79,83,89,97]
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
I've chosen to solve this task by creating a new iterator type, <tt>TDPrimes</tt>. <tt>TDPrimes</tt> contains the upper limit of the sequence. The iteration state is the list of computed primes, and the item returned with each iteration is the current prime. The core of the solution is the <tt>next</tt> method for <tt>TDPrimes</tt>, which computes the next prime by trial division of the previously determined primes contained in the iteration state.
 
<syntaxhighlight lang="julia">struct TDPrimes{T<:Integer}
uplim::T
end
 
Base.start{T<:Integer}(pl::TDPrimes{T}) = 2ones(T, 1)
Base.done{T<:Integer}(pl::TDPrimes{T}, p::Vector{T}) = p[end] > pl.uplim
function Base.next{T<:Integer}(pl::TDPrimes{T}, p::Vector{T})
pr = npr = p[end]
ispr = false
while !ispr
npr += 1
ispr = all(npr % d != 0 for d in p)
end
push!(p, npr)
return pr, p
end
 
println("Primes ≤ 100: ", join((p for p in TDPrimes(100)), ", "))</syntaxhighlight>
 
say @primes[^100];</lang>
{{out}}
<pre>Primes ≤ 100: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97</pre>
<pre>2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541</pre>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.0.6
 
fun isPrime(n: Int): Boolean {
if (n < 2) return false
if (n % 2 == 0) return n == 2
if (n % 3 == 0) return n == 3
var d : Int = 5
while (d * d <= n) {
if (n % d == 0) return false
d += 2
if (n % d == 0) return false
d += 4
}
return true
}
 
fun main(args: Array<String>) {
// print all primes below 2000 say
var count = 1
print(" 2")
for (i in 3..1999 step 2)
if (isPrime(i)) {
count++
print("%5d".format(i))
if (count % 15 == 0) println()
}
}</syntaxhighlight>
 
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349 353 359 367 373 379
383 389 397 401 409 419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733 739 743 751 757 761
769 773 787 797 809 811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069
1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187
1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291
1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427
1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511
1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613
1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733
1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867
1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987
1993 1997 1999
</pre>
 
=={{header|Lambdatalk}}==
 
<syntaxhighlight lang="scheme">
{def prime
{def prime.rec
{lambda {:m :n}
{if {> {* :m :m} :n}
then :n
else {if {= {% :n :m} 0}
then
else {prime.rec {+ :m 1} :n} }}}}
{lambda {:n}
{prime.rec 2 :n} }}
 
{map prime {serie 3 100 2}}
-> 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
 
{map prime {serie 9901 10000 2}}
-> 9901 9907 9923 9929 9931 9941 9949 9967 9973
</syntaxhighlight>
More to see in [http://epsilonwiki.free.fr/lambdaway/?view=primes2]
 
=={{header|LFE}}==
This version is inspired by PicoLisp, however instead of using the algorithm from the paper "Lazy wheel sieves and spirals of primes", this program uses a static 2,3,5,7,11 factorization wheel. Since the diminishing returns of factor wheels hit hard after 11, it's arguably better to use a precomputed fixed sized wheel. Like the PicoLisp version, this code also uses a separate thread to serve the primes.
<syntaxhighlight lang="lisp">
(defmodule tdwheel
(export
(primes 0) (gen 1) (next 1)))
 
(defun +wheel-2x3x5x7x11+ ()
#B( 12 4 2 4 6 2 6 4 2 4 6 6 2 6 4 2 6 4 6 8 4 2 4 2
4 14 4 6 2 10 2 6 6 4 2 4 6 2 10 2 4 2 12 10 2 4 2 4
6 2 6 4 6 6 6 2 6 4 2 6 4 6 8 4 2 4 6 8 6 10 2 4
6 2 6 6 4 2 4 6 2 6 4 2 6 10 2 10 2 4 2 4 6 8 4 2
4 12 2 6 4 2 6 4 6 12 2 4 2 4 8 6 4 6 2 4 6 2 6 10
2 4 6 2 6 4 2 4 2 10 2 10 2 4 6 6 2 6 6 4 6 6 2 6
4 2 6 4 6 8 4 2 6 4 8 6 4 6 2 4 6 8 6 4 2 10 2 6
4 2 4 2 10 2 10 2 4 2 4 8 6 4 2 4 6 6 2 6 4 8 4 6
8 4 2 4 2 4 8 6 4 6 6 6 2 6 6 4 2 4 6 2 6 4 2 4
2 10 2 10 2 6 4 6 2 6 4 2 4 6 6 8 4 2 6 10 8 4 2 4
2 4 8 10 6 2 4 8 6 6 4 2 4 6 2 6 4 6 2 10 2 10 2 4
2 4 6 2 6 4 2 4 6 6 2 6 6 6 4 6 8 4 2 4 2 4 8 6
4 8 4 6 2 6 6 4 2 4 6 8 4 2 4 2 10 2 10 2 4 2 4 6
2 10 2 4 6 8 6 4 2 6 4 6 8 4 6 2 4 8 6 4 6 2 4 6
2 6 6 4 6 6 2 6 6 4 2 10 2 10 2 4 2 4 6 2 6 4 2 10
6 2 6 4 2 6 4 6 8 4 2 4 2 12 6 4 6 2 4 6 2 12 4 2
4 8 6 4 2 4 2 10 2 10 6 2 4 6 2 6 4 2 4 6 6 2 6 4
2 10 6 8 6 4 2 4 8 6 4 6 2 4 6 2 6 6 6 4 6 2 6 4
2 4 2 10 12 2 4 2 10 2 6 4 2 4 6 6 2 10 2 6 4 14 4 2
4 2 4 8 6 4 6 2 4 6 2 6 6 4 2 4 6 2 6 4 2 4 12 2))
 
(defun next (pid)
(! pid `#(next ,(self)))
(receive (x x)))
 
(defun primes ()
(spawn (MODULE) 'gen '((2 3 5 7 11))))
 
(defun gen (primes)
(receive
(`#(next ,sender)
(case primes
((list p)
(! sender p)
(divloop 1 0 (+wheel-2x3x5x7x11+)))
((cons p ps)
(! sender p)
(gen ps))))))
 
(defun divloop (n j wheel)
(receive
(`#(next ,sender)
(let [((tuple n' j') (next-prime n j wheel))]
(! sender n')
(divloop n' j' wheel)))))
 
(defun next-prime (n0 j wheel)
(let [
(n (+ n0 (binary:at wheel j)))
(j' (if (=:= j (- (byte_size wheel) 1))
0
(+ j 1)))
]
(if (td-prime? n 1 0 wheel)
(tuple n j')
(next-prime n j' wheel))))
 
(defun td-prime? (n d0 j wheel) ; 2,3,5,7,11 does not divide n
(let [(d (+ d0 (binary:at wheel j)))]
(cond
((> (* d d) n)
'true)
((=:= 0 (rem n d))
'false)
(else
(td-prime?
n
d
(if (=:= j (- (byte_size wheel) 1)) 0 (+ j 1))
wheel)))))
</syntaxhighlight>
Driver code:
<syntaxhighlight lang="lisp">
#!/usr/local/bin/lfescript
 
(defun show-primes (n)
(show-primes n (tdwheel:primes)))
 
(defun show-primes
((0 _) (io:format "~n"))
((n pid)
(lfe_io:format "~b " (list (tdwheel:next pid)))
(show-primes (- n 1) pid)))
 
(defun show-table (limit)
(io:format "n\tnth prime\n")
(show-table limit 1 1 (tdwheel:primes)))
 
(defun show-table (limit k goal pid)
(cond
((> k limit)
'ok)
((=:= k goal)
(let [(p (tdwheel:next pid))]
(io:format "~b\t~b\n" (list goal p))
(show-table limit (+ k 1) (* goal 10) pid)))
(else
(tdwheel:next pid) ; discard result
(show-table limit (+ k 1) goal pid))))
 
(defun main (_)
(show-primes 25)
(show-table 100000))
</syntaxhighlight>
 
{{Out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
n nth prime
1 2
10 29
100 541
1000 7919
10000 104729
100000 1299709
</pre>
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
print "Rosetta Code - Sequence of primes by trial division"
print: print "Prime numbers between 1 and 50"
for x=1 to 50
if isPrime(x) then print x
next x
[start]
input "Enter an integer: "; x
if x=0 then print "Program complete.": end
if isPrime(x) then print x; " is prime" else print x; " is not prime"
goto [start]
 
function isPrime(p)
p=int(abs(p))
if p=2 or then isPrime=1: exit function 'prime
if p=0 or p=1 or (p mod 2)=0 then exit function 'not prime
for i=3 to sqr(p) step 2
if (p mod i)=0 then exit function 'not prime
next i
isPrime=1
end function
</syntaxhighlight>
{{out}}
<pre>
Rosetta Code - Primality by trial division
 
Prime numbers between 1 and 50
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
Enter an integer: 1
1 is not prime
Enter an integer: 2
2 is prime
Enter an integer:
Program complete.
</pre>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">-- Returns true if x is prime, and false otherwise
function isprime (x)
if x < 2 then return false end
if x < 4 then return true end
if x % 2 == 0 then return false end
for d = 3, math.sqrt(x), 2 do
if x % d == 0 then return false end
end
return true
end
 
-- Returns table of prime numbers (from lo, if specified) up to hi
function primes (lo, hi)
local t = {}
if not hi then
hi = lo
lo = 2
end
for n = lo, hi do
if isprime(n) then table.insert(t, n) end
end
return t
end
 
-- Show all the values of a table in one line
function show (x)
for _, v in pairs(x) do io.write(v .. " ") end
print()
end
 
-- Main procedure
show(primes(100))
show(primes(50, 150))</syntaxhighlight>
{{out}}
<pre>2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149</pre>
 
=={{header|M2000 Interpreter}}==
 
<syntaxhighlight lang="m2000 interpreter">
Module primes_by_trial_division{
inventory Known1=2@, 3@
Global IsPrime=lambda Known1 (x as decimal) -> {
=false
if exist(Known1, x) then =true : exit
if x<=5 OR frac(x) then {if x == 2 OR x == 3 OR x == 5 then Append Known1, x : =true
Break}
if frac(x/2) else exit
if frac(x/3) else exit
x1=sqrt(x):d = 5@
do
if frac(x/d) else exit
d += 2: if d>x1 then Append Known1, x : =true : exit
if frac(x/d) else exit
d += 4: if d<= x1 else Append Known1, x : =true: exit
always
}
takePrimes=lambda IsPrime, i=2 (n)-> {
flush
while n>0: if isPrime(i) then data i: n--
i++:end while
=array([])
}
report "["+takePrimes(10)#str$(", ")+"]"
m=takePrimes(90) // skip 90 primes
report "["+takePrimes(100)#str$(", ")+"]"
}
primes_by_trial_division
</syntaxhighlight>
{{out}}
<pre>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
[547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223]
</pre>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">ClearAll[primeq]
primeq[1]:=False
primeq[2]:=True
primeq[n_Integer?(GreaterThan[2])]:=Module[{},
AllTrue[Range[2,Sqrt[n]+1],Mod[n,#]!=0&]
]
Select[Range[100],primeq]</syntaxhighlight>
{{out}}
<pre>{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}</pre>
 
=={{header|MATLAB}}==
<syntaxhighlight lang="matlab">function primeList = sieveOfEratosthenes(lastNumber)
 
list = (2:lastNumber); %Construct list of numbers
primeList = []; %Preallocate prime list
while( list(1)^2 <lastNumber )
primeList = [primeList list(1)]; %add prime to the prime list
list( mod(list,list(1))==0 ) = []; %filter out all multiples of the current prime
end
primeList = [primeList list]; %The rest of the numbers in the list are primes
end</syntaxhighlight>{{out|Sample Output}}
sieveOfEratosthenes(30)
ans =
2 3 5 7 11 13 17 19 23 29
 
=={{header|Nim}}==
{{trans|Kotlin}}
<syntaxhighlight lang="nim">import strformat
 
func isPrime(n: int): bool =
if n < 2: return false
if n mod 2 == 0: return n == 2
if n mod 3 == 0: return n == 3
var d = 5
while d * d <= n:
if n mod d == 0: return false
inc d, 2
if n mod d == 0: return false
inc d, 4
true
var count = 1
write(stdout, " 2")
for i in countup(3, 1999, 2):
if isPrime(i):
inc count
write(stdout, fmt"{i:5}")
if count mod 15 == 0:
write(stdout, "\n")
echo()</syntaxhighlight>
 
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349 353 359 367 373 379
383 389 397 401 409 419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733 739 743 751 757 761
769 773 787 797 809 811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069
1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187
1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291
1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427
1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511
1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613
1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733
1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867
1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987
1993 1997 1999
</pre>
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let is_prime n =
let rec test x =
x * x > n || n mod x <> 0 && n mod (x + 2) <> 0 && test (x + 6)
in
if n < 5
then n lor 1 = 3
else n land 1 <> 0 && n mod 3 <> 0 && test 5
 
let seq_prime =
Seq.ints 2 |> Seq.filter is_prime
 
let () =
seq_prime |> Seq.take 25 |> Seq.iter (Printf.printf " %u") |> print_newline</syntaxhighlight>
{{out}}
<pre> 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97</pre>
 
=={{header|Oforth}}==
 
isPrime function is from Primality by trial division page
 
<syntaxhighlight lang="oforth">: primeSeq(n) n seq filter(#isPrime) ;</syntaxhighlight>
 
=={{header|PARI/GP}}==
<syntaxhighlight lang="parigp">trial(n)={
if(n < 4, return(n > 1)); /* Handle negatives */
forprime(p=2,sqrt(n),
if(n%p == 0, return(0))
);
1
};
 
select(trial, [1..100])</syntaxhighlight>
 
=={{header|Pascal}}==
{{libheader|primTrial}} {{works with|Free Pascal}}
Hiding the work in a existing unit.
<syntaxhighlight lang="pascal">
program PrimeRng;
uses
primTrial;
var
Range : ptPrimeList;
i : integer;
Begin
Range := PrimeRange(1000*1000*1000,1000*1000*1000+100);
For i := Low(Range) to High(Range) do
write(Range[i]:12);
writeln;
end.</syntaxhighlight>
;output:
<pre> 1000000007 1000000009 1000000021 1000000033 1000000087 1000000093 1000000097</pre>
 
=={{header|Perl}}==
<syntaxhighlight lang="perl">use v5.36;
use enum <false true>;
 
sub isprime ($n) {
return $n > 1 if $n < 4;
return false unless $n % 2 and $n % 3;
for (my $i = 5; $i <= int sqrt $n; $i += 6) {
return false unless $n % $i and $n % ($i+2);
}
true
}
 
say join ' ', grep { isprime $_ } 0 .. 100;
say join ' ', grep { isprime $_ } 12345678 .. 12345678+100;</syntaxhighlight>
{{out}}
<pre>2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
12345701 12345709 12345713 12345727 12345731 12345743 12345769</pre>
 
=={{header|Phix}}==
Exact copy of [[Primality_by_trial_division#Phix]]
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">is_prime_by_trial_division</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">n</span><span style="color: #0000FF;"><</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">32</span><span style="color: #0000FF;">),</span><span style="color: #000000;">is_prime_by_trial_division</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
{2,3,5,7,11,13,17,19,23,29,31}
</pre>
 
=={{header|PicoLisp}}==
<syntaxhighlight lang="picolisp">(de prime? (N)
(or
(= N 2)
(and
(> N 1)
(bit? 1 N)
(let S (sqrt N)
(for (D 3 T (+ D 2))
(T (> D S) T)
(T (=0 (% N D)) NIL) ) ) ) ) )
 
(de primeseq (A B)
(filter prime? (range A B)) )
 
(println (primeseq 50 99))</syntaxhighlight>
{{out}}
<pre>(53 59 61 67 71 73 79 83 89 97)</pre>
===Unbounded generator===
Based on Runciman, C. (1997) FUNCTIONAL PEARL : lazy wheel
sieves and spirals of primes. Journal of Functional Programming. pp. 219-225.
 
This is based on the wheel sieve Mark 1 in the paper, where candidates are taken from increasing size factorization wheels, where the next wheel of increasing size is used after the current wheel is completely "rolled."
<syntaxhighlight lang="picolisp">
(de comma_fmt (N) (format N 0 "." ","))
 
(de prime-td? (N Chk)
(let (D NIL Rt (sqrt N))
(loop
(NIL Chk T) # if we run out of test divisors then it's prime.
(setq D (pop 'Chk))
(T (> D Rt) T)
(T (=0 (% N D)) NIL))))
 
(de primes (Run?)
(if (not Run?)
(co 'primegen) # stop
(co 'primegen
(yield 2)
(yield 3)
(make
(chain (3 1 2)) # start with W1 = 1, 3, 5, 7, 9, ...
(loop
# At the start of the loop, switch to the next size wheel.
(let
((Sj . Wheel) (made) # current wheel (size & spokes)
P (cadr Wheel) # current sieving prime
Sk (* P Sj) ) # size of next wheel
(made (list Sk))
(chain
(filter '((N) (n0 (% N P))) Wheel))
(for (O Sj (< O Sk) (+ O Sj))
(for W Wheel
(let N (+ O W)
(when (n0 (% N P))
(link N)
(when (prime-td? N (cdr Wheel))
(yield N))))))))))))
 
(do 31 (prin (primes T) " ")) (prinl)
(primes NIL)
(do 10000 (primes T))
(prinl "The 10,001st prime is " (comma_fmt (primes T)))
(bye)
</syntaxhighlight>
{{Out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127
The 10,001st prime is 104,743
</pre>
 
=={{header|PL/I-80}}==
<syntaxhighlight lang="PL/I">
/* Prime Number Generator in PLI-80
*
* The logic closely follows an example program by Edsger
* W. Dijkstra in his classic 1969 paper, "Notes on Structured
* Programming." Only odd numbers are checked for primality,
* and only the prime numbers previously found (up to the
* square root of the number under examination) are tested
* as divisors.
*/
 
primes:
proc options (main);
 
%replace
maxprimes by 3500, /* practical limit before overflow */
false by '0'b,
true by '1'b;
 
dcl
p(1:maxprimes) fixed binary(15),
divisible bit(1),
dummy char(1),
(i, k, m, n, s, nprimes, divisor) fixed binary(15);
 
put skip list ('How many primes do you want? ');
get list (nprimes);
if nprimes > maxprimes then
do;
nprimes = maxprimes;
put skip list ('Only generating',maxprimes,' primes.');
put skip list ('Press CR to continue.');
get edit (dummy) (a);
end;
 
/* initialize p with first prime number and display it */
p(1) = 2;
put skip list (p(1));
 
i = 1; /* count of prime numbers found so far */
k = 1; /* index of largest prime <= sqrt of n */
n = 3; /* current number being checked */
do while (i < nprimes);
s = p(k) * p(k);
if s <= n then k = k + 1;
divisible = false;
m = 1; /* index into primes already found */
do while ((m <= k) & (divisible = false));
divisor = p(m); /* can't put p(m) directly into mod()! */
if mod(n, divisor) = 0 then divisible = true;
m = m + 1;
end;
if divisible = false then /* found a prime */
do;
i = i + 1;
p(i) = n;
put list (n);
end;
n = n + 2; /* advance to next odd number */
end;
put skip list ('All done. Goodbye.');
end;
</syntaxhighlight>
{{out}}
<pre>
How many primes do you want? 100
2 3 5 7 11 13 17 19
23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89
* * *
419 421 431 433 439 443 449 457
461 463 467 479 487 491 499 503
509 521 523 541
All done. Goodbye.
</pre>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
function eratosthenes ($n) {
if($n -ge 1){
$prime = @(1..($n+1) | foreach{$true})
$prime[1] = $false
$m = [Math]::Floor([Math]::Sqrt($n))
for($i = 2; $i -le $m; $i++) {
if($prime[$i]) {
for($j = $i*$i; $j -le $n; $j += $i) {
$prime[$j] = $false
}
}
}
1..$n | where{$prime[$_]}
} else {
"$n must be equal or greater than 1"
}
}
function sieve-start-end ($start,$end) {
(eratosthenes $end) | where{$_ -ge $start}
}
"$(sieve-start-end 100 200)"
</syntaxhighlight>
<b>Output:</b>
<pre>
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
</pre>
 
=={{header|Prolog}}==
Creates a 2,3,5 factorization wheel to eliminate the majority of divisors and prime candidates before filtering.
<syntaxhighlight lang="prolog">
wheel235(L) :-
W = [6, 4, 2, 4, 2, 4, 6, 2 | W],
lazy_list(accumulate, 1/W, L).
 
accumulate(M/[A|As], N/As, N) :- N is M + A.
 
roll235wheel(Limit, A) :-
wheel235(W),
append(A, [N|_], W),
N > Limit, !.
 
prime235(N) :- % N is prime excepting multiples of 2, 3, 5.
wheel235(W),
wheel_prime(N, W).
 
wheel_prime(N, [D|_]) :- D*D > N, !.
wheel_prime(N, [D|Ds]) :- N mod D =\= 0, wheel_prime(N, Ds).
 
primes(Limit, [2, 3, 5 | Primes]) :-
roll235wheel(Limit, Candidates),
include(prime235, Candidates, Primes).
</syntaxhighlight>
{{Out}}
<pre>
?- primes(100, L), write(L).
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
L = [2, 3, 5, 7, 11, 13, 17, 19, 23|...].
 
?- primes(1000, L), length(L, N), last(L, X).
L = [2, 3, 5, 7, 11, 13, 17, 19, 23|...],
N = 168,
X = 997.
</pre>
 
=={{header|PureBasic}}==
<syntaxhighlight lang="purebasic">EnableExplicit
#SPC=Chr(32)
#TB=~"\t"
#TBLF=~"\t\n"
Define.i a,b,l,n,count=0
Define *count.Integer=@count
 
Procedure.i AddCount(*c.Integer) ; *counter: by Ref
*c\i+1
ProcedureReturn *c\i
EndProcedure
Procedure.s FormatStr(tx$,l.i)
Shared *count
If AddCount(*count)%10=0
ProcedureReturn RSet(tx$,l,#SPC)+#TBLF
Else
ProcedureReturn RSet(tx$,l,#SPC)+#TB
EndIf
EndProcedure
 
Procedure.b Trial(n.i)
Define.i i
For i=3 To Int(Sqr(n)) Step 2
If n%i=0 : ProcedureReturn #False : EndIf
Next
ProcedureReturn #True
EndProcedure
 
Procedure.b isPrime(n.i)
If (n>1 And n%2<>0 And Trial(n)) Or n=2 : ProcedureReturn #True : EndIf
ProcedureReturn #False
EndProcedure
 
OpenConsole("Sequence of primes by Trial Division")
PrintN("Input (n1<n2 & n1>0)")
Print("n1 : ") : a=Int(Val(Input()))
Print("n2 : ") : b=Int(Val(Input()))
l=Len(Str(b))
If a<b And a>0
PrintN(~"\nPrime numbers between "+Str(a)+" and "+Str(b))
For n=a To b
If isPrime(n)
Print(FormatStr(Str(n),l))
EndIf
Next
Print(~"\nPrimes= "+Str(*count\i))
Input()
EndIf</syntaxhighlight>
{{out}}
<pre>Input (n1<n2 & n1>0)
n1 : 10000
n2 : 11000
 
Prime numbers between 10000 and 11000
10007 10009 10037 10039 10061 10067 10069 10079 10091 10093
10099 10103 10111 10133 10139 10141 10151 10159 10163 10169
10177 10181 10193 10211 10223 10243 10247 10253 10259 10267
10271 10273 10289 10301 10303 10313 10321 10331 10333 10337
10343 10357 10369 10391 10399 10427 10429 10433 10453 10457
10459 10463 10477 10487 10499 10501 10513 10529 10531 10559
10567 10589 10597 10601 10607 10613 10627 10631 10639 10651
10657 10663 10667 10687 10691 10709 10711 10723 10729 10733
10739 10753 10771 10781 10789 10799 10831 10837 10847 10853
10859 10861 10867 10883 10889 10891 10903 10909 10937 10939
10949 10957 10973 10979 10987 10993
Primes= 106</pre>
 
=={{header|Python}}==
Using the basic ''prime()'' function from: [http://rosettacode.org/wiki/Primality_by_trial_division#Python "Primality by trial division"]
<syntaxhighlight lang="python">
def prime(a):
return not (a < 2 or any(a % x == 0 for x in xrange(2, int(a**0.5) + 1)))
 
def primes_below(n):
return [i for i in range(n) if prime(i)]
</syntaxhighlight>
{{out}}
<pre>>>> primes_below(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]</pre>
 
===Fun With Lists===
<syntaxhighlight lang="python">limiter = 100
primelist = []
def primer(n):
for d in primelist:
if d * d > n:
break
if n % d == 0:
return
primelist.append(n)
 
for vv in range(2, limiter):
primer(vv)
 
print(len(primelist))
print(*primelist)</syntaxhighlight>
 
{{out}}
<pre>25
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97</pre>
 
=={{header|Quackery}}==
 
Using word <code>isprime</code> from [[Primality by trial division#Quackery]].
 
Make a nest of primes less than n.
 
<syntaxhighlight lang="quackery">[ [] swap times
[ i^ isprime if
[ i^ join ] ] ] is primes< ( n --> [ )
 
100 primes< echo</syntaxhighlight>
 
{{Out}}
 
<pre>[ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ]</pre>
 
=={{header|Racket}}==
Line 323 ⟶ 2,865:
This example uses infinite lists (streams) to implement a sieve algorithm that produces all prime numbers.
 
<langsyntaxhighlight Racketlang="racket">#lang lazy
(define nats (cons 1 (map add1 nats)))
(define (sift n l) (filter (λ(x) (not (zero? (modulo x n)))) l))
(define (sieve l) (cons (first l) (sieve (sift (first l) (rest l)))))
(define primes (sieve (rest nats)))
(!! (take 25 primes))</langsyntaxhighlight>
 
==== Optimized with postponed processing ====
Line 334 ⟶ 2,876:
Since a prime's multiples that count start from its square, we should only add them when we reach that square.
 
<langsyntaxhighlight Racketlang="racket">#lang lazy
(define nats (cons 1 (map add1 nats)))
(define (sift n l) (filter (λ(x) (not (zero? (modulo x n)))) l))
Line 343 ⟶ 2,885:
(λ(t) (sieve (sift (car ps) t) (cdr ps))))))
(define primes (sieve (cdr nats) primes))
(!! (take 25 primes))</langsyntaxhighlight>
 
=== Using threads and channels ===
Line 349 ⟶ 2,891:
Same algorithm as above, but now using threads and channels to produce a channel of all prime numbers (similar to newsqueak). The macro at the top is a convenient wrapper around definitions of channels using a thread that feeds them.
 
<langsyntaxhighlight Racketlang="racket">#lang racket
(define-syntax (define-thread-loop stx)
(syntax-case stx ()
Line 366 ⟶ 2,908:
(let ([x (channel-get c)]) (out! x) (set! c (sift x c))))
(define primes (let ([ns (nats)]) (channel-get ns) (sieve ns)))
(for/list ([i 25] [x (in-producer (λ() (channel-get primes)))]) x)</langsyntaxhighlight>
 
=== Using generators ===
Line 372 ⟶ 2,914:
Yet another variation of the same algorithm as above, this time using generators.
 
<langsyntaxhighlight Racketlang="racket">#lang racket
(require racket/generator)
(define nats (generator () (for ([i (in-naturals 1)]) (yield i))))
Line 381 ⟶ 2,923:
(generator () (let loop ([g g]) (let ([x (g)]) (yield x) (loop (sift x g))))))
(define primes (begin (nats) (sieve nats)))
(for/list ([i 25] [x (in-producer primes)]) x)</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
Here is a straightforward implementation of the naive algorithm.
<syntaxhighlight lang="raku" line>constant @primes = 2, 3, { first * %% none(@_), (@_[* - 1], * + 2 ... *) } ... *;
 
say @primes[^100];</syntaxhighlight>
{{out}}
<pre>2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541</pre>
 
=={{header|REXX}}==
===somewhat optimized===
This is an open-ended approach and it's a simple implementation and could be optimized more with some easy programming.
<br>The method used is to divided all odd numbers by all previous odd primes up to and including the &nbsp; <big>'''√{{overline| &nbsp;}}'''</big> &nbsp; of the odd number.
 
<br>Usage note: &nbsp; by using a negative number (for the program's argument), the list of primes is suppressed, but the prime count is still shown.
Usage note: &nbsp; by using a negative number (for the program's argument), the list of primes is suppressed, but the prime count is still shown.
<lang rexx>/*REXX pgm lists a sequence of primes by testing primality by trial div.*/
<syntaxhighlight lang="rexx">/*REXX program lists a sequence of primes by testing primality by trial division. */
parse arg n . /*let user choose how many, maybe*/
ifparse arg n=='' . then n=26 /*ifget optional not,number thenof assumeprimes theto defaultfind*/
tell=if n>0; =='' | n=="," then n=abs(n) 26 /*N isNot negativespecified? Then Don'tuse the displaydefault.*/
@.1tell=2 (n>0); if tell then say right n= abs(@.1,9n) /*displayIs 2N asnegative? a specialThen case.don't display.*/
#=@.1=2; if tell then say right(@.1, 9) /*display 2 as a special prime case. /*# is the number of primes found*/
#=1 /*# [↑] is Nnumber defaultof listsprimes upfound to(so 101far)*/
do j=3 by 2 while #<n /*start with[↑] the firstN: odd primedefault lists up to 101 #s.*/
do j=3 by 2 while #<n /*start with the first odd prime. /* [↓] divide by the primes. ___*/
do k=2 to # while !.k<=j /*divide J[↓] with alldivide by the primes. ___ J */
ifdo j//@.k==02 thento iterate# while !.k<=j /*÷divide by aJ with all primes ≤ √ J previous prime? ¬prime.*/
endif /*j*//@.k==0 then iterate j /*÷ by prev. /*prime? [↑] ¬prime only divide up to___ √J. */
#=#+1 end /*j*/ /*bump the[↑] only divide up to √ J prime number counter. */
@.#=j; #+1 !.#=j*j /*definebump thisthe primecount &of itsnumber squareof primes. */
if@.#= tellj; then say right( !.#= j*j, 9) /*maybe displaydefine this prime──►termprime; define its square.*/
endif tell then say /*right(j*/ , 9) /* [↑] onlymaybe display this N prime primes.──► terminal*/
end /*j*/ /* [] only display theN primenumber count.of primes*/
say # ' primes found.' /*stick a[↓] fork indisplay it,number we'reof doneprimes found.*/</lang>
say # ' primes found.' /*stick a fork in it, we're all done. */</syntaxhighlight>
'''output''' using the default input of: &nbsp; <tt> 26 </tt>
{{out|output|text=&nbsp; when using the default input: &nbsp; &nbsp; <tt> 26 </tt>}}
<pre>
2
Line 438 ⟶ 2,990:
 
===more optimized===
This version shows how the REXX program may be optimized further by extending the list of low primes and the special low prime divisions &nbsp; (<big>'''//'''</big> &nbsp; tests).
<br>the special low prime divisions &nbsp; (the &nbsp; <big>'''//'''</big> &nbsp; tests, &nbsp; which is the &nbsp; ''remainder'' &nbsp; when doing division).
<lang rexx>/*REXX pgm lists a sequence of primes by testing primality by trial div.*/
<syntaxhighlight lang="rexx">/*REXX program lists a sequence of primes by testing primality by trial division. */
parse arg n . /*let user choose how many, maybe*/
ifparse arg N . n=='' then n=26 /*ifget optional not,number thenof assumeprimes theto defaultfind*/
tellif N=n>0;='' | N=="," then nN=abs(n) 26 /*N isNot negativespecified? Don'tThen assume displaydefault.*/
tell= (N>0); N= abs(N) /*N is negative? Then don't display. */
@.1=2; @.2=3; @.3=5; @.4=7; @.5=11; @.6=13; #=5; s=@.#+2
@.1=2; @.2=3; @.3=5; @.4=7; @.5=11; @.6=13; #= 5; s= /* [↑] is the @.# of+ low primes.*/2
do p=1 for # while p<=n /* [] don'tis the number compute,of justlow listprimes.*/
ifdo tellp=1 thenfor # while say right(@.p,9)<=N /*display some low primes. /* [↓] find primes, and maybe show 'em*/
!.p=@.p**2 if tell then say right(@.p, 9) /*alsodisplay computesome thepre─defined squaredlow valueprimes. */
end!.p= /*@.p*/*2 /*also [↑]compute the allowssquared fastervalue loopof belowP. */
end /*p*/ /* [] Nallows faster loop default(below). lists up to 101*/
do j=s by 2 while #<n /*start with[↓] the nextN: odd prime.default lists up to 101 #s.*/
ifdo j//=s 3by 2 while ==0 #<N then iterate /*is this number a triple? /*continue on with the next odd prime. */
ifparse var right(j, '' -1)==5 _ then iterate /* " " " " nickel? /*obtain the last digit of the J var.*/
if j//_ 7 ==0 5 then iterate /* " " " lucky?/*is this integer a multiple of five? */
if j // 11 3 ==0 then iterate /* " " " a multiple of" 11 " " three? */
if j // 7 ==0 then iterate /* " " " /* [↓] divide" " by the" primes.seven? ___*/
if j //11 ==0 then iterate do k=p to # while !.k<=j /*divide J" " " " by" other primes J" eleven?*/
if j//@.k==0 then iterate j /*÷ by[↓] a previousdivide prime?by the ¬primeprimes. ___ */
enddo k=p /*j*/ to # while !.k<=j /*divide [↑] J onlyby divideother upprimes ≤ √ J to √J. */
#=#+1 if j//@.k ==0 then iterate j /*÷ by prev. prime? ¬prime /*bump the prime___ number counter. */
@.#=j; !.#=j end /*jk*/ /*define this[↑] only divide up to √ J prime & its square.*/
#= #+1 /*bump the count of number of primes. */
if tell then say right(j, 9) /*maybe display this prime──►term*/
end@.#= j; /*j*/ !.#= j*j /* [↑] only display /*define Nthis prime; primes.define its square.*/
if tell then say right(j, 9) /* [↓] maybe display thethis prime count.──► terminal*/
say # end /*j*/ ' primes found.' /*stick a[↑] fork inonly it,display we'reN done.number of primes*/</lang>
/* [↓] display number of primes found.*/
'''output''' is the same as the 1<sup>st</sup> REXX version. <br>
say # ' primes found.' /*stick a fork in it, we're all done. */</syntaxhighlight>
{{out|output|text=&nbsp; is identical to the 1<sup>st</sup> REXX version.}} <br><br>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
for i = 1 to 100
if isPrime(i) see "" + i + " " ok
next
see nl
 
func isPrime n
if n < 2 return false ok
if n < 4 return true ok
if n % 2 = 0 return false ok
for d = 3 to sqrt(n) step 2
if n % d = 0 return false ok
next
return true
</syntaxhighlight>
 
=={{header|RPL}}==
<code>PRIM?</code> is defined at [[Primality by trial division#RPL|Primality by trial division]]
≪ { } 2 ROT '''FOR''' n
'''IF''' n <span style="color:blue">PRIM?</span> THEN n + '''END'''
'''NEXT'''
≫ '<span style="color:blue">PRIMES</span>' STO
 
50 <span style="color:blue">PRIMES</span>
{{out}}
<pre>
1: { 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 }
</pre>
 
=={{header|Ruby}}==
The Prime class in the standard library has several Prime generators. In some methods it can be specified which generator will be used. The generator can be used on it's own:
<langsyntaxhighlight lang="ruby">require "prime"
 
pg = Prime::TrialDivisionGenerator.new
p pg.take(10) # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
p pg.next # => 31</langsyntaxhighlight>
 
===By Trial Division w/Prime Generator===
See https://rosettacode.org/wiki/Primality_by_trial_division#Ruby
<syntaxhighlight lang="ruby">def primep5?(n) # P5 Prime Generator primality test
# P5 = 30*k + {7,11,13,17,19,23,29,31} # P5 primes candidates sequence
return [2, 3, 5].include?(n) if n < 7 # for small and negative values
return false if n.gcd(30) != 1 # 4/15 (8/30) of integers are P5 pc
p, sqrtn = 7, Integer.sqrt(n) # first P5 sequence value
until p > sqrtn
return false if # if n is composite
n % (p) == 0 || n % (p+4) == 0 || n % (p+6) == 0 || n % (p+10) == 0 ||
n % (p+12) == 0 || n % (p+16) == 0 || n % (p+22) == 0 || n % (p+24) == 0
p += 30 # first prime candidate for next kth residues group
end
true
end
 
# Create sequence of primes from 1_000_000_001 to 1_000_000_201
n = 1_000_000_001; n.step(n+200, 2) { |p| puts p if primep5?(p) }</syntaxhighlight>
{{out}}
<pre>1000000007
1000000009
1000000021
1000000033
1000000087
1000000093
1000000097
1000000103
1000000123
1000000181</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
fn is_prime(number: u32) -> bool {
#[allow(clippy::cast_precision_loss)]
let limit = (number as f32).sqrt() as u32 + 1;
 
// We test if the number is divisible by any number up to the limit
!(number < 2 || (2..limit).any(|x| number % x == 0))
}
 
fn main() {
println!(
"Primes below 100:\n{:?}",
(0_u32..100).fold(vec![], |mut acc, number| {
if is_prime(number) {
acc.push(number)
};
acc
})
);
}
</syntaxhighlight>
{{out}}
<pre>
Primes below 100:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
</pre>
 
=={{header|S-BASIC}}==
<syntaxhighlight lang="basic">
comment
Prime number generator in S-BASIC. Only odd numbers are
checked, and only the prime numbers previously found (up
to the square root of the number currently under examination)
are tested as divisors. Memory is conserved by saving only the
first 50 primes as potential divisors, since that is sufficient
to test all numbers up to 32767, which is the highest integer
value supported by S-BASIC
end
 
$lines
 
$constant false = 0
$constant true = 0FFFFH
 
var i, k, m, n, s, nprimes, divisible = integer
dim integer p(50)
 
rem compute p mod q
function mod(p, q = integer) = integer
end = p - q * (p / q)
 
input "How many primes do you want to generate",nprimes
 
rem initialize p with first prime and display it
p(1) = 2
print using "##### "; p(1);
 
rem now check odd numbers until nprimes are found
i = 1 rem count of primes found so far
k = 1 rem index of largest prime <= sqrt of n
n = 3 rem current number being checked
while i < nprimes do
begin
s = p(k) * p(k)
if s <= n then k = k + 1
divisible = false
m = 1 rem index into primes previously found
while (m <= k) and (divisible = false) do
begin
if mod(n, p(m)) = 0 then divisible = true
m = m + 1
end
if divisible = false then
begin
i = i + 1
if i <= 50 then p(i) = n
print using "##### ";n;
if pos(0) > 60 then print rem wrap long lines
end
n = n + 2
end
print "All done. Goodbye"
end
</syntaxhighlight>
{{out}}
<pre>
How many primes do you want to generate? 20
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
All done. Goodbye</pre>
 
=={{header|Scala}}==
===Odds-Only "infinite" primes generator using Streams and Co-Inductive Streams===
Using Streams, [http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf the "unfaithful sieve"], i.e. '''sub-optimal trial division sieve'''.
<langsyntaxhighlight lang="scala">def sieve(nums: Stream[Int]): Stream[Int] =
Stream.cons(nums.head, sieve((nums.tail).filter(_ % nums.head != 0)))
val primes = 2 #:: sieve(Stream.from(3, 2))
 
println(primes take 10 toList) // //List(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
println(primes takeWhile (_ < 30) toList) //List(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)</langsyntaxhighlight>
{{out}}Both println statements give the same results:
<pre>List(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)</pre>
 
The above code is extremely inefficient for larger ranges, both because it tests for primality using computationally expensive divide (modulo) operations and because it sets up deferred tests for division by all of the primes up to each prime candidate, meaning that it has approximately a square law computational complexity with range.
 
=={{header|Sidef}}==
Using the ''is_prime()'' function from: [http://rosettacode.org/wiki/Primality_by_trial_division#Sidef "Primality by trial division"]
<syntaxhighlight lang="ruby">func prime_seq(amount, callback) {
var (counter, number) = (0, 0);
while (counter < amount) {
if (is_prime(number)) {
callback(number);
++counter;
}
++number;
}
}
 
prime_seq(100, {|p| say p}); # prints the first 100 primes</syntaxhighlight>
 
=={{header|Spin}}==
This example uses totally naive looping over test divisors <code>d</code> of <code>n</code> up to <code>n-1</code> until a divisor is found or the range is exhausted. This results in <code>d == n</code> after the loop if <code>n</code> is prime.
{{works with|BST/BSTC}}
{{works with|FastSpin/FlexSpin}}
{{works with|HomeSpun}}
{{works with|OpenSpin}}
<syntaxhighlight lang="spin">con
_clkmode = xtal1+pll16x
_clkfreq = 80_000_000
 
obj
ser : "FullDuplexSerial"
 
pub main | d, n
 
ser.start(31, 30, 0, 115200)
 
repeat n from 2 to 100
 
repeat d from 2 to n-1
if n // d == 0
quit
 
if d == n
ser.dec(n)
ser.tx(32)
 
waitcnt(_clkfreq + cnt)
ser.stop</syntaxhighlight>
{{Out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
=={{header|Swift}}==
<syntaxhighlight lang="swift">import Foundation
 
extension SequenceType {
func takeWhile(include: Generator.Element -> Bool) -> AnyGenerator<Generator.Element> {
var g = self.generate()
return anyGenerator { g.next().flatMap{include($0) ? $0 : nil }}
}
}
 
var pastPrimes = [2]
 
var primes = anyGenerator {
_ -> Int? in
defer {
pastPrimes.append(pastPrimes.last!)
let c = pastPrimes.count - 1
for p in anyGenerator({++pastPrimes[c]}) {
let lim = Int(sqrt(Double(p)))
if (!pastPrimes.takeWhile{$0 <= lim}.contains{p % $0 == 0}) { break }
}
}
return pastPrimes.last
}</syntaxhighlight>
===Simple version===
{{works with|Swift 2 and Swift 3}}
<syntaxhighlight lang="swift">var primes = [2]
 
func trialPrimes(_ max:Int){
// fill array 'primes' with primes <= max, 1s for small values like 400_000
var cand = 3
while cand <= max {
for p in primes {
if cand % p == 0 {
break
}
if p*p > cand {
primes.append(cand)
break
}
}
cand += 2
}
}
 
trialPrimes(100)
print(primes)</syntaxhighlight>
{{out}}
<pre>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
</pre>
 
=={{header|Tailspin}}==
Simplest version
<syntaxhighlight lang="tailspin">
templates ifPrime
def n: $;
[2..~$n -> $n mod $] -> \(<~[<=0>]> $n ! \)!
end ifPrime
 
templates primes
[2..$ -> ifPrime] !
end primes
 
100 -> primes -> '$;
' -> !OUT::write
</syntaxhighlight>
{{out}}
<pre>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
</pre>
 
=={{header|Tcl}}==
As we're generating a sequence of primes, we can use that sequence of primes to describe what we're filtering against.
<langsyntaxhighlight lang="tcl">set primes {}
proc havePrime n {
global primes
Line 506 ⟶ 3,333:
}
}
puts ""</langsyntaxhighlight>
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
=={{header|uBasic/4tH}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="uBasic/4tH">' Print all primes from 101 to 999
For i = 101 To 999
If FUNC(_isPrime(i)) Then
Print Using "__# "; i;
EndIf
Next
 
Print : End
 
_isPrime
Param (1)
Local (2)
 
If a@ < 2 Then Return (0)
If a@ = 2 Then Return (1)
If (a@ % 2) = 0 Then Return (0)
b@ = FUNC(_Sqrt(a@, 0))
For c@ = 3 To b@ Step 2
If (a@ % c@) = 0 Then Unloop : Return (0)
Next
Return (1)
 
_Sqrt
Param (2)
Local (2)
 
If a@ = 0 Return (0)
c@ = Max(Shl(Set(a@, a@*(10^(b@*2))), -10), 1024)
 
Do
d@ = (c@+a@/c@)/2
While c@ > d@
c@ = d@
Loop
Return (c@)</syntaxhighlight>
{{Out}}
<pre>101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313
317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439
443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691
701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829
839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997
 
0 OK, 0:136</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="Vlang">
import math
 
fn main() {
for idx in 1..101 {if is_prime(idx) {println("${idx}")}}
}
 
fn is_prime(num int) bool {
if num < 2 {return false}
if num < 4 {return true}
if num % 2 == 0 {return false}
for idx := 3; idx <= math.sqrt(num); idx += 2 {
if num % idx == 0 {return false}
}
return true
}
</syntaxhighlight>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
Using a simple generator.
<syntaxhighlight lang="wren">import "./fmt" for Fmt
 
var primeSeq = Fiber.new {
Fiber.yield(2)
var n = 3
while (true) {
var isPrime = true
var p = 3
while (p * p <= n) {
if (n%p == 0) {
isPrime = false
break
}
p = p + 2
}
if (isPrime) Fiber.yield(n)
n = n + 2
}
}
 
var limit = 315
var count = 0
while (true) {
var p = primeSeq.call()
System.write("%(Fmt.d(4, p)) ")
count = count + 1
if (count%15 == 0) System.print()
if (count == limit) break
}</syntaxhighlight>
 
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197
199 211 223 227 229 233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349 353 359 367 373 379
383 389 397 401 409 419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541 547 557 563 569 571
577 587 593 599 601 607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733 739 743 751 757 761
769 773 787 797 809 811 821 823 827 829 839 853 857 859 863
877 881 883 887 907 911 919 929 937 941 947 953 967 971 977
983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069
1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187
1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291
1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427
1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511
1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613
1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733
1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867
1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987
1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">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;
for N:= 2 to 100 do
if IsPrime(N) then
[IntOut(0, N); ChOut(0, ^ )]</syntaxhighlight>
 
{{out}}
<pre>
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
</pre>
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">sub isPrime(v)
if v < 2 then return False : fi
if mod(v, 2) = 0 then return v = 2 : fi
if mod(v, 3) = 0 then return v = 3 : fi
d = 5
while d * d <= v
if mod(v, d) = 0 then return False else d = d + 2 : fi
wend
return True
end sub
 
for i = 101 to 999
if isPrime(i) print str$(i), " ";
next i
end</syntaxhighlight>
{{out}}
<pre>Igual que la entrada de FreeBASIC.</pre>
 
=={{header|zkl}}==
The code in [[Extensible prime generator#zkl]] is a much better solution to this problem.
{{trans|Python}}
<syntaxhighlight lang="zkl">fcn isPrime(p){
(p>=2) and (not [2 .. p.toFloat().sqrt()].filter1('wrap(n){ p%n==0 }))
}
fcn primesBelow(n){ [0..n].filter(isPrime) }</syntaxhighlight>
The Method filter1 stops at the first non False result, which, if there is one, is the first found diviser, thus short cutting the rest of the test.
<syntaxhighlight lang="zkl">primesBelow(100).toString(*).println();</syntaxhighlight>
{{out}}
<pre>
L(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97)
</pre>
9,482

edits