Haskell program to find the gcd of two numbers

This tutorial will discuss writing a program to find the LCM of two numbers in the Haskell Programming Language. Haskell is a functional programming language.

The GCD of two numbers is the Greatest Common Divisor/ Number that divides both numbers Can also be called as Highest Common Factor.

In this tutorial, we discuss five ways to implement a program to find the GCD of two numbers.

  • Using the inbuilt function gcd.

  • Using the inbuilt function lcm.

  • Computing GCD using list comprehension.

  • Computing GCD using a recursive function with three arguments.

  • Computing GCD using a recursive function with two arguments.

Algorithm steps

  • Take the two integers as input.

  • Implement the GCD computation logic.

  • Display the output.

Fidning GCD Using Inbuilt Function Gcd

Example

Program to find GCD using inbuilt function gcd

<div class="execute"></div><div class="code-mirror  language-haskell" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token hvariable">main</span> <span class="token operator">::</span> <span class="token constant">IO</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token keyword">do</span>
<span class="token comment">-- declaring and initializing variables</span>
   <span class="token keyword">let</span> <span class="token hvariable">a</span> <span class="token operator">=</span> <span class="token number">10</span>
   <span class="token keyword">let</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token number">25</span>
<span class="token comment">-- print the gcd by invoking the inbuilt function lcm</span>
   <span class="token builtin">putStr</span><span class="token punctuation">(</span><span class="token string">"GCD of "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">a</span><span class="token punctuation">)</span> <span class="token operator">++</span> <span class="token string">" and "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token operator">++</span><span class="token string">" is:"</span><span class="token punctuation">)</span>
   <span class="token builtin">print</span> <span class="token punctuation">(</span><span class="token builtin">gcd</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span><span class="token punctuation">)</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

GCD of 10 and 25 is:5

In the above program, we declared and initialized variables with numbers 10 and 23, which we want to find GCD. We used an inbuilt function gcd, which takes two integers as arguments and returns the GCD of that pair of numbers. Finally, we printed the output of the function using the print function. As function putStr prints only string data type we convert integers to strings using function show.

find GCD using inbuilt function lcm

Example

Program to find GCD using inbuilt function lcm

<div class="execute"></div><div class="code-mirror  language-haskell" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token hvariable">main</span> <span class="token operator">::</span> <span class="token constant">IO</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token keyword">do</span>
   <span class="token keyword">let</span> <span class="token hvariable">a</span> <span class="token operator">=</span> <span class="token number">10</span>
   <span class="token keyword">let</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token number">45</span>
<span class="token comment">-- print the gcd by invoking the inbuilt function gcd</span>
   <span class="token builtin">putStr</span><span class="token punctuation">(</span><span class="token string">"GCD of "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">a</span><span class="token punctuation">)</span> <span class="token operator">++</span> <span class="token string">" and "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token operator">++</span><span class="token string">" is:"</span><span class="token punctuation">)</span>
   <span class="token builtin">print</span> <span class="token punctuation">(</span><span class="token builtin">div</span> <span class="token punctuation">(</span><span class="token hvariable">a</span><span class="token operator">*</span><span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token builtin">lcm</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

GCD of 10 and 45 is:5

In the above program we declared and initialized the variable for which GCD should be calculated. We used an inbuilt function lcm which takes two integers as arguments and returns the LCM of that numbers. We know that the LCM*GCD of a pair of integers equals the product of that pair of integers. So we computed the product divided with LCM to generate GCD and Finally, we printed the computed output.

Find GCD Using List Comprehensions

Example

Program to find GCD using List comprehensions

<div class="execute"></div><div class="code-mirror  language-haskell" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token comment">-- function declaration</span>
<span class="token hvariable">gcd3</span> <span class="token operator">::</span> <span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span>
<span class="token comment">-- function definition</span>
<span class="token hvariable">gcd3</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token builtin">head</span> <span class="token punctuation">(</span><span class="token builtin">reverse</span> <span class="token punctuation">[</span><span class="token hvariable">x</span><span class="token operator">|</span><span class="token hvariable">x</span><span class="token operator"><-</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token operator">..</span><span class="token hvariable">b</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token builtin">mod</span> <span class="token hvariable">a</span> <span class="token hvariable">x</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token builtin">mod</span> <span class="token hvariable">b</span> <span class="token hvariable">x</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>

<span class="token hvariable">main</span> <span class="token operator">::</span> <span class="token constant">IO</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token keyword">do</span>
   <span class="token keyword">let</span> <span class="token hvariable">a</span> <span class="token operator">=</span> <span class="token number">20</span>
   <span class="token keyword">let</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token number">75</span>
<span class="token comment">-- displaying the output returned from function lcm2</span>
   <span class="token builtin">putStr</span><span class="token punctuation">(</span><span class="token string">"GCD of "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">a</span><span class="token punctuation">)</span> <span class="token operator">++</span> <span class="token string">" and "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token operator">++</span><span class="token string">" is:"</span><span class="token punctuation">)</span>
   <span class="token builtin">print</span> <span class="token punctuation">(</span><span class="token hvariable">gcd3</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span><span class="token punctuation">)</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

GCD of 10 and 25 is:5

In the above program, we declared function gcd3 which takes two integers as arguments and returns an Integer. In the function definition, we are taking integers a and b as arguments and generating a list from 1 to b, filtering numbers that divide a and b. Finally, we return the last number in the list with the function head after reversing the list using the reverse function. As the list contains all the elements that divide a and b less than or equal to a and b in increasing order. The last element will be the Greatest Common Divisor. We are invoking the function in the main function and printing the returned output.

Note? The function names in Haskell should start with lowercase letters. In the above program, we named the function gcd3 because as gcd is an inbuilt keyword for function gcd we cannot use that keyword.

Find GCD Using A Recursive Function With Three Arguments

Example

Program to find GCD using a recursive function with three arguments.

<div class="execute"></div><div class="code-mirror  language-haskell" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token comment">-- function declaration</span>
<span class="token hvariable">gcd4</span> <span class="token operator">::</span> <span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span>
<span class="token comment">-- function definition</span>
<span class="token hvariable">gcd4</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token hvariable">c</span> <span class="token operator">=</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">mod</span> <span class="token hvariable">a</span> <span class="token hvariable">c</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token number">0</span><span class="token operator">&&</span><span class="token punctuation">(</span><span class="token builtin">mod</span> <span class="token hvariable">b</span> <span class="token hvariable">c</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">)</span>
   <span class="token keyword">then</span> <span class="token hvariable">c</span>
   <span class="token keyword">else</span> <span class="token hvariable">gcd4</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token punctuation">(</span><span class="token hvariable">c</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>
   
<span class="token hvariable">main</span> <span class="token operator">::</span> <span class="token constant">IO</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token keyword">do</span>
   <span class="token keyword">let</span> <span class="token hvariable">a</span> <span class="token operator">=</span> <span class="token number">10</span>
   <span class="token keyword">let</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token number">25</span>
   <span class="token keyword">let</span> <span class="token hvariable">c</span> <span class="token operator">=</span> <span class="token hvariable">b</span>
<span class="token comment">-- printing the output by invoking gcd4 function</span>
   <span class="token builtin">putStr</span><span class="token punctuation">(</span><span class="token string">"GCD of "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">a</span><span class="token punctuation">)</span> <span class="token operator">++</span> <span class="token string">" and "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token operator">++</span><span class="token string">" is:"</span><span class="token punctuation">)</span>
   <span class="token builtin">print</span> <span class="token punctuation">(</span><span class="token hvariable">gcd4</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token hvariable">c</span><span class="token punctuation">)</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

GCD of 10 and 25 is:5

In the Above program we declared function gcd4 which takes three integers as an input and returns an integer.In the function definition, we are taking three integers as arguments in which c?s initial value is b. In the function, we are checking whether c divides both a and b. If yes we are returning the integer c else we are recursively calling the gcd4 function by decrementing the value of c by 1 i.e The function recursively iterating starting from b and returning the first number that divides both a and b which is the Greatest Common Divisor(GCD) of that two numbers.

Find GCD Using A Recursive Function With Two Arguments

Example

Program to find GCD using a recursive function with two arguments.

<div class="execute"></div><div class="code-mirror  language-haskell" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token comment">-- function declaration</span>
<span class="token hvariable">gcd5</span> <span class="token operator">::</span> <span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span><span class="token operator">-></span><span class="token constant">Int</span>

<span class="token comment">-- function definition</span>
<span class="token hvariable">gcd5</span> <span class="token hvariable">a</span> <span class="token number">0</span> <span class="token operator">=</span> <span class="token hvariable">a</span>
<span class="token hvariable">gcd5</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token hvariable">gcd5</span> <span class="token hvariable">b</span> <span class="token punctuation">(</span><span class="token builtin">mod</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span><span class="token punctuation">)</span>

<span class="token hvariable">main</span> <span class="token operator">::</span> <span class="token constant">IO</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token keyword">do</span>
   <span class="token keyword">let</span> <span class="token hvariable">a</span> <span class="token operator">=</span> <span class="token number">10</span>
   <span class="token keyword">let</span> <span class="token hvariable">b</span> <span class="token operator">=</span> <span class="token number">20</span>
   
<span class="token comment">-- printing the output by invoking the gcd5 function</span>
   <span class="token builtin">putStr</span><span class="token punctuation">(</span><span class="token string">"GCD of "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">a</span><span class="token punctuation">)</span> <span class="token operator">++</span> <span class="token string">" and "</span><span class="token operator">++</span> <span class="token punctuation">(</span><span class="token builtin">show</span> <span class="token hvariable">b</span><span class="token punctuation">)</span> <span class="token operator">++</span><span class="token string">" is:"</span><span class="token punctuation">)</span>
   <span class="token builtin">print</span> <span class="token punctuation">(</span><span class="token hvariable">gcd5</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span><span class="token punctuation">)</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

GCD of 10 and 20 is:10

In the above program we declared a function gcd5 which takes two integers as argument and returns an integer. In the function definition, the function gcd5 takes integers a and b as arguments and returns a recursive call to itself with parameters b and (mod a b) until the base case where the second argument becomes zero where the function returns the first argument. I.e this recursive function returns the GCD of two arguments. Finally, the function is invoked from the main function and the returned output is printed.

Conclusion

In this tutorial, we discussed five ways to implement programs to find the GCD of two numbers in the Haskell Programming Language using inbuilt functions and custom function implementations.

Updated on: 2022-10-27T05:52:39+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements