def field_isomorphism_factor(a, b):
 (_, factors) = factor_list(a.minpoly, extension=b)
 for (f, _) in factors:
  if (f.degree() == 1):
   coeffs = f.rep.TC().to_sympy_list()
   (d, terms) = ((len(coeffs) - 1), [])
   for (i, coeff) in enumerate(coeffs):
    terms.append((coeff * (b.root ** (d - i))))
   root = Add(*terms)
   if ((a.root - root).evalf(chop=True) == 0):
    return coeffs
   if ((a.root + root).evalf(chop=True) == 0):
    return [(- c) for c in coeffs]
 else:
  return None

def field_isomorphism_factor ( a , b ) : ( _ , factors ) = factor_list ( a . minpoly , extension = b ) for ( f , _ ) in factors : if ( f . degree ( ) == 1 ) : coeffs = f . rep . TC ( ) . to_sympy_list ( ) ( d , terms ) = ( ( len ( coeffs ) - 1 ) , [ ] ) for ( i , coeff ) in enumerate ( coeffs ) : terms . append ( ( coeff * ( b . root ** ( d - i ) ) ) ) root = Add ( * terms ) if ( ( a . root - root ) . evalf ( chop = True ) == 0 ) : return coeffs if ( ( a . root + root ) . evalf ( chop = True ) == 0 ) : return [ ( - c ) for c in coeffs ] else : return None
construct field isomorphism via factorization .