(Python)
from sympy import factorint, isprime
def nd(s): return sorted(s) == list(s)
def ok(n):
if n < 4 or isprime(n): return False
s, f = str(n), "".join(str(p)*e for p, e in factorint(n).items())
return nd(s+f)
(Python) # faster for initial segment of sequence
from sympy import factorint, isprime
from itertools import count, islice, combinations_with_replacement as mc
def nd(s): return s == "".join(sorted(s))
def bgen(d): # can't end in 8 or 9
yield from ("".join(m) for m in mc("1234567", d))
def agen(): # generator of terms
for d in count(2):
for s in bgen(d):
t = int(s)
if any(s[-1] > c and t%int(c) == 0 for c in "2357"): continue
if isprime(t): continue
if nd(s+"".join(str(p)*e for p, e in factorint(t).items())):
yield t