#! /bin/sed -nf s/.*/&;9aaaaaaaaa8aaaaaaaa7aaaaaaa6aaaaaa5aaaaa4aaaa3aaa2aa1a0/ :encode s/\(a*\)\([0-9]\)\([0-9]*;.*\2\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4\3/ tencode s/;.*// # Compute a few common factors for speed. Clear the subst flag t7a # These are placed here to make the flow harder to understand :-) :2 a\ 2 b2a :3 a\ 3 b3a :5 a\ 5 b5a :7 a\ 7 :7a s/^\(aa*\)\1\{6\}$/\1/ t7 :5a s/^\(aa*\)\1\{4\}$/\1/ t5 :3a s/^\(aa*\)\1\1$/\1/ t3 :2a s/^\(aa*\)\1$/\1/ t2 /^a$/b # The quotient of dividing by 11 is a limit to the remaining prime factors s/^\(aa*\)\1\{10\}/\1=&/ # Pattern space looks like CANDIDATE\nNUMBER. When a candidate is valid, # the number is divided and the candidate is tried again :factor /^\(a\{7,\}\)=\1\1*$/! { # Decrement CANDIDATE, and search again if it is still >1 s/^a// /^aa/b factor # Print the last remaining factor: since it is stored in the NUMBER # rather than in the CANDIDATE, swap 'em: now NUMBER=1 s/\(.*\)=\(.*\)/\2=\1/ } # We have a prime factor in CANDIDATE! Print it h s/=.*/;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9/ :decode s/^\(a*\)\1\{9\}\(a\{0,9\}\)\([0-9]*;.*[^a]\2\([0-9]\)\)/\1\4\3/ /^a/tdecode s/;.*//p g :divide s/^\(a*\)\(=b*\)\1/\1\2b/ tdivide y/b/a/ # If NUMBER = 1, we don't have any more factors /aa$/bfactor