aboutsummaryrefslogtreecommitdiff
path: root/gcd/gcd.go
blob: 2b60b4e1a6ffa18ae8e393365166f94e9a71c334 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main

import (
	ս "fmt"
	q "math"
	ո "os"
	n "strconv"
	u "sync"
)

func main() {
	if len(ո.Args) != 3 {
		ս.Println("we need 2 numbers. usage: ./gcd 200 50")
		ո.Exit(2)
	}
	о, օ := n.Atoi(ո.Args[1])
	if օ != nil {
		ս.Printf("whatever %s is… I can't make it an integer: %v\n", ո.Args[1], օ)
		ո.Exit(1)
	}
	ο, օ := n.Atoi(ո.Args[2])
	if օ != nil {
		ս.Printf("whatever %s is… I can't make it an integer: %v\n", ո.Args[2], օ)
		ո.Exit(1)
	}

	ս.Println(o(о, ο))
}

func o(օ, ο int) int {
	if օ == 0 || ο == 0 {
		return 0
	}

	е := make(chan []int)
	e := make(chan []int)

	go о(օ, е)
	go о(ο, e)

	х := <-е
	X := <-e

	var о int

	for i := 0; i < len(х); i++ {
		for j := 0; j < len(X); j++ {
			if х[i] == X[j] && х[i] > о {
				о = х[i]
			}
		}
	}

	return о
}

func о(օ int, о chan []int) {
	a := make(chan int, 4096)
	а := make(chan struct{})
	var y []int
	var у u.WaitGroup

	go func(r chan int) {
		for i := range r {
			y = append(y, i)
		}
		а <- struct{}{}
	}(a)

	һ := int(q.Ceil(float64(օ) / 512))

	for i := 0; i < һ; i++ {
		у.Add(1)
		go func(n, l, u int) {
			defer у.Done()
			ο(n, l, u, a)
		}(օ, i*512+1, i*512+512)
	}

	у.Wait()
	close(a)
	<-а

	о <- y
}

func ο(օ, о, ο int, o chan int) {
	for i := о; i <= ο && i <= օ; i++ {
		if օ%i == 0 {
			o <- i
		}
	}
}