1. from fractions import gcd
  2. from operator import mul
  3. import random
  4. import itertools
  5.  
  6.  
  7. MAXLOOKUP=1000000
  8. MAXSMALLPRIME=300
  9.  
  10. # prime_or_factor[n]==0 indicates n is a prime,
  11. # otherwise prime_or_factor[n] holds a prime factor of n
  12. prime_or_factor=[0]*(MAXLOOKUP+1)
  13. max_p = int(MAXLOOKUP**0.5)+1
  14. prime_or_factor[4::2]=[2]*len(prime_or_factor[4::2])
  15. prime_or_factor[9::6]=[3]*len(prime_or_factor[9::6])
  16. p=5
  17. while (p <= max_p):
  18. if prime_or_factor[p]==0:
  19. prime_or_factor[p*p::2*p]=[p]*len(prime_or_factor[p*p::2*p])
  20. if p%6==5:
  21. p+=2
  22. else:
  23. p+=4
  24.  
  25. smallprimes = [p for p in range(2,MAXSMALLPRIME) if prime_or_factor[p]==0]
  26.  
  27. def all_factors( x ):
  28. if type(x)==list:
  29. allf = [1]
  30. for p in set(x):
  31. e=x.count(p)
  32. le = len(allf)
  33. pn = 1
  34. for i in range(e):
  35. pn *= p
  36. allf.extend([a*pn for a in allf[0:le] ])
  37. return allf
  38.  
  39. elif type(x)==int or type(x)==long:
  40. return all_factors(factorise(x))
  41.  
  42. #-----------------------------------------------
  43. #-----------------------------------------------
  44.  
  45. def factorise_trial_division(n):
  46. if n==1:
  47. return []
  48.  
  49. factors=[]
  50. for p in (2,3):
  51. while n%p==0:
  52. factors.append(p)
  53. n //= p
  54. q=5
  55. while q*q <= n:
  56. for p in (q,q+2):
  57. while n%p==0:
  58. factors.append(p)
  59. n //= p
  60. q+=6
  61. if n>1:
  62. factors.append(n)
  63. return factors
  64. #-----------------------------------------------
  65. def factorise_lookup(n):
  66. i = prime_or_factor[n]
  67. f=[]
  68. while i :
  69. f.append(i)
  70. n//=i
  71. i = prime_or_factor[n]
  72. if n>1:
  73. f.append(n)
  74. return f
  75. #-----------------------------------------------
  76.  
  77. def brent(N,maxBrentTime=1.0):
  78. if N%2==0:
  79. return 2
  80. # http://xn--2-umb.com/09/12/brent-pollard-rho-factorisation suggests that
  81. # m=1000 is the optimum value
  82. y,c,m = random.randint(1, N-1),random.randint(1, N-1), 200
  83. g,r,q = 1,1,1
  84. while g==1:
  85. x = y
  86. for _ in range(r):
  87. y = (y*y+c)%N
  88. k = 0
  89. while (k<r and g==1):
  90. ys = y
  91. for _ in range(min(m,r-k)):
  92. y = (y*y+c)%N
  93. q = q*(abs(x-y))%N
  94. g = gcd(q,N)
  95. k += m
  96. r = r*2
  97.  
  98. if g==N:
  99. while True:
  100. ys = (ys*ys+c)%N
  101. g = gcd(abs(x-ys),N)
  102. if g>1:
  103. break
  104. return g
  105. #-----------------------------------------------
  106.  
  107. def millerRabin(n, factor=[1]):
  108. global factorFromMillerRabin
  109.  
  110. if n == 2: return True
  111. if n<2: return False
  112. if n%2==0:
  113. factor[0]=2
  114. return False
  115.  
  116. two64 = pow(2,64)
  117. if n < 2047: P=(2,)
  118. elif n < 1373653: P=(2,3)
  119. elif n < 9080191: P=(31,73)
  120. elif n < 4759123141: P=(2,7,61)
  121. elif n < 2152302898747: P=(2,3,5,7,11)
  122. elif n < 3474749660383: P=(2,3,5,7,11,13)
  123. elif n < 341550071728321: P=(2,3,5,7,11,13,17)
  124. elif n < 3825123056546413051: P=(2,3,5,7,11,13,17,19,23)
  125. elif n < two64: P=(2, 325, 9375, 28178, 450775, 9780504, 1795265022) #http://miller-rabin.appspot.com/
  126. else: P=[2,3,5,7,11,13,17,19,23]+[random.randint(24,n-2) for i in range(40)]
  127.  
  128. if n < 3825123056546413051 and n in P: return True
  129.  
  130. # find s,d so that d is odd and (2^s)d = n-1
  131. d = (n-1)>>1
  132. s = 1
  133. while d&1 == 0:
  134. d >>= 1
  135. s += 1
  136.  
  137. for w in P:
  138. a = pow(w, d, n)
  139. if a == 1: continue
  140. r = 0
  141. while r < s:
  142. if a == n-1: break
  143. prev_a = a
  144. a = (a*a)%n
  145. if a==1:
  146. # Previous value of a was a square root of unity not equal to -1.
  147. # We can use this to find a factor of n
  148. factor[0]=gcd(prev_a - 1, n)
  149. return False
  150. r += 1
  151. if r == s:
  152. # If we arrive here, then a^(n-1) != 1 mod n,
  153. # so n cannot be a prime, but we can't find a factor of n
  154. factor[0]=1
  155. return False
  156. return True
  157.  
  158. #-----------------------------------------------
  159.  
  160. def factorise_large(n, maxBrentTime=1.0):
  161. brent_failures = 0
  162. brent_calls = 0
  163. brent_avoid = 0
  164.  
  165. if n <= MAXLOOKUP:
  166. return factorise_lookup(n)
  167.  
  168. millerrabinfactor = [1]
  169. if millerRabin(n,millerrabinfactor):
  170. return [n]
  171.  
  172. if 1 < millerrabinfactor[0] < n :
  173. p = millerrabinfactor[0]
  174. brent_avoid+=1
  175. else:
  176. p=brent(n, maxBrentTime)
  177. brent_calls+=1
  178.  
  179. q=n//p
  180. if p>q:
  181. p,q = q,p
  182. if p==1:
  183. if millerRabin(q):
  184. return [q]
  185. else:
  186. brent_failures+=1
  187. return factorise_large(q, maxBrentTime) # Try again (sometimes brent doesn't find factors)
  188. else:
  189. return factorise_large(p)+factorise_large(q)
  190.  
  191. #-----------------------------------------------
  192. # utility functions that a user can call
  193. #-----------------------------------------------
  194.  
  195. def factorise(n, maxBrentTime=1.0):
  196. if n<=MAXLOOKUP:
  197. return factorise_lookup(n)
  198.  
  199. factors=[]
  200. for p in smallprimes:
  201. while n%p==0:
  202. factors.append(p)
  203. n//=p
  204. if n ==1:
  205. return factors
  206. return factors + factorise_large(n, maxBrentTime)
  207.  
  208. def totient(n):
  209. f = factorise(n)
  210. t=1
  211. for x in set(f):
  212. t*=pow(x,f.count(x)-1)*(x-1)
  213. return t
  214.  
  215. def unfactorise( d ):
  216. return reduce(mul, d, 1)
  217.  
  218. def radical( d ):
  219. if type(d)==list:
  220. return reduce(mul, set(d), 1)
  221. else:
  222. return reduce(mul, set(factorise(d)), 1)
  223. #-----------------------------------------------
  224.  
  225.  
  226.  
  227. num_probs = int(input())
  228. for _ in range(num_probs):
  229. n = int(input())
  230. f = factorise(n)
  231. #print(n, f)
  232.  
  233. rv = 1
  234. primes = 0
  235. for x in set(f):
  236. primes += 1
  237. rv *= (1 + f.count(x))
  238. print(rv - primes)
Language: Python 3