program fractran; p := parse_fractran( "17/91 78/85 19/51 23/38 29/33 77/29 95/23 77/19 " + "1/17 11/13 13/11 15/14 15/2 55/1" ); print(frac_run_steps(p, 2, 15)); print(frac_primes(p, 2, 20)); proc frac_primes(p, n, nprimes); primes := []; loop for i in [1..nprimes] do loop until n bit_and (n-1) = 0 do n := frac_step(p, n); end loop; primes with:= log n/log 2; end loop; return primes; end proc; proc frac_run_steps(p, n, steps); return [n] + [n := frac_step(p, n) : i in [2..steps]]; end proc; proc frac_step(p, n); if exists [num, denom] in p | n * num mod denom = 0 then return n * num div denom; end if; return om; end proc; proc rdws(rw s); span(s, " \t\n"); end proc; proc rdnum(rw s); rdws(s); return val span(s, "0123456789"); end proc; proc rdfrac(rw s); if (num := rdnum(s)) = om then return om; end if; rdws(s); if match(s, "/") = "" then return om; end if; if (denom := rdnum(s)) = om then return om; end if; return [num, denom]; end proc; proc parse_fractran(s); return [f := rdfrac(s) : until f=om]; end proc; end program;