Data update

This commit is contained in:
Ingy döt Net 2024-07-13 15:19:22 -07:00
parent 29a5eea0d4
commit 5c1bb7bfa9
2011 changed files with 35081 additions and 3229 deletions

View file

@ -1,38 +1,76 @@
/*REXX program finds largest left─ and right─truncatable primes ≤ 1m (or argument 1).*/
parse arg hi .; if hi=='' then hi= 1000000 /*Not specified? Then use default of 1m*/
call genP /*generate some primes, about hi ÷ 2 */
/* [↓] find largest left truncatable P*/
do L=# by -1 for # /*search from top end; get the length.*/
do k=1 for length(@.L); _= right(@.L, k) /*validate all left truncatable primes.*/
if \!._ then iterate L /*Truncated number not prime? Skip it.*/
end /*k*/
leave /*egress, found left truncatable prime.*/
end /*L*/
/* [↓] find largest right truncated P.*/
do R=# by -1 for # /*search from top end; get the length.*/
do k=1 for length(@.R); _= left(@.R, k) /*validate all right truncatable primes*/
if \!._ then iterate R /*Truncated number not prime? Skip it.*/
end /*k*/
leave /*egress, found right truncatable prime*/
end /*R*/
/*REXX program finds largest left- and right-truncatable primes less than hi */
Parse Arg hi .
If hi=='' Then
hi=1000000 /* Not specified? Then use default */
Call genP /* generate primes up to hi */
say 'The largest lefttruncatable prime ' hi " is " right(@.L, w)
say 'The largest righttruncatable prime ' hi " is " right(@.R, w)
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
genP: !.= 0; w= length(hi) /*placeholders for primes; max width. */
@.1=2; @.2=3; @.3=5; @.4=7; @.5=11 /*define some low primes. */
!.2=1; !.3=1; !.5=1; !.7=1; !.11=1 /* " " " " flags. */
#=5; s.#= @.# **2 /*number of primes so far; prime². */
/* [↓] generate more primes ≤ high.*/
do j=@.#+2 by 2 for max(0, hi%2-@.#%2-1) /*find odd primes from here on. */
parse var j '' -1 _; if _==5 then iterate /*J divisible by 5? (right dig)*/
if j// 3==0 then iterate /*" " " 3? */
if j// 7==0 then iterate /*" " " 7? */
/* [↑] the above five lines saves time*/
do k=5 while s.k<=j /* [↓] divide by the known odd primes.*/
if j // @.k == 0 then iterate j /*Is J ÷ X? Then not prime. ___ */
end /*k*/ /* [↑] only process numbers ≤ √ J */
#= #+1; @.#= j; s.#= j*j; !.j= 1 /*bump # of Ps; assign next P; P²; P# */
end /*j*/
return
/* find largest left truncatable Prime */
Do l=prime.0 By -1 /* search from top end; */
left.0=length(prime.l)
Do k=1 For length(prime.l)
_=right(prime.l,k) /* validate left truncatable ptime */
left.k=_
If \is_prime._ Then
Iterate l /* Truncated number not prime? Skip */
End
Leave
End
/* find largest right truncated Prime */
Do r=prime.0 By -1 /* search from top end; */
right.0=length(prime.r)
Do k=1 For length(prime.r)
_=left(prime.r,k)
right.k=_
If \is_prime._ Then
Iterate r /* Truncated number not prime? Skip */
End
Leave
End
Say 'The largest left-truncatable prime smaller than' hi 'is' prime.l
do i=left.0-1 to 1 By -1
say right(left.i,66)
End
Say 'The largest right-truncatable prime smaller than' hi 'is' prime.r
do i=right.0-1 to 1 By -1
say copies(' ',60)right.i
End
Exit /* stick a fork in it, we're all done */
/*-----------------------------------------------------------------------------*/
genp:
Call time 'R'
Call init 2 3 5 7 11 13 17 19
Do j=21 to hi By 2
Select
When right(j,1)=5 Then Iterate
When j//3==0 Then Iterate
When j//7==0 Then Iterate
Otherwise Nop
End
Do k=5 While s.k<=j
If j//prime.k==0 Then
Iterate j
End
Call store j /* j is prime */
End
Say prime.0 'primes smaller than' hi '--' time('E') 'seconds'
Return
init:
Parse Arg plist
is_prime.=0
prime.=0
Do i=1 To words(plist)
Call store word(plist,i)
End
Return
store:
Parse Arg p
z=prime.0+1
prime.z=p
s.z=p*p
prime.0=z
is_prime.p=1
Return