def radsimp(expr): """ Rationalize the denominator. Examples: ========= >>> from sympy import * >>> radsimp(1/(2+sqrt(2))) 1 - 1/2*2**(1/2) >>> x,y = map(Symbol, 'xy') >>> e = ( (2+2*sqrt(2))*x+(2+sqrt(8))*y )/( 2+sqrt(2) ) >>> radsimp(e) x*2**(1/2) + y*2**(1/2) """ n,d = fraction(expr) a,b,c = map(Wild, 'abc') r = d.match(a+b*Basic.sqrt(c)) if r is not None: a = r[a] if r[b] == 0: b,c = 0,0 else: b,c = r[b],r[c] syms = list(n.atoms(type=Basic.Symbol)) n = collect( (n*(a-b*Basic.sqrt(c))).expand(), syms ) d = a**2 - c*b**2 return n/d
def _eval_apply(cls, arg): arg = Basic.sympify(arg) if isinstance(arg, Basic.Number): if isinstance(arg, Basic.NaN): return S.NaN elif isinstance(arg, Basic.Infinity): return S.Infinity elif isinstance(arg, Basic.Integer): if arg.is_positive: return Basic.Factorial(arg-1) else: return S.ComplexInfinity elif isinstance(arg, Basic.Rational): if arg.q == 2: n = abs(arg.p) / arg.q if arg.is_positive: k, coeff = n, S.One else: n = k = n + 1 if n & 1 == 0: coeff = S.One else: coeff = S.NegativeOne for i in range(3, 2*k, 2): coeff *= i if arg.is_positive: return coeff*Basic.sqrt(S.Pi) / 2**n else: return 2**n*Basic.sqrt(S.Pi) / coeff