def _construct_composite(coeffs, opt): """Handle composite domains, e.g.: ZZ[X], QQ[X], ZZ(X), QQ(X). """ numers, denoms = [], [] for coeff in coeffs: numer, denom = coeff.as_numer_denom() numers.append(numer) denoms.append(denom) polys, gens = parallel_dict_from_basic(numers + denoms) # XXX: sorting if any(gen.is_number for gen in gens): return None # generators are number-like so lets better use EX n = len(gens) k = len(polys) // 2 numers = polys[:k] denoms = polys[k:] if opt.field: fractions = True else: fractions, zeros = False, (0,) * n for denom in denoms: if len(denom) > 1 or zeros not in denom: fractions = True break result = [] if not fractions: coeffs = set([]) for numer, denom in zip(numers, denoms): denom = denom[zeros] for monom, coeff in numer.iteritems(): coeff /= denom coeffs.add(coeff) numer[monom] = coeff rationals, reals = False, False for coeff in coeffs: if coeff.is_Rational: if not coeff.is_Integer: rationals = True elif coeff.is_Real: reals = True break if reals: ground = RR elif rationals: ground = QQ else: ground = ZZ domain = ground.poly_ring(*gens) for numer in numers: for monom, coeff in numer.iteritems(): numer[monom] = ground.from_sympy(coeff) result.append(domain(numer)) else: domain = ZZ.frac_field(*gens) for numer, denom in zip(numers, denoms): for monom, coeff in numer.iteritems(): numer[monom] = ZZ.from_sympy(coeff) for monom, coeff in denom.iteritems(): denom[monom] = ZZ.from_sympy(coeff) result.append(domain((numer, denom))) return domain, result
def _construct_composite(coeffs, opt): """Handle composite domains, e.g.: ZZ[X], QQ[X], ZZ(X), QQ(X). """ numers, denoms = [], [] for coeff in coeffs: numer, denom = coeff.as_numer_denom() numers.append(numer) denoms.append(denom) polys, gens = parallel_dict_from_basic(numers + denoms) # XXX: sorting if any(gen.is_number for gen in gens): return None # generators are number-like so lets better use EX n = len(gens) k = len(polys)//2 numers = polys[:k] denoms = polys[k:] if opt.field: fractions = True else: fractions, zeros = False, (0,)*n for denom in denoms: if len(denom) > 1 or zeros not in denom: fractions = True break result = [] if not fractions: coeffs = set([]) for numer, denom in zip(numers, denoms): denom = denom[zeros] for monom, coeff in numer.iteritems(): coeff /= denom coeffs.add(coeff) numer[monom] = coeff rationals, reals = False, False for coeff in coeffs: if coeff.is_Rational: if not coeff.is_Integer: rationals = True elif coeff.is_Real: reals = True break if reals: ground = RR elif rationals: ground = QQ else: ground = ZZ domain = ground.poly_ring(*gens) for numer in numers: for monom, coeff in numer.iteritems(): numer[monom] = ground.from_sympy(coeff) result.append(domain(numer)) else: domain = ZZ.frac_field(*gens) for numer, denom in zip(numers, denoms): for monom, coeff in numer.iteritems(): numer[monom] = ZZ.from_sympy(coeff) for monom, coeff in denom.iteritems(): denom[monom] = ZZ.from_sympy(coeff) result.append(domain((numer, denom))) return domain, result