My last blog post about helping my daughter with math concepts (Solving Quadratic Equations with T-SQL) got a great response, so I wanted to share another useful programming technique for learning math – using stored procedures to check for Pythagorean triples.
The Pythagorean theorem states that for a right triangle, the square of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the other two sides. This relationship generates Pythagorean triples – sets of three positive integers that fit the theorem. Some examples are (3, 4, 5) and (5, 12, 13). Pythagoras was an ancient Ionian Greek mathematician and philosopher who lived in the 6th century BC. He is best known for the Pythagorean theorem that bears his name, but he made many other important contributions to mathematics, philosophy, music theory and other fields.
I created a stored procedure in SQL Server to check if three input numbers represent a Pythagorean triple. Here is the code:
CREATE OR ALTER PROCEDURE CheckPythagoreanTriple @a INT, @b INT, @c INT AS BEGIN SET NOCOUNT ON; DECLARE @max INT, @other1 INT, @other2 INT; -- Identify the maximum number and the other two IF @a >= @b AND @a >= @c SELECT @max = @a, @other1 = @b, @other2 = @c; ELSE IF @b >= @a AND @b >= @c SELECT @max = @b, @other1 = @a, @other2 = @c; ELSE SELECT @max = @c, @other1 = @a, @other2 = @b; -- Check if it’s a Pythagorean triple IF @max * @max = @other1 * @other1 + @other2 * @other2 SELECT 1 AS isPythagorean; ELSE SELECT 0 AS isPythagorean; END GO
The procedure takes three integer inputs (@a, @b, @c) and an output parameter @isPythagorean. It squares each input, checks if the squares satisfy the Pythagorean theorem, and sets the output parameter to 1 if yes or 0 if no. Also, you do not have to follow any order to give inputs.
Some example calls:
DECLARE @isPythagorean BIT; EXEC CheckPythagoreanTriple @a = 3, @b = 4, @c = 5 -- 1 EXEC CheckPythagoreanTriple @a = 5, @b = 12, @c = 13 -- 1 EXEC CheckPythagoreanTriple @a = 7, @b = 24, @c = 25 -- 1
This shows how stored procedures can implement reusable logic and simply encapsulate mathematical concepts. By abstracting the Pythagorean check into a procedure, I can teach my daughter about calling functions, passing inputs and outputs, and modular programming. Math class just got a little more fun!
Let me know in the comments if you find this helpful for teaching math or programming concepts. I’m happy to share more programming techniques that lend themselves to learning math.
Here is the link to my Twitter and LinkedIn profile.
Reference: Pinal Dave (https://blog.sqlauthority.com)
4 Comments. Leave new
There is some redundancy in your SP. For example
(@aSquare + @bSquare = @cSquare) is exactly the same as (@bSquare + @aSquare = @cSquare) using the commutative rule of addition
CREATE OR ALTER PROCEDURE CheckPythagoreanTriple
@a INT,
@b INT,
@c INT,
@isPythagorean BIT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @max INT, @other1 INT, @other2 INT;
— Identify the maximum number and the other two
IF @a >= @b AND @a >= @c
SELECT @max = @a, @other1 = @b, @other2 = @c;
ELSE IF @b >= @a AND @b >= @c
SELECT @max = @b, @other1 = @a, @other2 = @c;
ELSE
SELECT @max = @c, @other1 = @a, @other2 = @b;
— Check if it’s a Pythagorean triple
IF @max * @max = @other1 * @other1 + @other2 * @other2
SET @isPythagorean = 1;
ELSE
SET @isPythagorean = 0;
END
GO
Also your test:
EXEC CheckPythagoreanTriple @a = 7, @b = 24, @c = 25, @isPythagorean = @isPythagorean OUTPUT;
Returns 1 not 0 as stated as it is a Pythagorean Triple
Good point. Let me fix all of them soon.
As a thinking exercise, I thought I would see if I could see if this could be done with a set based approach. Below is my result. It produces an ugly execution plan and has an implicit conversion from int to bit. Regardless, It was a fun exercise. Thanks for the idea!
CREATE OR ALTER PROCEDURE CheckPythagoreanTriple
@a INT,
@b INT,
@c INT,
@isPythagorean BIT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
WITH c AS (
SELECT x
, MAX(x) OVER() – MIN(x) OVER() AS d
FROM (
VALUES (@a*@a)
, (@b*@b)
, (@c*@c)
) p(x)
)
SELECT @isPythagorean = COUNT(*)
FROM c
WHERE d = x;
END
CREATE OR ALTER PROCEDURE CheckPythagoreanTriple
@a INT,
@b INT,
@c INT
AS
BEGIN
SELECT TOP 1
CASE
WHEN pvalue + LEAD(pvalue) OVER(ORDER BY pvalue) = LEAD(pvalue, 2) OVER(ORDER BY pvalue) THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END IsPythagorean
FROM (
VALUES
(POWER(@a, 2)),
(POWER(@b, 2)),
(POWER(@c, 2))
) x (pvalue)
ORDER BY pvalue
END