# -*- coding: utf-8 -*- from collections import defaultdict ############################ # T(n,k) from OEIS A276158 # ############################ def T(n,k): return n+1 if k==0 else 6*k*(n+1-k) ######################## # kaprekar_successor() # ######################## def kaprekar_successor(n_digits, n): a = sorted(f'{n:0{n_digits}d}') # characters; smallest to largest l = int(''.join(a)) # int with digits smallest to largest u = int(''.join(a[::-1])) # int with digits largest to smallest return u-l ######### # main # ######## if __name__ == "__main__": ND = 3 # Number of digits N = 10**ND # Number of nodes # Create dictionary where keys are the non-leaf nodes and the value # is a count of the key node's predecessor nodes(mostly leaf nodes.) # nodes = defaultdict(int) for i in range(N): nodes[kaprekar_successor(ND, i)] +=1 # count predecessors # Order keys, format and print result # n = len(nodes)-1 for k, key in enumerate(sorted(nodes.keys())): if nodes[key] != T(n,k): print("TEST FAILED") break pred_counts = f'node {key:0{ND}d} indegree = {nodes[key]:{ND}d}' oeis_result = f' = T({n},{k:2d})' print(f'{k:2d}:', pred_counts + oeis_result)