On 22/10/2010 13:33, Baba wrote:
On Oct 22, 8:07 am, Dennis Lee Bieber<wlfr...@ix.netcom.com>  wrote:
On Thu, 21 Oct 2010 03:51:07 -0700 (PDT), Baba<raoul...@gmail.com>
declaimed the following in gmane.comp.python.general:

Hi everyone

i need a hint regarding the following exercise question:

"Write a program that generates all Pythagorean triples whose small
sides are no larger than n.
Try it with n<= 200."

what is "n" ? i am guessing that it is a way to give a bound to the
triples to be returned but i can't figure out where to fit in "n".

a^a + b^b = c^c is the condition to satisfy and i need to use loops

         Well, I'd interpret it to mean that

a<= 200
AND
b<= 200

since c is the hypotenuse, which by definition is longer than either of
the sides.

         The brute force approach is a nested set of "for" loops, running
1-200 (remember that (x)range(200) runs 0-199<G>).

         The alternative is to study the information at

http://www.math.uic.edu/~fields/puzzle/triples.html

and filtering out entries where the first two components are>200...
Looking at the middle term "2*m*n" would have to be less than 201, and
the first term "n*n-m*m"<  201

         In Python, this can all be done in a one-liner...

[(n*n - m*m, 2*m*n, n*n + m*m) for n in xrange(2,101) for m in
xrange(1,n) if 2*m*n<  201 and n*n-m*m<  201]

         Converting this to a clean set of nested loops and nice lines of
output is a different matter.

         Oh, and DO study the link I gave so you can cite it when you turn in
this intriguing formulation... after all, no need for math.sqrt<G>

--
         Wulfraed                 Dennis Lee Bieber         AF6VN
         wlfr...@ix.netcom.com    HTTP://wlfraed.home.netcom.com/

Hi Wulfraed,

only a has an upper limit of 200

Really? The quote you gave included "whose small sides are no larger
than n". Note: "sides", plural.

the program needs to output the following triple for a == 200: (200 ,
609,641)

so at this stage my problem is: how to set the upper limit for b in a
smart way?

My solution below is not efficient i believe.

import math
for a in range (190,200):
     for b in range (a,a*a):
         csqrd = a * a + b * b
         csqrt = math.sqrt(csqrd)
         for c in range (1, csqrd):
             if c * c == a * a + b * b and math.floor(csqrt) == csqrt:
                 print (a,b,c)

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to