Friday, July 26, 2013

Power of simpler math

I found one of the best mathematical results in human history which is a simpler way to reduce things called binary quadratic Diophantine equations. That is, equations that look like this general case:

c1x2 + c2xy + c3y2 = c4 + c5x + c6y

where x and y are the unknowns to be figured out. A simple example of such an equation is:

x2 + 2xy + 3y2 = 4 + 5x + 6y

where I've simply used,  c1 = 1, c2 = 2, c3 = 3, c4 = 4, c5 = 5, c6 = 6.

With my simple example above I can reduce to a simpler form using my own research to get:

(-4(x+y) + 10)2 + 2s2 = 166

Now you can solve for x+y and s, and it's easier to find that s = 9 works, and x+y = 2 or 3, and x = 4, y = -2 is a solution. To see me work through in more detail, click here.

Now you may say, so what? Well, turns out we can immediately use this thing to get a simple result previously unknown before I discovered it, which is one of the greatest math finds of all time, and we're going to use it for some simple math trivia and approximate the square root of 2 with it.

And I start with a simple equation:

u2 + Dv2 = F.

And with my general method to reduce binary quadratic Diophantine equation we can find that:

(u-Dv)2 + D(u+v)2 = F(D+1)

And I'm now going to let D = -2, F = 1, since we're going after the square root of 2, and to make the equation look like a more familiar one I'm going to shift variables with: u=x, v=y, so my original is now:

x2 - 2y2 = 1

And now I can crank through my result to get:

(x+2y)2 - 2(x+y)2 = -1

And it's iterative! So I can do it again and again:

(3x+4y)2 - 2(2x + 3y)2 = 1

Next is:

(7x + 10y)2 - 2(5x + 7y)2 = -1

And iterating one more time:

 (17x + 24y)2 - 2(12x + 17y)2 = 1

And the more astute of you may have noticed that x = 1, y = 0 is a solution to the original equation, so guess what? We've solved the original equation as well with JUST my research result. Using that on the last:

(17)2 - 2(12)2 = 1

And we can still iterate, but let's do it now with just the numbers.

So now for another iteration: x = 17, y = 12,

so: (3(17)+4(12))2 - 2(2(17) + 3(12))2 = -1

Which is: (99)2 - 2(70)2 = -1

And that gives the slightly more impressive approximation of 99/70 is about: 1.4142

And if you're bored you can just keep going! Where now x=99 and y=70. And it works out to infinity with ever more precise approximations to sqrt(2).

Next one is: x=577, y=408, and 577/408 is approximately 1.41421.

Why do these solutions approximate the positive square root of 2?

Because x2 - 2y2 = 1, is:

(x2 - 1)/y2 = 2, and you can just take the square root of both sides now:

sqrt(x2 - 1)/y = sqrt(2), so the trick then is that approximately x/y = sqrt(2).

And x2 - 2y2 = 1 was used over a thousand years ago, and one of its uses was, yup, approximating square roots, and I wonder if I'd have been cheered if I showed some of the ancients my simple result above?

I've used my result with much bigger things though.

James Harris

Tuesday, July 02, 2013

Class Viewer troubleshooting advice

Update July 3 2014: There was a change to how javadocs are accessed in Java 8. The latest version of Class Viewer dated July 3, 2014 addresses this change with backward compatibility for earlier versions. If you are not getting javadocs to the method please upgrade to this latest version.


A great thing about writing applications in Java is how well they can move around the world, across platforms. And for the most part my Class Viewer application can be used on any platform with Java, but it does do some things that are platform dependent like call your web browser.

Configuring for your system is all in ClassViewerConfig.xml which is where the app goes to see how to do such things. And I just edit it with a text editor.

If you run into problems with my Class Viewer, my guess is you likely need to make a change there.

For the browser and text editor everything is conveniently at the top with the BrowserLoc and Editor sections.

<browserloc>C:\\Program Files\\Mozilla Firefox\\firefox.exe</browserloc> <editor>C:\\Program Files\\gedit\\bin\\gedit.exe</editor> <acceptslinenumber>Yes</acceptslinenumber> <parameter>+</parameter>
Which is what I have as default for systems with Microsoft's Windows.

And if what's there doesn't work then change it to something that does.

If you have a different browser you just change BrowserLoc, and same for your text editor.

If what you try doesn't work the app will put up an error message telling you what it tried.

I ran into a problem recently out of the blue where Windows wanted quotes before it would call gedit, and I have no clue why and don't care. I just added the quotes and it worked. So I had:

<editor>"C:\\Program Files\\gedit\\bin\\gedit.exe"</editor>The default for Linux users is:
<browserloc>firefox</browserloc> <editor>gedit</editor> <acceptslinenumber>Yes</acceptslinenumber> <parameter>+</parameter>
Where it's simpler, and thus easier to change to your own preferences.

But I'm just helping people with those operating systems use Class Viewer while anyone who can run Java just needs to put in what will run on theirs.

Most troubleshooting issues I've found go back to what is in your ClassViewerConfig.xml, or your classpath.

As usual with Java make sure you have the classpath you need to get to programs you want.

You can check your classpath in Class Viewer to know where it is looking.

Any others having problems not covered here? If so, please comment, and I'll try to address any other issues.

James Harris

Updated: Changed packagedirectory.xml to ClassViewerConfig.xml--June 28 2014  __JSH