42 lines
976 B
Transact-SQL
42 lines
976 B
Transact-SQL
CREATE OR ALTER FUNCTION [dbo].[PGCD]
|
|
( @a BigInt
|
|
, @b BigInt
|
|
)
|
|
RETURNS BigInt
|
|
WITH RETURNS NULL ON NULL INPUT
|
|
-- Calculates the Greatest Common Denominator of two numbers (1 if they are coprime).
|
|
BEGIN
|
|
DECLARE @PGCD BigInt;
|
|
|
|
WITH Vars(A, B)
|
|
As ( SELECT Max(V.N) As A
|
|
, Min(V.N) As B
|
|
FROM ( VALUES ( Abs(@a) , Abs(@b)) ) Params(A, B)
|
|
-- First, get absolute value
|
|
Cross APPLY ( VALUES (Params.A) , (Params.B) ) V(N)
|
|
-- Then, order parameters without Greatest/Least functions
|
|
WHERE Params.A > 0
|
|
And Params.B > 0 -- If 0 passed in, NULL shall be the output
|
|
)
|
|
, Calc(A, B)
|
|
As ( SELECT A
|
|
, B
|
|
FROM Vars
|
|
|
|
UNION ALL
|
|
|
|
SELECT B As A
|
|
, A % B As B -- Self-ordering
|
|
FROM Calc
|
|
WHERE Calc.A > 0
|
|
And Calc.B > 0
|
|
)
|
|
SELECT @PGCD = Min(A)
|
|
FROM Calc
|
|
WHERE Calc.B = 0
|
|
;
|
|
|
|
RETURN @PGCD;
|
|
|
|
END
|