- It is a really bad idea to use a variable named l. I is hard to distinguish it from 1.
- All thesthese functions using xrange are inefficient
the lcd function can be efficiently calculated by
from fractions import gcd
def lcd(a,b):
return(a*b/gcd(a,b))
the count function is
count(l,g)=divisor_count(g/l)
where divisor_count is the number-of-divisors function
If the number n has the prime factor decomposition
$$n=p_1^{e_1}\cdot p_2^{e_2}\cdots p_k^{e_k}$$ then we have
$$ \text{divisor_count}(n)=(e_1+1)\cdot(e_2+1)\cdots(e_k+1)$$
This can be calculated in the following way:
def divisor_count(n):
cnt=1
i=2
while i*i<=n:
e=0
while n%i==0:
n//=i
e+=1
cnt*=e+1
i+=1
if n>1:
cnt*=2
return(cnt)
This divisordivisor_count function runs in
$$O(\sqrt{n})$$
time, the xrange implementation uses
$$O(n)$$
time.