title: Why is TI-Basic so slow?
body: <p>I decided to implement a program that can find the GCD of any two numbers (including non-integers) in TI-Basic. I've used this just fine in Java, so I know it works. It works just fine in TI-Basic, but when compared with the built-in <code>gcd(</code> function, it's very sluggish; the <code>gcd(</code> function seems to get a result in milliseconds, where mine can take several seconds. <strong>Why is TI-Basic so much slower than the predefined calculator functions?</strong></p>
  
  <h2>The code</h2>
  
  <hr>
  
  <p>Here is the program's code in TI-Basic, for your inspection:</p>
  
  <pre><code>PROGRAM:GCD
  
  :ClrHome
  :Disp "Greatest Common","    Divisor","      ---"
  :Input "First number? ",X
  :Input "Second number? ",Y
  :
  :X→I
  :Y→J
  :
  :If (I≠int(I) or J≠int(J))
  :Then
  :ClrHome
  :Disp "Non-integer","inputs may be","innacurate!",""
  :End
  :If (I=1 or J=1)
  :Then
  :1→I
  :1→J
  :Goto Z
  :End
  :For(C,0,2^8)
  :If I=J
  :Goto Z
  :
  :If I&gt;J
  :I-J→I
  :
  :If J&gt;I
  :J-I→J
  :
  :End
  :
  :Disp "This is a hard","one! Thinking","harder..."
  :
  :For(C,0,2^15)
  :If (I=J)
  :Goto Z
  :While (I&gt;J)
  :I-J→I
  :C+1→C
  :End
  :While (J&gt;I)
  :J-I→J
  :C+1→C
  :End
  :End
  :
  :Disp "TIMED OUT!","Either:",J,"or"
  :Pause
  :
  :Lbl Z
  :ClrHome
  :Disp "GCD of",X,"and",Y,"is",I
  </code></pre>
  
  <p><strong>Disclaimer:</strong> This is the result of me looking at my TI-84 and typing it here. Some typos might be in it, though I tried my best to keep it the same</p>
  
  <p>For those of you who might not know what this means, pseudocode is provided below:</p>
  
  <pre><code>program gcd()
  {
  Console.clear();
  Console.writeln("Greatest Common");
  Console.writeln("    Divisor");
  Console.writeln("      ---");
  
  float X = Console.readFloat("First Number? ");
  float Y = Console.readFloat("Second number? ");
  
  float I = X;
  float J = Y;
  
  if (I != (int)I || J != (int)J)
  {
    Console.clear();
    Console.writeln("Non-integer");
    Console.writeln("inputs may be");
    Console.writeln("inaccurate!");
    Console.writeln("");
  }
  if (I == 1 or J == 1)
  {
    I = 1;
    J = 1;
    goto Z;
  }
  
  for(int C = 0, limit = Math.pow(2,8); C &lt; limit; C++)
  {
    if (I == J)
      goto Z;
  
    if (I &gt; J)
      I = I - J;
  
    if (J &gt; I)
      J = J - I;
  }
  
  Console.writeln("This is a hard");
  Console.writeln("one! Thinking");
  Console.writeln("harder...");
  
  for(int C = 0, limit = Math.pow(2,15); C &lt; limit; C++)
  {
    if (I == J)
      goto z;
    while (I &gt; J)
    {
      I = I - J;
      C++;
    }
    while (J&gt;I)
    {
      J = J-I;
      C++;
    }
  }
  
  Console.writeln("TIMED OUT!");
  Console.writeln("Either:");
  Console.writeln(J);
  Console.writeln("or");
  Console.pause();
  
  Z:
  Console.clear();
  Console.writeln("GCD of");
  Console.writeln(X);
  Console.writeln("and");
  Console.writeln(Y);
  Console.writeln("is");
  Console.writeln(I);
  }
  </code></pre>