プログラムのバグ修正

過去のエントリーのJavaScriptの連立一次方程式の解の分数表示のバグの件でしばらく放置状態だったことをお詫び申し上げます。詳細は以下の通りで、

分数の表示

分子と分母の絶対値をとってからユークリッド互除法で最大公約数を求めて、分母がプラスかマイナスかで条件分岐して、分母と最大公約数が等しいとき(分母=1のとき非表示)、分母と最大公約数が等しくないときを、解(x とy)でそれぞれで条件分岐して、分母にマイナスがあれば符号変換するフローに考え違いがあった模様。(ちょっと考えれば自明だったんですけどね。

[pmath]z=ad-bc<0[/pmath]のとき

[pmath]x=-{dp-bq}/{delim{|}{ad-bc}{|}}[/pmath]

[pmath]y=-{aq-cp}/{delim{|}{ad-bc}{|}}[/pmath]

var x1= d1*p1-b1*q1, y1 = a1*q1-c1*p1, z1 = a1*d1-b1*c1, x2 = Math.abs(x1), y2 = Math.abs(y1), z2 = Math.abs(z1);

if(z1 > 0) {
 if(gcdmemo(x2,z2) == z2) {
  document.getElementById('x').innerHTML = "x = " + x1/gcdmemo(x2,z1);
  if(gcdmemo(y2,z2) == z2) {
   document.getElementById('y').innerHTML = "y = " + y1/gcdmemo(y2,z1);
  }
  else {
   document.getElementById('y').innerHTML = "y = " + y1/gcdmemo(y2,z1) + "/" + z1/gcdmemo(y2,z1) + " = " + y1/z1;
  }
 }
 else {
  document.getElementById('x').innerHTML = "x = " + x1/gcdmemo(x2,z1) + "/" + z1/gcdmemo(x2,z1) + " = " + x1/z1;
  if(gcdmemo(y2,z2) == z2) {
   document.getElementById('y').innerHTML = "y = " + y1/gcdmemo(y2,z1);
  }
  else {
   document.getElementById('y').innerHTML = "y = " + y1/gcdmemo(y2,z1) + "/" + z1/gcdmemo(y2,z1) + " = " + y1/z1;
  }
 }
}
else {
 if(gcdmemo(x2,z2) == z2) {
  document.getElementById('x').innerHTML = "x = " + (-1)*x1/gcdmemo(x2,z2);
  if(gcdmemo(y2,z2) == z2) {
   document.getElementById('y').innerHTML = "y = " + (-1)*y1/gcdmemo(y2,z2);
  }
  else {
   document.getElementById('y').innerHTML = "y = " + (-1)*y1/gcdmemo(y2,z2) + "/" + z2/gcdmemo(y2,z2) + " = " + y1/z1;
  }
 }
 else {
  document.getElementById('x').innerHTML = "x = " + (-1)*x1/gcdmemo(x2,z2) + "/" + z2/gcdmemo(x2,z2) + " = " + x1/z1;
  if(gcdmemo(y2,z2) == z2) {
   document.getElementById('y').innerHTML = "y = " + (-1)*y1/gcdmemo(y2,z2);
  }
  else {
   document.getElementById('y').innerHTML = "y = " + (-1)*y1/gcdmemo(y2,z2) + "/" + z2/gcdmemo(y2,z2) + " = " + y1/z1;
  }
 }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です