Skip to content

Instantly share code, notes, and snippets.

@vaguecoder
Created August 23, 2021 10:11
Show Gist options
  • Save vaguecoder/153d731c60f6358c61cf8bff731a0972 to your computer and use it in GitHub Desktop.
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.
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