Apr-20-2018, 06:46 AM
Algorithm for finding digital root from its definition:
import numpy as np import random import time start1 = time.time() # Very large number N = 20000000 # the number of digits num = ''.join(np.random.choice(['0','1','2','3','4','5','6','7','8','9'], N)) #num is a string now... print("Generating a very big number...#digits=%s, total seconds spent: %s " % (N, time.time() - start1)) # prepare the number unum = np.fromiter(num, count=N, dtype=np.short) # is_divisible_by_9 = lambda x: np.sum(x) % 9 == 0, this could help.... def digital_root(num): s = np.sum(num) while True: if 0 <= s <= 9: return s else: s = np.sum(np.fromiter(str(s), dtype=np.short)) start2 = time.time() print("Digital root is:", digital_root(unum)) print("Finding number's digital root, total seconds spent: %s " % (time.time() - start2,)) unum = map(int, num) def digital_root_wo_numpy(num): s = sum(num) while True: if 0 <= s <= 9: return s else: s = sum(map(int, str(s))) start3 = time.time() print("Digital root is:", digital_root_wo_numpy(unum)) print("Finding number's digital root without numpy, total seconds spent: %s " % (time.time() - start3,))
Output:Generating a very big number...#digits=20000000, total seconds spent: 8.759913921356201
Digital root is: 7
Finding number's digital root, total seconds spent: 0.028986692428588867
Digital root is: 7
Finding number's digital root without numpy, total seconds spent: 4.6343841552734375