Advertisement
beezing

IRTH Faraidh - rational.js

Apr 15th, 2014
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Rational number arithmetic
  2. function Rational(i, j) {
  3.   this.num = i * 1;
  4.   this.denom = j * 1;
  5. }
  6.  
  7. function zero() {
  8.   return new Rational(0, 1);
  9. }
  10.  
  11. function one() {
  12.   return new Rational(1, 1);
  13. }
  14.  
  15. function divides(i, j) {
  16.   return ((i % j) == 0);
  17. }
  18.  
  19. /**
  20.  * Greatest common denominator of two integers x,y
  21.  */
  22. function gcd(x, y) {
  23.   var i = x.denom;
  24.   var j = y.denom;
  25.   if (divides(i, j)) return i;
  26.   else if (divides(j, i)) return j;
  27.   else return i * j;
  28. }
  29.  
  30. function isNegative(x) {
  31.   return (x.num < 0);
  32. }
  33.  
  34. function negate(x) {
  35.   x.num = -(x.num);
  36.   return x;
  37. }
  38.  
  39. function isZero(x) {
  40.   return (x.num == 0);
  41. }
  42.  
  43. /**
  44.  * Simplifies a fraction by reducing its numerator and denominator
  45.  * to their simplest
  46.  */
  47. function simplify(x) {
  48.   var isNeg = isNegative(x);
  49.   var t = (isNeg ? -(x.num) : x.num);
  50.   var b = x.denom;
  51.   var smaller = Math.min(t, b);
  52.   if (divides(t, b)) {
  53.     t /= b;
  54.     b = 1;
  55.   } else if (divides(b, t)) {
  56.     b /= t;
  57.     t = 1;
  58.   } else {
  59.     for (var i = 2; i <= smaller; i++) {
  60.       while (divides(t, i) && divides(b, i)) {
  61.         t /= i;
  62.         b /= i;
  63.       }
  64.       smaller = Math.min(t, b);
  65.     }
  66.   }
  67.   var z = new Rational(1, 1);
  68.   z.num = (isNeg ? -t : t);
  69.   z.denom = b;
  70.   return z;
  71. }
  72.  
  73. function multiply(x, y) {
  74.   var r = new Rational(1, 1);
  75.   r.num = x.num * y.num;
  76.   r.denom = x.denom * y.denom;
  77.   return simplify(r);
  78. }
  79.  
  80. function divide(x, y) {
  81.   var r = new Rational(1, 1);
  82.   r.num = x.num * y.denom;
  83.   r.denom = x.denom * y.num;
  84.   return simplify(r);
  85. }
  86.  
  87. function add(x, y) {
  88.   var i = gcd(x, y);
  89.   var r = new Rational(1, 1);
  90.   r.num = x.num * i / x.denom + y.num * i / y.denom;
  91.   r.denom = i;
  92.   return simplify(r);
  93. }
  94.  
  95. function subtract(x, y) {
  96.   var i = gcd(x, y);
  97.   var r = new Rational(1, 1);
  98.   r.num = x.num * i / x.denom - y.num * i / y.denom;
  99.   r.denom = i;
  100.   return simplify(r);
  101. }
  102.  
  103. function max(x, y) {
  104.   var z = subtract(x, y);
  105.   if (isNegative(z)) return y;
  106.   else return x;
  107. }
  108.  
  109. function min(x, y) {
  110.   var z = subtract(y, x);
  111.   if (isNegative(z)) return y;
  112.   else return x;
  113. }
  114.  
  115. function isLtOne(x) {
  116.   var z = simplify(x);
  117.   return ((z.num - z.denom) < 0);
  118. }
  119.  
  120. function isGtOne(x) {
  121.   var z = simplify(x);
  122.   return ((z.num - z.denom) > 0);
  123. }
  124.  
  125. function isOne(x) {
  126.   var z = simplify(x);
  127.   return ((z.num - z.denom) == 0);
  128. }
  129.  
  130. function isLt(x, y) {
  131.   var z = subtract(x, y);
  132.   if (isNegative(z)) return true;
  133.   else return false;
  134. }
  135.  
  136. function isGt(x, y) {
  137.   var z = subtract(y, x);
  138.   if (isNegative(z)) return true;
  139.   else return false;
  140. }
  141.  
  142. function equals(x, y) {
  143.   var z = subtract(x, y);
  144.   if (isZero(z)) return true;
  145.   else return false;
  146. }
  147.  
  148. function toRational(s) {
  149.   if (!s) return zero();
  150.   if ("" == s) return zero();
  151.   if ("TIDAK ADA" == s.toUpperCase()) return zero();
  152.   var i = s.indexOf("/");
  153.   if (i < 0) {
  154.     alert("Tidak dapat merubah " + s + " ke bilangan rasional");
  155.     return null;
  156.   }
  157.   var z = one();
  158.   z.num = s.substring(0, i);
  159.   z.denom = s.substring(i + 1);
  160.   if (z.denom < 0) {
  161.     z.num = -(z.num);
  162.     z.denom = -(z.denom);
  163.   }
  164.   return z;
  165. }
  166.  
  167. function toString(x) {
  168.   if (isZero(x)) return "TIDAK ADA";
  169.   else if (isOne(x)) return "SEMUANYA";
  170.   else if ((x.num == -1) && (x.denom == 1)) return "UNTUK DIBAGI LAGI";
  171.   else return x.num + "/" + x.denom;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement