Помогите написать функцию, которая бы упрощала коэффициенты
A_1,A_2,...,A_9,A_10 уравнений вида
A_1*x_1 + A_2*x_2 + ... + A_9*x_9 + A_10 = 0,
где все коэффициенты целые и
A_1,A_2,...,A_9 не равны 0 одновременно.
Упрощать нужно так:
- 1. сократить на НОД;
2. если A_1≠0, то на выходе он >0, если A_1=0, то на выходе A_2>0; если A_1=0 и A_2=0, то на выходе A_3>0 и т.д.; т.е. чтобы после упрощения первый, не равный нулю коэффициент был положительным;
3. если какой-либо коэффициент, кроме A_10, равен 1 (или -1 с учетом п.2), то не возвращать его.
4. если какой-либо коэффициент A_k, равен 0, то не возвращать A_k*x_k.
Например, после упрощения
-8*x^2+16*x-8=0, должно получится
x^2-2*x+1=0;
после упрощения
0*x^2-16*x+8=0, должно получится
2*x-1=0.
Для уравнения с тремя коэф.-ми (к примеру, кв.ур или общее ур. прямой), вроде, получилось написать "упрощалку". Но, думаю, это неверный подход (?).
<div>A<sub>0</sub>x^2 + B<sub>0</sub>x + C<sub>0</sub> = 0</div>
A<sub>0</sub> = <input style="width:50px;" id="x0">;
B<sub>0</sub> = <input style="width:50px;" id="y0">;
C<sub>0</sub> = <input style="width:50px;" id="z0">
Введите любые значения кроме A<sub>0</sub> и B<sub>0</sub> одновременно равных 0<br>
<button onclick="QuadraticEq()">Упростить</button><br>
<input style="width: 150px; text-align: center;" id="L1"> ⇔
<input style="width: 150px; text-align: center;" id="L2"><br><br>
<script type="text/javascript">
function NOD(a,b){ while ((a!=0) && (b!=0)) {if (a>b) {a%=b} else {b%=a}} return (a+b) }
function simplifyEq(A0,B0,C0,x,y)
{
var nod = NOD(NOD(Math.abs(A0),Math.abs(B0)),Math.abs(C0));
//Если все коэффициенты целые, то нормируем их на общий НОД
if (A0%1==0 && B0%1==0 && C0%1==0) {var A=A0/nod, B= B0/nod, C=C0/nod}
//Если хотя бы один не целый, то не изменяем их
else {var A=A0, B=B0, C=C0}
if (B<0)
{ if (B!==-1){var mpB = '+'+Math.abs(B), pmB = B}
if (B===-1){var mpB = '+', pmB = '-'}
}
if (B>0)
{ if(B!==1){var mpB = '-'+B, pmB = '+'+B}
if(B===1){var mpB = '-', pmB = '+'}
}
if (C<0) {var pmC = C, mpC = '+'+Math.abs(C)}
if (C>0) {var pmC = '+'+C, mpC = '-'+C}
if (C===0){var pmC = '', mpC = ''}
if (A<0 && A!==-1) {var A1 = Math.abs(A)+x, B1 = mpB+y, C1 = mpC+'=0'}
if (A===-1) {var A1 = x, B1 = mpB+y, C1 = mpC+'=0'}
if (A>0 && A!==1) {var A1 = A+x, B1 = pmB+y, C1 = pmC+'=0'}
if (A===1) {var A1 = x, B1 = pmB+y, C1 = pmC+'=0'}
if (A===0)
{ var A1 = '';
if (C!==0)
{ if (B<0 && B!==-1) {var B1 = Math.abs(B)+y, C1 = mpC+'=0'}
if (B===-1) {var B1 = y, C1 = mpC+'=0'}
if (B>0 && B!==1) {var B1 = B+y, C1 = pmC+'=0'}
if (B===1) {var B1 = y, C1 = mpC+'=0'}
}
if (C===0) {var B1 = y, C1 = '=0'}
if (B===C) {var B1 = y, C1 = '+1=0'}
if (B===-C) {var B1 = y, C1 = '-1=0'}
}
if (B===0)
{ var B1 = '';
if (C!==0)
{ if (A<0 && A!==-1) {var A1 = Math.abs(A)+x, C1 = mpC+'=0'}
if (A===-1) {var A1 = x, C1 = mpC+'=0'}
if (A>0 && A!==1) {var A1 = A+x, C1 = pmC+'=0'}
if (A===1) {var A1 = x, C1 = mpC+'=0'}
}
if (C===0) {var A1 = x, C1 = '=0'}
if (A===C) {var A1 = x, C1 = '+1=0'}
if (A===-C) {var A1 = x, C1 = '-1=0'}
}
if (C===0)
{ if (A===B) {var A1 = x, B1 = '+'+y, C1 = '=0'}
if (A===-B) {var A1 = x, B1 = '-'+y, C1 = '=0'}
}
if (A===B && A===C && B===C) {var A1 = x, B1 = '+'+y, C1 = '+1=0'}
if (A===-B && A===-C && B===C) {var A1 = x, B1 = '-'+y, C1 = '-1=0'}
if (A===-B && A===C && B===-C) {var A1 = x, B1 = '-'+y, C1 = '+1=0'}
if (A===B && A===-C && B===-C) {var A1 = x, B1 = '+'+y, C1 = '-1=0'}
return A1+B1+C1;
}
function QuadraticEq()
{ var a = document.getElementById('x0').value*1,
b = document.getElementById('y0').value*1,
c = document.getElementById('z0').value*1;
document.getElementById('L1').value = '('+a+')x^2+('+b+')x+('+c+')=0';
document.getElementById('L2').value = simplifyEq(a,b,c,'x^2','x');
}
</script>