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