Загрузка данных


def ostrogradsky_integral_radical(f, x):
    def R(a):
        try:
            return a.radical_expression()
        except Exception:
            return a

    def pint(p):
        return sum(p[i]*x^(i+1)/(i+1) for i in range(p.degree()+1)) if p != 0 else 0

    def pfdint(fr):
        fr = FractionField(AA[x])(fr)
        g, h = fr.numerator(), fr.denominator()
        lc = h.leading_coefficient()
        g = g / lc
        h = h / lc
        if h.degree() == 1:
            a = -AA(h[0])
            c = AA(g)
            return R(c) * log(abs(x - R(a)))
        
        b0 = AA(g.subs(x=0))
        b1 = AA(diff(g, x))
        a0 = AA(h.subs(x=0))
        a1 = AA(diff(h, x).subs(x=0))
        s = (-a1^2 + 4*a0).sqrt()
        return (
            1/2*R(b1)*log(x^2 + R(a1)*x + R(a0))
            - R(a1*b1 - 2*b0) * arctan((R(a1) + 2*x)/R(s)) / R(s)
        )

    K = FractionField(QQ[x])
    f = K(f)
    num = QQ[x](f.numerator())
    den = QQ[x](f.denominator())
    q, r = num.quo_rem(den)
    ans = pint(q)
    if r == 0:
        return ans
        
    alg, logpart = ostrogradski(K(r)/K(den), x)
    pfd = FractionField(AA[x])(logpart).partial_fraction_decomposition()
    ans += alg
    ans += pint(AA[x](pfd[0]))
    for part in pfd[1]:
        ans += pfdint(part)
    return ans

# Пример использования
f = x^10/(x^3+8)^3
F = ostrogradsky_integral_radical(f, x)
print(F)