Count number of right triangles possible with a given perimeter

Given a perimeter P, the task is to find the number of right triangles possible with perimeter equal to p.

Examples:

Input: P = 12
Output: number of right triangles = 1 
The only right angle possible is with sides 
hypotenuse = 5, perpendicular = 4 and base = 3. 

Input: p = 840
Output: number of right triangles = 8

So the aim is to find the number of solutions which satisfy equations a + b + c = p and a2 + b2 = c2.



A naive approach is to run two loops for a(1 to p/2) and b(a+1 to p/3) then make c=p-a-b and increase count by one if a*a + b*b == c*c. This will take O(p^{2}) time.

An efficient approach can be found by little algebraic manipulation :

     a^{2}+b^{2}=c^{2}  or, (a+b)^{2}-2ab = c^{2}  or, (p-c)^{2}-2ab = c^{2}  or, p^{2}-2cp-2ab = 0  or, 2ab = p^{2}-2cp  or, 2ab = p^{2}-2p(p-a-b)  or, 2a(p-b) = p(p-2b)  or, a = (p/2) * ((p-2b)/(p-b))

Since a + c > b or, p – b > b or, b < p/2. Thus iterating b from 1 to p/2, calculating a and storing only the whole number a would give all solutions for a given p. There are no right triangles are possible for odd p as right angle triangles follow the Pythagoras theorem. Use a list of pairs to store the values of a and band return the count at the end.

Below is the implementation of the above approach.

filter_none

edit
close

play_arrow

link
brightness_4
code

# python program to find the number of
# right triangles with given perimeter
  
# Function to return the count 
def countTriangles(p):
      
    # making a list to store (a, b) pairs
    store =[]
  
    # no triangle if p is odd
    if p % 2 != 0 : return 0
    else :
        count = 0
        for b in range(1, p // 2):
  
            a = p / 2 * ((p - 2 * b) / (p - b))
            inta = int(a)
            if (a == inta ):
  
                # make (a, b) pair in sorted order 
                ab = tuple(sorted((inta, b)))
  
                # check to avoid duplicates
                if ab not in store :
                    count += 1
                    # store the new pair 
                    store.append(ab)
        return count
  
# Driver Code
p = 12
print("number of right triangles = "+str(countTriangles(p)))

chevron_right


Output:

number of right triangles = 8

Time complexity: O(P)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.