Упростить коэффициенты уравнения
Помогите написать функцию, которая бы упрощала коэффициенты 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 одновременно. Упрощать нужно так: :)
Например, после упрощения -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> |
Вообще эта задача поиска наименьшего общего кратного
Для этого в общем случае нун разбить цифровые множители на сомножители и удалить одинаковые, которые имеются во всех элементах левой части равенства Поиск сомножителей можно глянуть в сообщении 7 ( http://javascript.ru/forum/misc/3439...tml#post224926 ) и 10 от Дзен-трансгуманист |
Цитата:
Если да, то с ним как раз нет проблем. function NOD(a,b){ while ((a!=0) && (b!=0)) {if (a>b) {a%=b} else {b%=a}} return (a+b) } Например, для трех чисел n1, n2, n3 (целые любого знака) NOD( NOD(Math.abs(n1),Math.abs(n2)), Math.abs(n3) ) для четырех n1, n2, n3, n4 NOD( NOD(NOD(Math.abs(n1),Math.abs(n2)), Math.abs(n3)), Math.abs(n4) ) Самое интересное :) в пунктах 2,3,4 Цитата:
|
Часовой пояс GMT +3, время: 08:05. |