I need to calculate the total number of divisors of the number N (without worrying about what the values of the divisors are) and do it within 40-80 operations for all such numbers N. How can I do this? This is not a homework question. I tried the Pollard Rho algorithm, but even that turned out to be too slow for my purposes. Here is my python code. How can I improve my work, if possible?
def is_prime(n): if n < 2: return False ps = [2,3,5,7,11,13,17,19,23,29,31,37,41, 43,47,53,59,61,67,71,73,79,83,89,97] def is_spsp(n, a): d, s = n-1, 0 while d%2 == 0: d /= 2; s += 1 t = pow(int(a),int(d),int(n)) if t == 1: return True while s > 0: if t == n-1: return True t = (t*t) % n s -= 1 return False if n in ps: return True for p in ps: if not is_spsp(n,p): return False return True def gcd(a,b): while b: a, b = b, a%b return abs(a) def rho_factors(n, limit=100): def gcd(a,b): while b: a, b = b, a%b return abs(a) def rho_factor(n, c, limit): f = lambda x: (x*x+c) % n t, h, d = 2, 2, 1 while d == 1: if limit == 0: raise OverflowError('limit exceeded') t = f(t); h = f(f(h)); d = gcd(th, n) if d == n: return rho_factor(n, c+1, limit) if is_prime(d): return d return rho_factor(d, c+1, limit) if -1 <= n <= 1: return [n] if n < -1: return [-1] + rho_factors(-n, limit) fs = [] while n % 2 == 0: n = n // 2; fs = fs + [2] if n == 1: return fs while not is_prime(n): f = rho_factor(n, 1, limit) n = int(n / f) fs = fs + [f] return sorted(fs + [n]) def divs(n): if(n==1): return 1 ndiv=1 f=rho_factors(n) l=len(f)