# Digital roots. # @see en.wikipedia.org/wiki/Digital_root # Formal definition. # A natural number n is a digital root if it is a fixed point for digit_sum # (which occurs if digit_sum(n) equals n). def fixed_point(f, guess, equal): while not equal(guess, result := f(guess)): guess = result return guess def digit_sum(n): return sum(map(int, str(n))) def digital_root_1(n: int) -> int: return fixed_point(digit_sum, n, lambda x, y: x == y) # Direct formulas. def digital_root_2(n: int) -> int: if n == 0: return 0 n %= 9 return n if n != 0 else 9 def digital_root_3(n: int) -> int: if n == 0: return 0 return 1 + (n - 1) % 9 def digital_root_4(n: int) -> int: if n == 0: return 0 return n - (n - 1) // 9 * 9 # flooring division # Show. def digital_root_show_all(n): fs = [ digital_root_1, digital_root_2, digital_root_3, digital_root_4 ] for f in fs: print(list(map(f, range(n)))) if __name__ == '__main__': digital_root_show_all(12)
Standard input is empty
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2]