diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2015-04-17 22:56:04 +0300 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2015-04-17 22:57:41 +0300 |
commit | 89375f7490377b396726b159f60ba4b914c85285 (patch) | |
tree | 2fa8c49b963bed779d3d43e062624b34747e040b | |
parent | 4d6e87e60dbda085bfab00be365c087932edec52 (diff) | |
download | gcd-89375f7490377b396726b159f60ba4b914c85285.tar.gz |
GCD via Nix expressions
-rw-r--r-- | gcd.nix | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -0,0 +1,40 @@ +/* + +See https://nixos.org/nix/ + +Usage: + +$ nix-instantiate --eval --expr "import ./gcd.nix [22 33 44 121]" +trace: gcd2: 44 <-> 121 +trace: gcd2: 121 <-> 44 +trace: gcd2: 44 <-> 33 +trace: gcd2: 33 <-> 11 +trace: gcd2: 11 <-> 0 +trace: gcd2: 33 <-> 11 +trace: gcd2: 11 <-> 0 +trace: gcd2: 22 <-> 11 +trace: gcd2: 11 <-> 0 +11 + +*/ + +list: + +let + inherit (builtins) div toString trace + tail head; + + rem = x: y: x - y*(div x y); + + gcd2 = x: y: trace "gcd2: ${toString x} <-> ${toString y}" + (if y == 0 then x else gcd2 y (rem x y)); + + gcd = nn: + let + x = head nn; + xs = tail nn; + in if xs == [] then x + else gcd2 x (gcd xs); + +in gcd list + |