Skip to main content

Binary GCD algorithm implementation with python

Binary GCD algorithm also known as Stein's algorithm is an improved version of Euclidean Algorithm.It takes two integer inputs and finds the Greatest Common Divisor(GCD) of the two numbers. The algorithm uses recursive techniques to find the GCD of the two numbers.

Program

This program doesn't accept negative numbers at all. If you give a negative number as input then you will get an error during runtime. This program doesn't accept negative numbers as input. If the user gives one or both the negative numbers then a runtime error is raised.

We could have added u = abs(u) and v = abs(v), but this will have an effect on the performance of the program. As we are using recursive program, for each and every function call the above two statements gets executed which is not at all necessary. 

To find the GCD of two numbers, there are 8 cases. They are as follows:(Assume that the input is two integers u and v, gcd is the name of our function)
  1.  u and v are the same. For this condition, the GCD is the same as any of the two numbers.
  2. Value of u is 0. Then the GCD is v.
  3. Value of v is 0. GCD will be u.
  4. u is even v is even. Then the GCD of the two numbers will be 2*gcd(u/2, v/2)(Because 2 is the common factor). So here we are using the recursive function call.
  5. u is even v is odd. In this case GCD will be gcd(u/2, v)(Because 2 is never gonna make into the value of GCD). Again a recursive functional call.
  6. u is odd v is even. GCD will be gcd(u, v/2)(Similar to the above case).
  7. u is odd v is odd and u > v. Then the GCD will be gcd((u-v)/2, v). This case is to ensure that the input given to the gcd function will not be a negative integer.
  8. u is odd v is odd and u < v. GCD will be gcd((v-u)/2, u). This case is similar to the above one.
 The same has been written in the program but we have used a lot fo binary arithmetic. This is to ensure that the execution time is minimized as much as possible. Some of the binary arithmetic used in the program are as follows:
  • variable & 1 gives 0 when the number is even and 1 when the number is odd.
  • variable >>  1 divides the number by 2.
  • variable << 1 multiplies the number by 2
 You can learn more about these Bitwise operators on Python wiki 

These three operations execute their respective arithmetic in an efficient manner.

Non recursive version

 Till now we have seen the recursive program which uses the same function again and again to return the final value. But the following program will only use loops to find the value. The program is as follows:
The program is very much self explanatory, but I will give a brief description about what actually is happening in the background. 

We will take u and v and find the highest power of 2 common between them. For example if 4 and 32 are taken then the highest power of 2 common between them is 22

After that we will remove all the excess powers of 2's in u and v which will however not contribute to the final answer.

Now we only have two odd numbers and you can see the code implementation of cases 6 and 7 in the program.

From python 2.6, there is an inbuilt gcd function which will calculate the GCD of two numbers. You can import the function and use it directly.
 As always you can download the file from here: Github Gist binary_gcd.py, Github Gist binary_gcd_nr.py and Github Gist fractions_gcd.py.

If you want to learn more about the GCD algorithm, then you can visit the following websites:
GCD algorithm Wiki 
binary GCD 
Binary GCD mathematical Garden 
GCD - Rosetta Code

If you have any doubt or haven't understood anything feel free to comment in the comment box and I will be glad to help you.

If you have any suggestions or have a different implementation of the program  then please comment in the comment box below and I will be very happy to see your comment.

Please comment if you have found any typo or execution errors if any. 

You can also contact me

Thank you. Have a nice day.    

Popular posts from this blog

Making a quiz web app with python and flask

Edit : When you are creating a web app with h tml templates, then y ou will have to sa ve the html file in templates folder in the Current Wor ki ng Directory( CWD). If you save the file in the C W D directl y you will get a TemplateNotFound error. Thank you Udhay for pointing it out.   In this post we will create a quiz website using python . I will be using the flask framework . After reading this tutorial you will learn form submission , flask templates , python code in flask templates , shuffling the questions and options with the random module and few others.  Please note that this tutorial is not big as it seems to be. Some of the code has been rewritten to maintain consistency and also font size is somewhat big so that your eyes won't get stressed reading this tutorial. Also the content has not occupied the full width of the page. In this tutorial I am assuming that you are having a very basic understanding of the flask framework . Please refer the documentation

Problem 11 Project Euler Solution with python

Largest product in a grid In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07

Problem 60 Project Euler Solution with python

Prime pair sets The primes 3, 7, 109, and 673, are quite remarkable. By taking any two primes and concatenating them in any order the result will always be prime. For example, taking 7 and 109, both 7109 and 1097 are prime. The sum of these four primes, 792, represents the lowest sum for a set of four primes with this property. Find the lowest sum for a set of five primes for which any two primes concatenate to produce another prime. This problem is j u st a brute force problem. If you have come here because you don't know the limit upto which you will h ave to gener ate the prime numbers t hen go ahe ad and t r y with 10,000 . When I first start ed solving the problem I chose 1 million(beca use most of the problem s on project E uler have this limit ), but it took very long for the computer to fin d the solution. After searching on the internet then I found many people choosing 10, 000 so I have changed my in put f rom 1 million to 10000 and the output was f ast. He