Apr-20-2018, 06:46 AM
Algorithm for finding digital root from its definition:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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