[Back to MATH SWAG index] [Back to Main SWAG index] [Original]
{
DP> Howdy everyone, my computer science class at my high school is trying
DP> to work on the most efficient way to find all the pythagorean triples
DP> from 1 to a certain number, then dump them into a text file. Currently,
DP> the fastest anyone has managed to get is 57 seconds for 1 to 1000. The
DP> program would be considerably faster, but we are removing all duplicates
DP> and dilations. In case you're wondering, a dilation would be: 6 8 10,
DP> which is just a dilation of 3 4 5. IF anyone has any ideas (actual code
DP> would be nice) to help improve the speed of our programs, please drop me
DP> a message!!! Thanks a lot.
This kinda piqued my curiosity so I tried just what you were describing.
I'm not much of a math wiz, but I came up with the following... it
doesn't check for dilations... too lazy for that now but I looked
at the pattern of dilations and there is a pretty definite pattern, so
it shouldn't be too hard to put in.
The output is not neat or anything, and it uses DOS redirection to
output the numbers but I clocked it at 4 seconds on a DX2/66 in a full
screen DOS session under windows 3.1 so it's pretty fast even for not
checking dilations...
The next message contains the rest of the code...
{ DEFINE DEBUG} { turn this on for debugging work }
{$A-} { turn off alignment }
{$B+} { complete boolean evaluations }
{$IFNDEF DEBUG} { if not debugging program turn off }
{$D-} { no debug info }
{$R-} { turn off range checking }
{$ELSE} { else }
{$D+} { turn on debug info }
{$R+} { turn on range checking }
{$ENDIF} { end conditional if }
{$F+} { force far calls }
{$G+} { enable 286 instructions }
{$N+} { enable coprocessor }
{$P-} { no open string }
{$V+} { strict string checking }
{-----------------------------------------------------------------------}
{ Program : Triples }
{ Last Modified: 03-23-96 }
{ Purpose : To find all the pythagorean triples from 1 to 1000 }
{-----------------------------------------------------------------------}
Program PythagoreanTriples;
Uses Crt,Timer; { timer code at the END of this program !! }
{-----------------------------------------------------------------------}
{ global constants }
{-----------------------------------------------------------------------}
Const
MaxNum = 1000; { maximum number to find triple for }
{-----------------------------------------------------------------------}
{ global variables }
{-----------------------------------------------------------------------}
Var
ICtr, ICtr2: Word; { iteration counters }
Result: extended;
{-----------------------------------------------------------------------}
{ main code here }
{-----------------------------------------------------------------------}
Begin { begin main block }
assign(output, '');
rewrite(output);
ClrScr; { clear the screen }
Clockon;
For ICtr := 1 to MaxNum Do { go thorugh numbers }
For ICtr2 := ICtr to MaxNum Do { go through numbers }
Begin { begin ICtr2 for loop }
Result := Sqrt(ICtr*ICtr + ICtr2 * ICtr2);
if (Result - INT(Result) = 0)then
Writeln(output,ICtr,' ', ICtr2:10,' ', Result);
End; { end ICtr2 for loop }
clockoff;
End. { end main block }
-------------------------------------------------------------------------
here is the timer unit you need.
{ Timing unit for optomizing code }
unit TIMER;
interface
procedure clockon;
procedure clockoff;
implementation
uses dos;
var H,M,S,s100:word;
startclock,stopclock:real;
procedure clockon;
begin
gettime(h,m,s,s100);
startclock := (H*3600)+(M*60)+S+(S100 / 100);
Writeln('Start time = ',Startclock:0:2);
end;
procedure clockoff;
begin
gettime(h,m,s,s100);
stopclock := (H*3600)+(M*60)+S+(S100 / 100);
writeln;
writeln('Stop time = ',stopclock:0:2);
writeln('Elapsed time = ',(stopclock-startclock):0:2);
end;
begin
end.
[Back to MATH SWAG index] [Back to Main SWAG index] [Original]