From 6f2945f18f89dfe2a2c3147ac6109f7fdc253d5b Mon Sep 17 00:00:00 2001 From: ubsan Date: Sun, 17 Sep 2017 16:14:27 -0700 Subject: [PATCH 1/3] add ocaml to euclidean --- .../euclidean_algorithm/euclidean.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md index 722a31619..2ffdd1282 100644 --- a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md +++ b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md @@ -331,3 +331,26 @@ fn main() { println!("{}", chk2); } ``` + +### OCaml + +```ocaml +let rec euclid_mod a b = + if b = 0 then + a + else + euclid_mod b (a mod b) + +let rec euclid_sub a b = + if a = b then + a + else if a < b then + euclid_sub a (b - a) + else + euclid_sub (a - b) b + +let chk1 = euclid_mod (64 * 67) (64 * 81) +let chk2 = euclid_sub (128 * 12) (128 * 77) +let () = print_string ((int_of_string chk1) ^ "\n") +let () = print_string ((int_of_string chk2) ^ "\n") +``` From 59d40bb26793e7a3cb27a71be05d9034f51cb37b Mon Sep 17 00:00:00 2001 From: leios Date: Mon, 18 Sep 2017 08:22:45 +0900 Subject: [PATCH 2/3] adding java implementation for euclidean algorithm --- .../euclidean_algorithm/euclidean.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md index 2ffdd1282..b049d3f54 100644 --- a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md +++ b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md @@ -354,3 +354,36 @@ let chk2 = euclid_sub (128 * 12) (128 * 77) let () = print_string ((int_of_string chk1) ^ "\n") let () = print_string ((int_of_string chk2) ^ "\n") ``` + +### Java +```java +// sumbitted by lolatomroflsinnlos +public static void main(String[] args) { + + System.out.println(euclidSub(64 * 67, 64 * 81)); + System.out.println(euclidMod(128 * 12, 128 * 77)); + +} + +public static int euclidSub(int a, int b) { + while (a != b) { + if (a > b) { + a -=b; + } else { + b -=a; + } + } + + return a; +} + +public static int euclidMod(int a, int b) { + while (b != 0){ + int temp = b; + b = a % b; + a = temp; + } + + return a; +} +``` From fe98cec5eca2dc91ef60f2562ae57dde4291b525 Mon Sep 17 00:00:00 2001 From: ubsan Date: Tue, 19 Sep 2017 01:21:53 -0700 Subject: [PATCH 3/3] Rust, OCaml, Haskell, C++ support for negative nums standardize the C++ style --- .../euclidean_algorithm/euclidean.md | 115 +++++++++--------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md index b049d3f54..2d5814683 100644 --- a/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md +++ b/chapters/fundamental_algorithms/euclidean_algorithm/euclidean.md @@ -65,23 +65,16 @@ The Euclidean Algorithm is truly fundamental to many other algorithms throughout # Example Code ### C++ ```cpp -/*-------------euclidean.cpp--------------------------------------------------// -* -* Purpose: To implement euclidean algorithm to find the greatest common divisor -* -* Notes: Compile with g++ euclidean.cpp -* -*-----------------------------------------------------------------------------*/ - #include - -// Euclidean algorithm with mod -int euclid_mod(int a, int b){ - - int temp; - while (b != 0){ - temp = b; - b = a%b; +#include + +// Euclidean algorithm using modulus +int euclid_mod(int a, int b) { + a = std::abs(a); + b = std::abs(b); + while (b != 0) { + auto temp = b; + b = a % b; a = temp; } @@ -89,26 +82,25 @@ int euclid_mod(int a, int b){ } // Euclidean algorithm with subtraction -int euclid_sub(int a, int b){ - - while (a != b){ - if (a > b){ - a = a - b; - } - else{ - b = b - a; +int euclid_sub(int a, int b) { + a = std::abs(a); + b = std::abs(b); + while (a != b) { + if (a > b) { + a -= b; + } else { + b -= a; } } return a; } -int main(){ - - int check = euclid_mod(64*67, 64*81); - int check2 = euclid_sub(128*12, 128*77); +int main() { + auto check1 = euclid_mod(64*67, 64*81); + auto check2 = euclid_sub(128*12, 128*77); - std::cout << check << '\n'; + std::cout << check1 << '\n'; std::cout << check2 << '\n'; } @@ -280,17 +272,19 @@ namespace Euclidean_Algorithm ```haskell euclidSub :: Integer -> Integer -> Integer -euclidSub a b = - if a == b then - a - else if a < b then - euclidSub a (b - a) - else - euclidSub (a - b) b +euclidSub a b = inner (abs a) (abs b) where + inner a b = + if a == b then + a + else if a < b then + euclidSub a (b - a) + else + euclidSub (a - b) b euclidMod :: Integer -> Integer -> Integer -euclidMod a 0 = a -euclidMod a b = euclidMod b (a `mod` b) +euclidMod a b = inner (abs a) (abs b) where + inner a 0 = a + inner a b = inner b (a `mod` b) main :: IO () main = do @@ -304,18 +298,22 @@ main = do ### Rust ```rust -fn euclid_sub(mut a: u64, mut b: u64) -> u64 { +fn euclid_sub(mut a: i64, mut b: i64) -> i64 { + a = a.abs(); + b = b.abs(); while a != b { if a < b { - b = b - a; + b -= a; } else { - a = a - b; + a -= b; } } a } -fn euclid_rem(mut a: u64, mut b: u64) -> u64 { +fn euclid_rem(mut a: i64, mut b: i64) -> i64 { + a = a.abs(); + b = b.abs(); while b != 0 { let tmp = b; b = a % b; @@ -335,24 +333,27 @@ fn main() { ### OCaml ```ocaml -let rec euclid_mod a b = - if b = 0 then - a - else - euclid_mod b (a mod b) - -let rec euclid_sub a b = - if a = b then - a - else if a < b then - euclid_sub a (b - a) - else - euclid_sub (a - b) b +let euclid_mod a b = + let rec inner a = function + | 0 -> a + | b -> inner b (a mod b) + in (inner (abs a) (abs b)) + +let euclid_sub a b = + let rec inner a b = + if a = b then + a + else if a < b then + inner a (b - a) + else + inner (a - b) b + in (inner (abs a) (abs b)) let chk1 = euclid_mod (64 * 67) (64 * 81) let chk2 = euclid_sub (128 * 12) (128 * 77) -let () = print_string ((int_of_string chk1) ^ "\n") -let () = print_string ((int_of_string chk2) ^ "\n") +let () = + chk1 |> print_int |> print_newline; + chk2 |> print_int |> print_newline ``` ### Java