diff --git a/stegano/lsbset/generators.py b/stegano/lsbset/generators.py index f0bdee9..b82371c 100644 --- a/stegano/lsbset/generators.py +++ b/stegano/lsbset/generators.py @@ -118,14 +118,14 @@ def ackermann_naive(m: int, n: int) -> int: return ackermann(m - 1, ackermann(m, n - 1)) -def ackermann(m: int, n: int) -> int: +def ackermann_fast(m: int, n: int) -> int: """Ackermann number. """ while m >= 4: if n == 0: n = 1 else: - n = ackermann(m, n - 1) + n = ackermann_fast(m, n - 1) m -= 1 if m == 3: return (1 << n + 3) - 3 @@ -136,6 +136,13 @@ def ackermann(m: int, n: int) -> int: else: return n + 1 +def ackermann(m: int) -> Iterator[int]: + """Ackermann written as a generator. + """ + n = 0 + while True: + yield ackermann_fast(m, n) + n += 1 def fibonacci() -> Iterator[int]: """Generate the sequence of Fibonacci. diff --git a/tests/test_lsbset.py b/tests/test_lsbset.py index 82fe754..548cac8 100644 --- a/tests/test_lsbset.py +++ b/tests/test_lsbset.py @@ -54,6 +54,18 @@ class TestLSBSet(unittest.TestCase): generators.eratosthenes()) self.assertEqual(message, clear_message) + + def test_hide_and_reveal_with_ackermann(self): + messages_to_hide = ["foo"] + for message in messages_to_hide: + secret = lsbset.hide("./tests/sample-files/Lenna.png", message, + generators.ackermann(m=3)) + secret.save("./image.png") + + clear_message = lsbset.reveal("./image.png", + generators.ackermann(m=3)) + + self.assertEqual(message, clear_message) def test_hide_and_reveal_with_shift(self): messages_to_hide = ["a", "foo", "Hello World!", ":Python:"]