Skip to content

Commit 3fab608

Browse files
authored
Create gcd.rn
implementing Euclid's algorithm for greatest common divisor of positive integers
1 parent 3a465c1 commit 3fab608

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

math/gcd.rn

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2023 Google LLC.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// https://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
// Author: Christian Arnold (github: ctarnold)
16+
17+
// Find the greatest common divisor (gcd) of positive integers.
18+
// Return -1 if invalid input.
19+
// 2*log_2(b) recursive calls where b <= a
20+
// warning: unspecified behavior for non-integer types.
21+
export func gcd(a, b) {
22+
23+
// a >= b > 0 by Euclid's algo.
24+
// validate this condition.
25+
if a < 0 {
26+
return -1
27+
}
28+
if b < 0 {
29+
return -1
30+
}
31+
if a < b {
32+
temp = a
33+
a = b
34+
b = temp
35+
}
36+
modulo = a mod b
37+
if modulo == 0 {
38+
return b
39+
}
40+
return gcd(b, modulo)
41+
}
42+
43+
44+
45+
46+

0 commit comments

Comments
 (0)