Подсчет всего числа делителей прямо связан с разложением на простые множители.
Если n=(p1**k1)*(p2**k2)*…*(pm**km), где p1…pm - простые числа, то, как я понял, число делителей у этого n равно (k1+1)*(k2+1)*…(km+1)
Разложение на простые множители считается сложной математической проблемой, но числа с порядка 500 делителями это фигня, можно и по-колхозному проверять, времени немного займёт. Я лет 5 назад писал функцию:
def S_Rno(n):
if n > 10**11:
#Выход за пределы допустимого диапазона, определяется размером списка простых чисел
raise ValueError
if n==1: return {1:0}
n1=int(n**(0.5))
delit={}
ind=0
k=simples[ind]
while n!=1:
i=0
while n%k ==0:
i+=1
n/=k
if i:
delit[k]=i
n1=int(n**(0.5))
if k>n1 and n!=1:
delit[n]=1
break
ind+=1
k=simples[ind]
return delit
здесь simples - заранее созданный список простых чисел. Для чисел меньше 1000000 его размер 78498 чисел. Можно создать такой функцией:
def Simple(n):
ret=[2]
iroots=0
k=2
for i in xrange(3,n):
flag=0
for j in xrange(iroots+1):
if i%ret[j] == 0:
flag=1
break
if flag:
continue
ret.append(i)
iroot=i**(0.5)
while ret[iroots]<iroot:
iroots+=1
return ret
Мне тогда нужно было много разложений делать, поэтому я однажды создал такой список и сохранил в файл, а потом импортировал просто.