def unify_with_symbols(K0, K1, symbols): if (K0.is_Composite and (set(K0.symbols) & set(symbols))) or ( K1.is_Composite and (set(K1.symbols) & set(symbols))): raise UnificationFailed( "can't unify %s with %s, given %s generators" % (K0, K1, tuple(symbols))) return K0.unify(K1)
def unify(f, g): """Unify representations of two algebraic numbers. """ if not isinstance(g, ANP) or f.mod != g.mod: raise UnificationFailed("can't unify %s with %s" % (f, g)) if f.dom == g.dom: return f.dom, f.per, f.rep, g.rep, f.mod else: dom = f.dom.unify(g.dom) F = dup_convert(f.rep, f.dom, dom) G = dup_convert(g.rep, g.dom, dom) if dom != f.dom and dom != g.dom: mod = dup_convert(f.mod, f.dom, dom) else: if dom == f.dom: H = f.mod else: H = g.mod per = lambda rep: ANP(rep, mod, dom) return dom, per, F, G, mod
def frac_unify(f, g): """Unify representations of two multivariate fractions. """ if not isinstance(g, DMF) or f.lev != g.lev: raise UnificationFailed("can't unify %s with %s" % (f, g)) if f.dom == g.dom and f.ring == g.ring: return (f.lev, f.dom, f.per, (f.num, f.den), (g.num, g.den)) else: lev, dom = f.lev, f.dom.unify(g.dom) ring = f.ring if g.ring is not None: if ring is not None: ring = ring.unify(g.ring) else: ring = g.ring F = (dmp_convert(f.num, lev, f.dom, dom), dmp_convert(f.den, lev, f.dom, dom)) G = (dmp_convert(g.num, lev, g.dom, dom), dmp_convert(g.den, lev, g.dom, dom)) def per(num, den, cancel=True, kill=False, lev=lev): if kill: if not lev: return num/den else: lev = lev - 1 if cancel: num, den = dmp_cancel(num, den, lev, dom) return f.__class__.new((num, den), dom, lev, ring=ring) return lev, dom, per, F, G
def test_pickling_polys_errors(): from sympy.polys.polyerrors import ( ExactQuotientFailed, OperationNotSupported, HeuristicGCDFailed, HomomorphismFailed, IsomorphismFailed, ExtraneousFactors, EvaluationFailed, RefinementFailed, CoercionFailed, NotInvertible, NotReversible, NotAlgebraic, DomainError, PolynomialError, UnificationFailed, GeneratorsError, GeneratorsNeeded, ComputationFailed, UnivariatePolynomialError, MultivariatePolynomialError, PolificationFailed, OptionError, FlagError) x = Symbol('x') # TODO: TypeError: __init__() takes at least 3 arguments (1 given) # for c in (ExactQuotientFailed, ExactQuotientFailed(x, 3*x, ZZ)): # check(c) # TODO: TypeError: can't pickle instancemethod objects # for c in (OperationNotSupported, OperationNotSupported(Poly(x), Poly.gcd)): # check(c) for c in (HeuristicGCDFailed, HeuristicGCDFailed()): check(c) for c in (HomomorphismFailed, HomomorphismFailed()): check(c) for c in (IsomorphismFailed, IsomorphismFailed()): check(c) for c in (ExtraneousFactors, ExtraneousFactors()): check(c) for c in (EvaluationFailed, EvaluationFailed()): check(c) for c in (RefinementFailed, RefinementFailed()): check(c) for c in (CoercionFailed, CoercionFailed()): check(c) for c in (NotInvertible, NotInvertible()): check(c) for c in (NotReversible, NotReversible()): check(c) for c in (NotAlgebraic, NotAlgebraic()): check(c) for c in (DomainError, DomainError()): check(c) for c in (PolynomialError, PolynomialError()): check(c) for c in (UnificationFailed, UnificationFailed()): check(c) for c in (GeneratorsError, GeneratorsError()): check(c) for c in (GeneratorsNeeded, GeneratorsNeeded()): check(c) # TODO: PicklingError: Can't pickle <function <lambda> at 0x38578c0>: it's not found as __main__.<lambda> # for c in (ComputationFailed, ComputationFailed(lambda t: t, 3, None)): # check(c) for c in (UnivariatePolynomialError, UnivariatePolynomialError()): check(c) for c in (MultivariatePolynomialError, MultivariatePolynomialError()): check(c) # TODO: TypeError: __init__() takes at least 3 arguments (1 given) # for c in (PolificationFailed, PolificationFailed({}, x, x, False)): # check(c) for c in (OptionError, OptionError()): check(c) for c in (FlagError, FlagError()): check(c)
def unify(K0, K1, gens=None): """Returns a maximal domain containg `K0` and `K1`. """ if gens is not None: if (K0.is_Composite and (set(K0.gens) & set(gens))) or (K1.is_Composite and (set(K1.gens) & set(gens))): raise UnificationFailed( "can't unify %s with %s, given %s generators" % (K0, K1, tuple(gens))) if K0 == K1: return K0 if not K0.has_CharacteristicZero: if not K1.has_CharacteristicZero: if K0.mod == K1.mod and K0.dom == K1.dom: return K0 elif K1.is_ZZ: return K0 raise UnificationFailed("can't unify %s with %s" % (K0, K1)) if not K1.has_CharacteristicZero: if K0.is_ZZ: return K1 else: raise UnificationFailed("can't unify %s with %s" % (K0, K1)) if K0.is_EX: return K0 if K1.is_EX: return K1 if not K0.is_Exact: return K0 if not K1.is_Exact: return K1 if K0.is_Composite: if K1.is_Composite: if K0.gens == K1.gens: if K0.has_Field and K1.has_Field: if K0.dom.has_Field: return K0 else: return K1 elif K0.has_Field: if K0.dom == K1.dom: return K0 elif K1.has_Field: if K0.dom == K1.dom: return K1 else: if K0.dom.has_Field: return K0 else: return K1 else: gens = set(K0.gens + K1.gens) try: gens = sorted(gens) except TypeError: gens = list(gens) if K0.has_Field and K1.has_Field: if K0.dom.has_Field: return K0.__class__(K0.dom, *gens) else: return K1.__class__(K1.dom, *gens) elif K0.has_Field: if K0.dom == K1.dom: return K0.__class__(K0.dom, *gens) elif K1.has_Field: if K0.dom == K1.dom: return K1.__class__(K1.dom, *gens) else: if K0.dom.has_Field: return K0.__class__(K0.dom, *gens) else: return K1.__class__(K1.dom, *gens) elif K1.is_Algebraic: return K0.__class__(K1.unify(K0.dom), *K0.gens) else: if K0.has_Field: if K0.dom == K1: return K0 else: if K0.dom.has_Field: return K0 else: return K0.__class__(K1, *K0.gens) elif K0.is_Algebraic: if K1.is_Composite: return K1.__class__(K0.unify(K1.dom), *K1.gens) elif K1.is_Algebraic: raise NotImplementedError( "unification of different algebraic extensions") elif K1.is_ZZ or K1.is_QQ: return K0 else: raise UnificationFailed("can't unify %s with %s" % (K0, K1)) else: if K1.is_Composite: if K1.has_Field: if K0 == K1.dom: return K1 else: if K1.dom.has_Field: return K1 else: return K1.__class__(K0, *K1.gens) elif K1.is_Algebraic: if K0.is_ZZ or K0.is_QQ: return K1 else: raise UnificationFailed("can't unify %s with %s" % (K0, K1)) else: if K0.has_Field: return K0 else: return K1 from sympy.polys.domains import EX return EX