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)