Data update
This commit is contained in:
parent
72eb4943cb
commit
4d5544505c
2347 changed files with 62432 additions and 16731 deletions
|
|
@ -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}");
|
||||
|
|
@ -11,7 +11,7 @@ fastfunc nprim num .
|
|||
.
|
||||
prim = 2
|
||||
primcnt = 1
|
||||
proc nextprim . .
|
||||
proc nextprim .
|
||||
prim = nprim (prim + 1)
|
||||
primcnt += 1
|
||||
.
|
||||
|
|
|
|||
|
|
@ -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 ÷ */
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
...
|
||||
/* call Primes 105e3 */
|
||||
/* call First20 */
|
||||
/* call Between100and150 */
|
||||
/* call Between7700and8000 */
|
||||
/* call Number10000 */
|
||||
call Primes 1e8
|
||||
call Extended
|
||||
...
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue