Возможно это тоже будет интересно.
Пусть дано кубическое уравнение
, где
и неизвестное
.
Решим в рациональных числах
уравнение
Тогда
Уравнение для рациональных
это диофантово уравнение
, где
и
.
В
pari/gp это уравнение можно параметрически решить кодом
M=matdiagonal([r,s,-t]);Q=qfparam(M,qfsolve(M)).
Пусть
параметры в параметрическом решении
. Тогда получается что в зависимости от произвольных
каждый конкретный корень
имеет безконечную серию различных арифметических форм численно одного и того же значения.
(Wolfram код для проверки)
Автоматизация проверки пока не полная с некоторым ручным трудом.
Код:
Clear[f, a, b, c, A, B, z, v, m, n]
{f, a, b, c} = RandomInteger[{-100, 100}, 4]; {f, a, b, c} = {-56, 24, 8, 1};
Print["\nEquation: ", (-f + a x + b x^2 + c x^3) // Factor, " = 0\n"];
{-(2 A (a^2 + 3 b f) - (a b + 9 c f))^2, (a^2 + 3 b f) (1/B)^2, ((a b + 9 c f)^2 - 4 (b^2 - 3 a c) (a^2 + 3 b f))} // Factor
Если GCD трех коэффициентов отличается от 1, то нужно разделить на него, например так
Код:
GCD[-576 , -768, 72768]
-{-576 , -768, 72768}/192
Найденные коэффициенты использовать в
pari/gp например так
M=matdiagonal([3,1,-379]);Q=qfparam(M,qfsolve(M));
? print (Q[1, 1]*m^2 + Q[1, 2]*m*n + Q[1, 3]*n^2)
-33*m^2 + 8*n*m + 11*n^2
? print(Q[2,1]*m^2+Q[2,2]*m*n+Q[2,3]*n^2)
-12*m^2 - 66*n*m + 4*n^2
? print(Q[3,1]*m^2+Q[3,2]*m*n+Q[3,3]*n^2)
-3*m^2 - n^2Полученную параметризацию скопипастить из
pari/gp в
W.Mathematica чтоб найти
Код:
Solve[(-13 + 64 A) == (-33*m^2 + 8*n*m + 11*n^2)/(-3*m^2 - n^2), A]
Solve[2/B == (-12*m^2 - 66*n*m + 4*n^2)/(-3*m^2 - n^2), B]
И в итоге
Код:
{m, n} = RandomInteger[{-100, 100}, 2];(*{m,n}={1,1};*)
A = (36 m^2 - 4 m n + n^2)/(32 (3 m^2 + n^2)); B = (3 m^2 + n^2)/(6 m^2 + 33 m n - 2 n^2);
v = -4 B^3 ((2 a A - b) (a^2 A^2 - a A b - 2 b^2 + 9 a c) + 9 (A^2 (a A - 2 b) b + 3 A (a A + b) c - 3 c^2) f + 27 A^3 c f^2) // Simplify;
z = Table[Cos[(ArcCos[v] + 2 Pi j)/3], {j, 0, 2}] // Simplify;
Print["\nTrigonometric solution:\n"];
x = (B (-b + 2 a A + 3 f A^2) + z)/(B (3 c - 2 b A + a A^2) - A z) //Simplify;
Print[x, "\n"];
Print[x // N // Sort, "\n"];
Print["Solution by CAS:\n"]; Clear[x];
Print[x /. (-f + a x + b x^2 + c x^3 // NSolve) // Sort, "\n"];
FullSimplify в
W.Mathematica позволяет убедиться в корректности работы формул: