(Python)
from itertools import count, islice
from math import gcd
from sympy import factorint, integer_nthroot
def
A370688_gen(startvalue=0): # generator of terms >= startvalue
if startvalue <=0: yield 0
if startvalue <=1: yield 1
for k in count(max(startvalue, 2)):
r = 1 + (k - 1) % 9
if r>1:
kmin, kmax = 0, 1
while r**kmax <= k:
kmax <<= 1
while True:
kmid = kmax+kmin>>1
if r**kmid > k:
kmax = kmid
else:
kmin = kmid
if kmax-kmin <= 1:
break
if r**kmin==k:
m = integer_nthroot(k, gcd(*factorint(k).values()))[0]
if m == r:
yield k
(Python)
# faster program based on theorem
from itertools import islice
def
A370688_gen(): # generator of terms
kmax, mlist, dlist = 10, [7, 7, 4], [6, 6, 3]
yield from (0, 1, 2, 3, 5, 6, 7)
while True:
klist = []
for i, p in enumerate((2, 5, 7)):
while (k:=p**mlist[i]) <= kmax:
klist.append(k)
mlist[i] += dlist[i]
yield from sorted(klist)
kmax *= 10