Created
August 23, 2021 10:11
-
-
Save vaguecoder/153d731c60f6358c61cf8bff731a0972 to your computer and use it in GitHub Desktop.
Code to find the Greatest Common Divisor (GCD) of 2 or more numbers.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
// PrimeGenerator creates a generator goroutine that returns prime numbers, least first | |
func PrimeGenerator(close <-chan int) chan int { | |
var current int | |
var flag bool | |
ch := make(chan int) | |
go func() { | |
current = 1 | |
for { | |
select { | |
case <-close: | |
// When channel is closed, i.e., requested for closure | |
return | |
default: | |
if current < 3 { | |
// For prime numbers 2 & 3 | |
current++ | |
ch <- current | |
} else { | |
// For Prime Numbers greater than 3 | |
for i := current + 1; ; i++ { | |
flag = true | |
for j := 2; j <= i/2; j++ { | |
if i%j == 0 { | |
flag = false | |
break | |
} | |
} | |
// When the number is not perfectly divisible by any number except 1 & itself. | |
if flag { | |
ch <- i | |
current = i | |
break | |
} | |
} | |
} | |
} | |
} | |
}() | |
return ch | |
} | |
// allGreaterThanOrEqual iterates over slice to check all elements are greater than given number | |
func allGreaterThanOrEqual(arr []int, n int) bool { | |
for _, a := range arr { | |
if a < n { | |
return false | |
} | |
} | |
return true | |
} | |
// allPerfectlyDivisible iterates over slice to check all elements are divisible by given number | |
func allPerfectlyDivisible(arr []int, n int) bool { | |
for _, a := range arr { | |
if a%n != 0 { | |
return false | |
} | |
} | |
return true | |
} | |
// divideFromAll iterates over slice to divide all elements by given number | |
func divideFromAll(arr []int, n int) []int { | |
var result []int | |
for _, a := range arr { | |
a /= n | |
result = append(result, a) | |
} | |
return result | |
} | |
// findGCD returns Greatest Common Divisor (GCD) of given slice of numbers | |
func findGCD(nums ...int) int { | |
var p, gcd int | |
// Generator for prime numbers | |
closeCh := make(chan int) | |
defer close(closeCh) | |
ch := PrimeGenerator(closeCh) | |
gcd = 1 | |
p = <-ch | |
for allGreaterThanOrEqual(nums, p) { | |
// When all numbers are greater than prime number p | |
for allPerfectlyDivisible(nums, p) { | |
// When all numbers are perfectly divisible by prime number p | |
// Iterate to see if same prime number can divide multiple times | |
gcd *= p | |
// Divide prime number p from all the numbers | |
nums = divideFromAll(nums, p) | |
} | |
// Read higher prime number for next iteration | |
p = <-ch | |
} | |
return gcd | |
} | |
func main() { | |
fmt.Println(findGCD(54, 90, 180, 720, 3600)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment