zOs/REXX/PRIME
parse arg st
numeric digits 15
do qx=1 to 20
m.q.qx = qx
end
do i=0 to 18
call permut q, i
say right(i,4) 'sqrt' right(sqrt(i), 2) ,
'isPrime' isPrime(i) 'nxPrime' right(nxPrime(i), 4) ,
'permut' m.q.0 '>' m.q.1 m.q.2 m.q.3 m.q.4 m.q.5
end
exit
say 2**32 2**31 2**30 2**20
if st = '' then
st = 2147483647
say 'starting from st' st
cnt = 0
q = 2
f = 2
sqrt: procedure expose m.
parse arg n
if n < 2 then
return n
k = 1
g = n
do while k+1 < g
m = (g + k) % 2
if m * m <= n then
k = m
else
g = m
end
return k
endProcedure sqrt
isPrime: procedure expose m.
parse arg n
if n < 2 then
return 0
if n // 2 = 0 then
return n = 2
do q=3 by 2 to sqrt(n)
if n // q = 0 then
return 0
end
return 1
endProcedure isPrime
nxPrime: procedure expose m.
parse arg n
do i = n + (\ (n // 2)) by 2
if isPrime(i) then
return i
end
endProcedure nxPrime
permut: procedure expose m.
parse arg m, p
m.m.1 = 1
do i=2 while p > 0
j = i - (p // i)
m.m.i = m.m.j
m.m.j = i
p = p % i
say 'i='i 'j='j 'p='p m.m.1 m.m.2 m.m.3 m.m.4
end
m.m.0 = i-1
return i-1
endProcedure permut
permu2: procedure expose m.
parse arg seq, p, i, f
if i == '' then
return permu2(seq, p, 2, 2)
if f > p then
return seq
s2 = permu2(seq, p, i+1, f * (i+1))
k = p // (f * (i+1)) % f
m.m.1 = 1
do i=2 while p > 0
j = i - (p // i)
m.m.i = m.m.j
m.m.j = i
p = p % i
say 'i='i 'j='j 'p='p m.m.1 m.m.2 m.m.3 m.m.4
end
m.m.0 = i-1
return i-1
endProcedure permut
do while (q+1)**2 <= st
if trunc(f*q) > q then
do while (f*q)**2 <= st
q = trunc(f*q)
end
else
do while (q+1)**2 <= st
q = q + 1
end
f = (f+1) / 2
end
say 'st='st 'q='q 'q**2='q**2 '(q+1)**2=' || (q+1)**2
do n=st + 1 - st//2 by -2 while cnt < 3
do d=3 by 2 to q while n // d \= 0
if d // 1000000 = 1 then
say d
end
if d > q then do
say 'prime' n
/* say n '1:'right(100000//N,5) '4:'right(400000//N, 5),
'8:'right(800000//N,5) '12:'right(1200000//N, 5) */
cnt = cnt + 1
end
end