diff --git a/src/cipher_analytical_machine/ciphers/gamma.clj b/src/cipher_analytical_machine/ciphers/gamma.clj new file mode 100644 index 0000000..4222ff5 --- /dev/null +++ b/src/cipher_analytical_machine/ciphers/gamma.clj @@ -0,0 +1,32 @@ +(ns cipher-analytical-machine.ciphers.gamma + (:require [clojure.string :as cs]) + (:gen-class)) + +(defn add-mod + [f s module] + (-> (+ f s) + (mod module))) + +(defn generate-seq + "Generate a lazy sequence for a key (a b c)." + [a b c module] + ((fn build-seq [a b c] + (lazy-seq (cons a (build-seq b c (add-mod a c module))))) a b c)) + +(defn generate-gamma-seq + "Generate the gamma seq from a sequence." + [acc seq module] + (if (= (second seq) nil) acc + (generate-gamma-seq + (conj acc (add-mod (first seq) (second seq) module)) + (rest seq) + module))) + +(defn generate-gamma + "Generate the gamma from a key (a b c)." + [a b c module size] + (generate-gamma-seq [] + (->> (generate-seq a b c module) + (take (inc size))) + module)) + diff --git a/test/cipher_analytical_machine/ciphers/gamma_test.clj b/test/cipher_analytical_machine/ciphers/gamma_test.clj new file mode 100644 index 0000000..ee034f1 --- /dev/null +++ b/test/cipher_analytical_machine/ciphers/gamma_test.clj @@ -0,0 +1,34 @@ +(ns cipher-analytical-machine.ciphers.gamma-test + (:require + [clojure.test :refer :all] + [cipher-analytical-machine.ciphers.gamma :refer :all])) + +(deftest add-mod-test + (testing "The remainder must be as expected." + (are [a b module expected] + (= expected (add-mod a b module)) + 5 2 4 3 + 1 2 3 0 + 2 2 3 1))) + +(deftest generate-seq-test + (testing "Checking that the next element of a sequence is calculated by (e[i-1] + e[i-3] % mod)." + (are [a b c module size expected] + (= expected (take size (generate-seq a b c module))) + 4 32 15 33 10 [4 32 15 19 18 0 19 4 4 23] + 1 2 3 3 9 [1 2 3 1 0 0 1 1 1]))) + +(deftest generate-gamma-seq-test + (testing "Checking that the next element of a sequence is calculated by (s[i] + s[i+1] % mod)." + (are [acc seq module expected] + (= expected (generate-gamma-seq acc seq module)) + [] [4 32 15 19 18 0 19 4 4 23] 33 [3 14 1 4 18 19 23 8 27] + [] [1 2 3 1 0 0 1 1 1] 3 [0 2 1 1 0 1 2 2]))) + +(deftest generate-gamma-test + (testing "Checking that the gamma is generated as expected." + (are [a b c module size expected] + (= expected (generate-gamma a b c module size)) + 4 32 15 33 10 [3 14 1 4 18 19 23 8 27 17] + 1 2 3 3 9 [0 2 1 1 0 1 2 2 0]))) +