def getOddPrimesFrom5():
  x = 3
  p = [3]

  def isOddNumberPrime(n):
    for x in p:
      if x * x > n: return True
      if n % x == 0: return False  
  
  while True:
    x += 2
    if isOddNumberPrime(x):
      p.append(x)
      yield x

def getWith5OddDivs():
  x = 3**4
  p4m = []

  for p in getOddPrimesFrom5():
    print('Add new prime:', p)
    p = p**4
    if p < x:
      p4m.append(p)
    else:
      p4m.append(x)
      p4m.append(p)
      print('Now using array:', p4m)
      
      while True:
        x = p4m[0]
        yield x
        x <<= 1

        for i in range(1, len(p4m)):
          if x < p4m[i]:
            p4m[i-1] = x
            break
          p4m[i-1] = p4m[i]
        else:
          p4m.pop()
          break

for x in getWith5OddDivs():
  print(x)
  if x > 50000000: break