@@ -65,55 +65,42 @@ The Euclidean Algorithm is truly fundamental to many other algorithms throughout
65
65
# Example Code
66
66
### C++
67
67
``` cpp
68
- /* -------------euclidean.cpp--------------------------------------------------//
69
- *
70
- * Purpose: To implement euclidean algorithm to find the greatest common divisor
71
- *
72
- * Notes: Compile with g++ euclidean.cpp
73
- *
74
- *-----------------------------------------------------------------------------*/
75
-
76
68
#include < iostream>
77
69
#include < cmath>
78
70
79
- // Euclidean algorithm with mod
80
- int euclid_mod (int a, int b){
71
+ // Euclidean algorithm using modulus
72
+ int euclid_mod (int a, int b) {
81
73
a = std::abs(a);
82
74
b = std::abs(b);
83
-
84
- int temp;
85
- while (b != 0){
86
- temp = b;
87
- b = a%b;
75
+ while (b != 0) {
76
+ auto temp = b;
77
+ b = a % b;
88
78
a = temp;
89
79
}
90
80
91
81
return a;
92
82
}
93
83
94
84
// Euclidean algorithm with subtraction
95
- int euclid_sub(int a, int b){
85
+ int euclid_sub(int a, int b) {
96
86
a = std::abs(a);
97
87
b = std::abs(b);
98
-
99
- while (a != b){
100
- if (a > b){
101
- a = a - b;
102
- }
103
- else{
104
- b = b - a;
88
+ while (a != b) {
89
+ if (a > b) {
90
+ a -= b;
91
+ } else {
92
+ b -= a;
105
93
}
106
94
}
107
95
108
96
return a;
109
97
}
110
98
111
- int main(){
99
+ int main() {
100
+ auto check1 = euclid_mod(64* 67, 64* 81);
101
+ auto check2 = euclid_sub(128* 12, 128* 77);
112
102
113
- int check = euclid_mod(64*67, 64*81);
114
- int check2 = euclid_sub(128*12, 128*77);
115
-
116
- std::cout << check << '\n';
103
+ std::cout << check1 << '\n';
117
104
std::cout << check2 << '\n';
118
105
}
119
106
@@ -122,7 +109,7 @@ int main(){
122
109
### C
123
110
```c
124
111
#include <stdio.h>
125
- #include <stdlib .h>
112
+ #include <math .h>
126
113
127
114
int euclid_mod(int a, int b){
128
115
a = abs(a);
@@ -307,17 +294,19 @@ namespace Euclidean_Algorithm
307
294
308
295
``` haskell
309
296
euclidSub :: Integer -> Integer -> Integer
310
- euclidSub a b =
311
- if a == b then
312
- a
313
- else if a < b then
314
- euclidSub a (b - a)
315
- else
316
- euclidSub (a - b) b
297
+ euclidSub a b = inner (abs a) (abs b) where
298
+ inner a b =
299
+ if a == b then
300
+ a
301
+ else if a < b then
302
+ euclidSub a (b - a)
303
+ else
304
+ euclidSub (a - b) b
317
305
318
306
euclidMod :: Integer -> Integer -> Integer
319
- euclidMod a 0 = a
320
- euclidMod a b = euclidMod b (a `mod` b)
307
+ euclidMod a b = inner (abs a) (abs b) where
308
+ inner a 0 = a
309
+ inner a b = inner b (a `mod` b)
321
310
322
311
main :: IO ()
323
312
main = do
@@ -331,18 +320,22 @@ main = do
331
320
### Rust
332
321
333
322
``` rust
334
- fn euclid_sub (mut a : u64 , mut b : u64 ) -> u64 {
323
+ fn euclid_sub (mut a : i64 , mut b : i64 ) -> i64 {
324
+ a = a . abs ();
325
+ b = b . abs ();
335
326
while a != b {
336
327
if a < b {
337
- b = b - a ;
328
+ b -= a ;
338
329
} else {
339
- a = a - b ;
330
+ a -= b ;
340
331
}
341
332
}
342
333
a
343
334
}
344
335
345
- fn euclid_rem (mut a : u64 , mut b : u64 ) -> u64 {
336
+ fn euclid_rem (mut a : i64 , mut b : i64 ) -> i64 {
337
+ a = a . abs ();
338
+ b = b . abs ();
346
339
while b != 0 {
347
340
let tmp = b ;
348
341
b = a % b ;
@@ -362,24 +355,27 @@ fn main() {
362
355
### OCaml
363
356
364
357
``` ocaml
365
- let rec euclid_mod a b =
366
- if b = 0 then
367
- a
368
- else
369
- euclid_mod b (a mod b)
370
-
371
- let rec euclid_sub a b =
372
- if a = b then
373
- a
374
- else if a < b then
375
- euclid_sub a (b - a)
376
- else
377
- euclid_sub (a - b) b
358
+ let euclid_mod a b =
359
+ let rec inner a = function
360
+ | 0 -> a
361
+ | b -> inner b (a mod b)
362
+ in (inner (abs a) (abs b))
363
+
364
+ let euclid_sub a b =
365
+ let rec inner a b =
366
+ if a = b then
367
+ a
368
+ else if a < b then
369
+ inner a (b - a)
370
+ else
371
+ inner (a - b) b
372
+ in (inner (abs a) (abs b))
378
373
379
374
let chk1 = euclid_mod (64 * 67) (64 * 81)
380
375
let chk2 = euclid_sub (128 * 12) (128 * 77)
381
- let () = print_string ((int_of_string chk1) ^ "\n")
382
- let () = print_string ((int_of_string chk2) ^ "\n")
376
+ let () =
377
+ chk1 |> print_int |> print_newline;
378
+ chk2 |> print_int |> print_newline
383
379
```
384
380
385
381
### Java
@@ -393,8 +389,8 @@ public static void main(String[] args) {
393
389
}
394
390
395
391
public static int euclidSub(int a, int b) {
396
- a = Math . abs(a);
397
- b = Math . abs(b);
392
+ a = Math . abs(a);
393
+ b = Math . abs(b);
398
394
399
395
while (a != b) {
400
396
if (a > b) {
@@ -408,8 +404,8 @@ public static int euclidSub(int a, int b) {
408
404
}
409
405
410
406
public static int euclidMod(int a, int b) {
411
- a = Math . abs(a);
412
- b = Math . abs(b);
407
+ a = Math . abs(a);
408
+ b = Math . abs(b);
413
409
414
410
while (b != 0 ){
415
411
int temp = b;
0 commit comments