Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2013, 18:04
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Упростить коэффициенты уравнения
Помогите написать функцию, которая бы упрощала коэффициенты 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>

Последний раз редактировалось Demath, 04.01.2013 в 02:10.
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2013, 18:21
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Вообще эта задача поиска наименьшего общего кратного
Для этого в общем случае нун разбить цифровые множители на сомножители и удалить одинаковые, которые имеются во всех элементах левой части равенства
Поиск сомножителей можно глянуть в сообщении 7 ( Целая часть квадратного корня ) и 10 от Дзен-трансгуманист
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2013, 19:07
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от Deff
Вообще эта задача поиска наименьшего общего кратного
Вы имеете ввиду наибольший общий делитель (НОД)?

Если да, то с ним как раз нет проблем.

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

Цитата:
2. если A_1≠0, то на выходе он >0, если A_1=0, то на выходе A_2>0; если A_1=0 и A_2=0, то на выходе A_3>0 и т.д.; т.е. чтобы после упрощения первый, не равный нулю коэффициент был положительным;
3. если какой-либо коэффициент, кроме A_n, равен 1 (или -1 с учетом п.2), то не возвращать его.
4. если какой-либо коэффициент A_k, равен 0, то не возвращать A_k*x_k.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите упростить функцию bratkovsky Общие вопросы Javascript 7 28.07.2012 18:14
упростить, но и усложнить код Александр х@к Элементы интерфейса 7 24.08.2011 21:36
Подскажите плизз как можно упростить код frolvict Общие вопросы Javascript 19 08.04.2010 14:23
Помогите упростить скрипт. operatorr Ваши сайты и скрипты 6 05.01.2010 12:57