Definitions

As used here, all unprimeable numbers   (positive integers)   are always expressed in base ten.



───── Definition from OEIS ─────:

Unprimeable numbers are composite numbers that always remain composite when a single decimal digit of the number is changed.



───── Definition from Wiktionary   (referenced from Adam Spencer's book) ─────:

(arithmetic)   that cannot be turned into a prime number by changing just one of its digits to any other
digit.   (sic)



Unprimeable numbers are also spelled:   unprimable.

All one─ and two─digit numbers can be turned into primes by changing a single decimal digit.



Examples

190   isn't unprimeable,   because by changing the zero digit into a three yields   193,   which is a prime.



The number   200   is unprimeable,   since none of the numbers   201, 202, 203, ··· 209   are
prime, and all the other numbers obtained by changing a single digit to
produce   100, 300, 400, ··· 900,   or   210, 220, 230, ··· 290   which are all even.



It is valid to change   189   into   089   by changing the   1   (one)   into
a   0   (zero),   which then the leading zero can be removed,   and then treated as if
the   "new"   number is   89.



Task

   show the first   35   unprimeable numbers   (horizontally, on one line, preferably with a title)
   show the   600th   unprimeable number
   (optional) show the lowest unprimeable number ending in a specific decimal digit   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
   (optional) use commas in the numbers where appropriate


Show all output here, on this page.



Also see

   the     OEIS     entry:   A118118 (unprimeable)
   with some useful counts to compare unprimeable number
   the Wiktionary entry (reference from below):   (arithmetic definition) unprimeable
   from the Adam Spencer book   (page 200):   Adam Spencer's World of Numbers       (Xoum Publishing)


 
bool is_unprimeable(int i)
{
    string s = i->digits();
    for(int offset; offset < sizeof(s); offset++) {
	foreach("0123456789"/1, string repl) {
	    array chars = s/1;
	    chars[offset] = repl;
	    int testme = (int)(chars*"");
	    if( testme->probably_prime_p() )
		return false;
	}
    }
    return true;
}
 
void main()
{
    int i, count;
    array unprimes = ({});
    mapping first_enders = ([]); // first unprimeable ending with each digit 
    while(sizeof(first_enders) != 10) {
	i++;
	if( is_unprimeable(i) ) {
	    count++;
	    unprimes += ({ i });
	    string last_digit = i->digits()[<0..];
	    if( !first_enders[last_digit] )
		first_enders[last_digit] = i;
	}
	werror("%d\r", i); // Progress output
    }
 
    write("First 35 unprimeables: %s\n\n", (array(string))unprimes[0..34]*" ");
    write("The 600th unprimeable is %d\n\n", unprimes[599]);
    write("The first unprimeable number that ends in\n");
    foreach(sort(indices(first_enders)), string e) {
	write("  %s is: %9d\n", e, first_enders[e]);
    }
}