Data update

This commit is contained in:
Ingy döt Net 2025-06-11 20:16:52 -04:00
parent 72eb4943cb
commit 4d5544505c
2347 changed files with 62432 additions and 16731 deletions

View file

@ -0,0 +1,88 @@
using System.Collections;
IEnumerable<int> StartSieve(int length)
{
yield return 2;
BitArray sieve = new(length);
var i = 3;
while (i < length)
{
if (!sieve[i])
{
yield return i;
var j = i * i;
while (j < length)
{
sieve[j] = true;
j += i;
}
}
i += 2;
}
}
IEnumerable<int> AllPrimes()
{
foreach (var prime in StartSieve(1000))
{
yield return prime;
}
var start = 1000;
while (true)
{
foreach (var prime in Sieve(start, 1000))
{
yield return prime;
}
start += 1000;
}
}
IEnumerable<int> Sieve(int start, int length)
{
var sieve = new BitArray(length);
foreach (var p in AllPrimes().Skip(1).TakeWhile(n => n * n < start + length))
{
var j = p * ((start + p - 1) / p);
while (j < start + length)
{
sieve[j - start] = true;
j += p;
}
}
for (var j = 1 - (start % 2); j < length; j += 2)
{
if (!sieve[j])
yield return start + j;
}
}
Console.Write("First 20 primes:");
foreach (var p in AllPrimes().Take(20))
Console.Write($" {p}");
Console.WriteLine();
Console.Write("Primes between 100 and 150:");
foreach (var p in Sieve(100, 50))
Console.Write($" {p}");
Console.WriteLine();
Console.Write("Number of primes between 7700 and 8000:");
var n = Sieve(7700, 300).Count();
Console.WriteLine($" {n}");
Console.Write("10000th prime:");
var t = AllPrimes().Skip(9999).First();
Console.WriteLine($" {t}");

View file

@ -11,7 +11,7 @@ fastfunc nprim num .
.
prim = 2
primcnt = 1
proc nextprim . .
proc nextprim .
prim = nprim (prim + 1)
primcnt += 1
.

View file

@ -1,50 +0,0 @@
/*REXX program calculates and displays primes using an extendible prime number generator*/
parse arg f .; if f=='' then f= 20 /*allow specifying number for 1 ──► F.*/
_i= ' (inclusive) '; _b= 'between '; _tnp= 'the number of primes' _b; _tn= 'the primes'
call primes f; do j=1 for f; $= $ @.j; end /*j*/
say 'the first ' f " primes are: " $
say
call primes -150; do j=100 to 150; if !.j==1 then $= $ j; end /*j*/
say _tn _b '100 to 150' _i "are: " $
say
call primes -8000; do j=7700 to 8000; if !.j==1 then $= $ j; end /*j*/
say _tnp '7,700 and 8,000' _i "is: " words($)
say
call primes 10000
say 'the 10,000th prime is: ' @.10000
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
primes: procedure expose !. @. $ #; parse arg H,,$; Hneg= H<0; H= abs(H)
if symbol('#')=="LIT" then call .primI /*1st time here? Then initialize stuff*/
if Hneg then if H<=@.# then return /*do we have a high enough P already?*/
else nop /*this is used to match the above THEN.*/
else if H<=# then return /*are there enough primes currently ? */
/* [↓] gen more primes within range. */
do j=@.#+2 by 2; parse var j '' -1 _ /*find primes until have H Primes. */
if _==5 then iterate /*is the right─most digit a 5 (five)? */
if j// 3==0 then iterate /*is J divisible by three? (& etc.)*/
if j// 7==0 then iterate; if j//11==0 then iterate; if j//13==0 then iterate
if j//17==0 then iterate; if j//19==0 then iterate; if j//23==0 then iterate
if j//29==0 then iterate; if j//31==0 then iterate; if j//37==0 then iterate
if j//41==0 then iterate; if j//43==0 then iterate; if j//47==0 then iterate
if j//53==0 then iterate; if j//59==0 then iterate; if j//61==0 then iterate
if j//67==0 then iterate; if j//71==0 then iterate; if j//73==0 then iterate
if j//79==0 then iterate; if j//83==0 then iterate; if j//89==0 then iterate
if j//97==0 then iterate; if j//101==0 then iterate; if j//103==0 then iterate
x= j; r= 0; q= 1; do while q<=x; q= q*4; end /*R: the sqrt(J).*/
do while q>1; q=q%4; _=x-r-q; r=r%2; if _>=0 then do;x=_;r=r+q; end; end
do k=@.lowP while @.k<=r /*÷ by the known odd primes (hardcoded)*/
if j//@.k==0 then iterate j /*J ÷ by a prime? Then not prime. ___*/
end /*k*/ /* [↑] divide by odd primes up to √ J */
#= # + 1 /*bump the number of primes found. */
@.#= j; !.j= 1 /*assign to sparse array; prime²; P#.*/
if Hneg then if H<=@.# then leave /*is this a high enough prime? */
else nop /*used to match the above THEN. */
else if H<=# then leave /*have enough primes been generated? */
end /*j*/ /* [↑] keep generating until enough. */
return /*return to invoker with more primes. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
.primI: !.=0; @.=0; /*!.x= a prime or not; @.n= Nth prime.*/
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 101 103
do #=1 for words(L); p= word(L, #); @.#= p; !.p=1; end /*#*/
#= # - 1; @.lowP= #; return /*#: # primes; @.lowP: start of ÷ */

View file

@ -1,9 +0,0 @@
...
/* call Primes 105e3 */
/* call First20 */
/* call Between100and150 */
/* call Between7700and8000 */
/* call Number10000 */
call Primes 1e8
call Extended
...

View file

@ -1,50 +1,25 @@
-- 22 Mar 2025
include Settings
say version; say 'Extensible prime generator'; say
say 'EXTENSIBLE PRIME GENERATOR'
say version
say
numeric digits 9
call Primes 105e3
call First20
call Between100and150
call Between7700and8000
call Number10000
/* call Primes 1e8 */
/* call Extended */
call Primes 1e8
call Extended
say Format(Time('e'),,3) 'seconds'
exit
Primes:
/* Prime numbers */
procedure expose prim. work.
arg x
/* Init */
prim. = 0
/* Fast values */
if x = 1 then
return 0
/* Sieve of Eratosthenes */
work. = 1
do i = 3 by 2 to x while i*i <= x
if work.prime.i then do
do j = i*i by i+i to x
work.prime.j = 0
end
end
end
/* Save results */
n = 1; prim.prime.1 = 2; prim.flag.2 = 1
do i = 3 by 2 to x
if work.prime.i then do
n = n+1; prim.prime.n = i; prim.flag.i = 1
end
end
prim.0 = n
return n
First20:
procedure expose prim.
say 'The first 20 prime numbers are:'
do i = 1 to 20
call charout ,right(prim.prime.i,3)
call charout ,right(prim.i,3)
if i//10 = 0 then
say
end
@ -56,7 +31,7 @@ procedure expose prim.
say 'Prime numbers between 100 and 150 are:'
n = 0
do i = 1
a = prim.prime.i
a = prim.i
if a < 100 then
iterate i
if a > 150 then
@ -71,10 +46,10 @@ return
Between7700and8000:
procedure expose prim.
say 'Prime numbers between 7700 and 8000:'
say 'Prime numbers between 77022 Mar 2025:'
n = 0
do i = 1
a = prim.prime.i
a = prim.i
if a < 7700 then
iterate i
if a > 8000 then
@ -87,7 +62,7 @@ return
Number10000:
procedure expose prim.
say 'The 10000th prime number is:'
say prim.prime.10000
say prim.10000
say
return
@ -95,12 +70,13 @@ Extended:
procedure expose prim.
do i = 1 to 6
j = 10**i
say 'The' j'th prime is' prim.prime.j
say 'The' j'th prime is' prim.j
end
say 'The 5500000th prime is' prim.prime.5500000
say 'The 5500000th prime is' prim.5500000
say
return
include Functions
include Sequences
include Numbers
include Abend