(f, t, **kwargs)
return (fa, fd)
Returns the tuple (fa, fd), where fa and fd are Polys in t.

    This is a common idiom in the Risch Algorithm functions, so we abstract
    it out here.  f should be a basic expresion, a Poly, or a tuple (fa, fd),
    where fa and fd are either basic expressions or Polys, and f == fa/fd.
    **kwargs are applied to Poly.
Returns the tuple (fa, fd), where fa and fd are Polys in t.
Returns the tuple ( fa fd ) where fa and fd are Polys in t .
def frac_in(f, t, **kwargs):
    """
    Returns the tuple (fa, fd), where fa and fd are Polys in t.

    This is a common idiom in the Risch Algorithm functions, so we abstract
    it out here.  f should be a basic expresion, a Poly, or a tuple (fa, fd),
    where fa and fd are either basic expressions or Polys, and f == fa/fd.
    **kwargs are applied to Poly.
    """
    cancel = kwargs.pop('cancel', False)
    if type(f) is tuple:
        fa, fd = f
        f = fa.as_expr()/fd.as_expr()
    fa, fd = f.as_expr().as_numer_denom()
    fa, fd = fa.as_poly(t, **kwargs), fd.as_poly(t, **kwargs)
    if cancel:
        fa, fd = fa.cancel(fd, include=True)
    if fa is None or fd is None:
        raise ValueError("Could not turn %s into a fraction in %s." % (f, t))
    return (fa, fd)
def frac_in ( f , t , * * kwargs ) : cancel = kwargs . pop ( 'cancel' , False ) if type ( f ) is tuple : fa , fd = f f = fa . as_expr ( ) / fd . as_expr ( ) fa , fd = f . as_expr ( ) . as_numer_denom ( ) fa , fd = fa . as_poly ( t , * * kwargs ) , fd . as_poly ( t , * * kwargs ) if cancel : fa , fd = fa . cancel ( fd , include = True ) if fa is None or fd is None : raise ValueError ( "Could not turn %s into a fraction in %s." % ( f , t ) ) return ( fa , fd )