test_factor_.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. from sympy.concrete.summations import summation
  2. from sympy.core.containers import Dict
  3. from sympy.core.mul import Mul
  4. from sympy.core.power import Pow
  5. from sympy.core.singleton import S
  6. from sympy.core.symbol import Symbol
  7. from sympy.functions.combinatorial.factorials import factorial as fac
  8. from sympy.core.evalf import bitcount
  9. from sympy.core.numbers import Integer, Rational
  10. from sympy.ntheory import (totient,
  11. factorint, primefactors, divisors, nextprime,
  12. primerange, pollard_rho, perfect_power, multiplicity, multiplicity_in_factorial,
  13. trailing, divisor_count, primorial, pollard_pm1, divisor_sigma,
  14. factorrat, reduced_totient)
  15. from sympy.ntheory.factor_ import (smoothness, smoothness_p, proper_divisors,
  16. antidivisors, antidivisor_count, core, udivisors, udivisor_sigma,
  17. udivisor_count, proper_divisor_count, primenu, primeomega, small_trailing,
  18. mersenne_prime_exponent, is_perfect, is_mersenne_prime, is_abundant,
  19. is_deficient, is_amicable, dra, drm)
  20. from sympy.testing.pytest import raises, slow
  21. from sympy.utilities.iterables import capture
  22. def fac_multiplicity(n, p):
  23. """Return the power of the prime number p in the
  24. factorization of n!"""
  25. if p > n:
  26. return 0
  27. if p > n//2:
  28. return 1
  29. q, m = n, 0
  30. while q >= p:
  31. q //= p
  32. m += q
  33. return m
  34. def multiproduct(seq=(), start=1):
  35. """
  36. Return the product of a sequence of factors with multiplicities,
  37. times the value of the parameter ``start``. The input may be a
  38. sequence of (factor, exponent) pairs or a dict of such pairs.
  39. >>> multiproduct({3:7, 2:5}, 4) # = 3**7 * 2**5 * 4
  40. 279936
  41. """
  42. if not seq:
  43. return start
  44. if isinstance(seq, dict):
  45. seq = iter(seq.items())
  46. units = start
  47. multi = []
  48. for base, exp in seq:
  49. if not exp:
  50. continue
  51. elif exp == 1:
  52. units *= base
  53. else:
  54. if exp % 2:
  55. units *= base
  56. multi.append((base, exp//2))
  57. return units * multiproduct(multi)**2
  58. def test_trailing_bitcount():
  59. assert trailing(0) == 0
  60. assert trailing(1) == 0
  61. assert trailing(-1) == 0
  62. assert trailing(2) == 1
  63. assert trailing(7) == 0
  64. assert trailing(-7) == 0
  65. for i in range(100):
  66. assert trailing(1 << i) == i
  67. assert trailing((1 << i) * 31337) == i
  68. assert trailing(1 << 1000001) == 1000001
  69. assert trailing((1 << 273956)*7**37) == 273956
  70. # issue 12709
  71. big = small_trailing[-1]*2
  72. assert trailing(-big) == trailing(big)
  73. assert bitcount(-big) == bitcount(big)
  74. def test_multiplicity():
  75. for b in range(2, 20):
  76. for i in range(100):
  77. assert multiplicity(b, b**i) == i
  78. assert multiplicity(b, (b**i) * 23) == i
  79. assert multiplicity(b, (b**i) * 1000249) == i
  80. # Should be fast
  81. assert multiplicity(10, 10**10023) == 10023
  82. # Should exit quickly
  83. assert multiplicity(10**10, 10**10) == 1
  84. # Should raise errors for bad input
  85. raises(ValueError, lambda: multiplicity(1, 1))
  86. raises(ValueError, lambda: multiplicity(1, 2))
  87. raises(ValueError, lambda: multiplicity(1.3, 2))
  88. raises(ValueError, lambda: multiplicity(2, 0))
  89. raises(ValueError, lambda: multiplicity(1.3, 0))
  90. # handles Rationals
  91. assert multiplicity(10, Rational(30, 7)) == 1
  92. assert multiplicity(Rational(2, 7), Rational(4, 7)) == 1
  93. assert multiplicity(Rational(1, 7), Rational(3, 49)) == 2
  94. assert multiplicity(Rational(2, 7), Rational(7, 2)) == -1
  95. assert multiplicity(3, Rational(1, 9)) == -2
  96. def test_multiplicity_in_factorial():
  97. n = fac(1000)
  98. for i in (2, 4, 6, 12, 30, 36, 48, 60, 72, 96):
  99. assert multiplicity(i, n) == multiplicity_in_factorial(i, 1000)
  100. def test_perfect_power():
  101. raises(ValueError, lambda: perfect_power(0.1))
  102. assert perfect_power(0) is False
  103. assert perfect_power(1) is False
  104. assert perfect_power(2) is False
  105. assert perfect_power(3) is False
  106. assert perfect_power(4) == (2, 2)
  107. assert perfect_power(14) is False
  108. assert perfect_power(25) == (5, 2)
  109. assert perfect_power(22) is False
  110. assert perfect_power(22, [2]) is False
  111. assert perfect_power(137**(3*5*13)) == (137, 3*5*13)
  112. assert perfect_power(137**(3*5*13) + 1) is False
  113. assert perfect_power(137**(3*5*13) - 1) is False
  114. assert perfect_power(103005006004**7) == (103005006004, 7)
  115. assert perfect_power(103005006004**7 + 1) is False
  116. assert perfect_power(103005006004**7 - 1) is False
  117. assert perfect_power(103005006004**12) == (103005006004, 12)
  118. assert perfect_power(103005006004**12 + 1) is False
  119. assert perfect_power(103005006004**12 - 1) is False
  120. assert perfect_power(2**10007) == (2, 10007)
  121. assert perfect_power(2**10007 + 1) is False
  122. assert perfect_power(2**10007 - 1) is False
  123. assert perfect_power((9**99 + 1)**60) == (9**99 + 1, 60)
  124. assert perfect_power((9**99 + 1)**60 + 1) is False
  125. assert perfect_power((9**99 + 1)**60 - 1) is False
  126. assert perfect_power((10**40000)**2, big=False) == (10**40000, 2)
  127. assert perfect_power(10**100000) == (10, 100000)
  128. assert perfect_power(10**100001) == (10, 100001)
  129. assert perfect_power(13**4, [3, 5]) is False
  130. assert perfect_power(3**4, [3, 10], factor=0) is False
  131. assert perfect_power(3**3*5**3) == (15, 3)
  132. assert perfect_power(2**3*5**5) is False
  133. assert perfect_power(2*13**4) is False
  134. assert perfect_power(2**5*3**3) is False
  135. t = 2**24
  136. for d in divisors(24):
  137. m = perfect_power(t*3**d)
  138. assert m and m[1] == d or d == 1
  139. m = perfect_power(t*3**d, big=False)
  140. assert m and m[1] == 2 or d == 1 or d == 3, (d, m)
  141. # negatives and non-integer rationals
  142. assert perfect_power(-4) is False
  143. assert perfect_power(-8) == (-2, 3)
  144. assert perfect_power(Rational(1, 2)**3) == (S.Half, 3)
  145. assert perfect_power(Rational(-3, 2)**3) == (-3*S.Half, 3)
  146. @slow
  147. def test_factorint():
  148. assert primefactors(123456) == [2, 3, 643]
  149. assert factorint(0) == {0: 1}
  150. assert factorint(1) == {}
  151. assert factorint(-1) == {-1: 1}
  152. assert factorint(-2) == {-1: 1, 2: 1}
  153. assert factorint(-16) == {-1: 1, 2: 4}
  154. assert factorint(2) == {2: 1}
  155. assert factorint(126) == {2: 1, 3: 2, 7: 1}
  156. assert factorint(123456) == {2: 6, 3: 1, 643: 1}
  157. assert factorint(5951757) == {3: 1, 7: 1, 29: 2, 337: 1}
  158. assert factorint(64015937) == {7993: 1, 8009: 1}
  159. assert factorint(2**(2**6) + 1) == {274177: 1, 67280421310721: 1}
  160. #issue 19683
  161. assert factorint(10**38 - 1) == {3: 2, 11: 1, 909090909090909091: 1, 1111111111111111111: 1}
  162. #issue 17676
  163. assert factorint(28300421052393658575) == {3: 1, 5: 2, 11: 2, 43: 1, 2063: 2, 4127: 1, 4129: 1}
  164. assert factorint(2063**2 * 4127**1 * 4129**1) == {2063: 2, 4127: 1, 4129: 1}
  165. assert factorint(2347**2 * 7039**1 * 7043**1) == {2347: 2, 7039: 1, 7043: 1}
  166. assert factorint(0, multiple=True) == [0]
  167. assert factorint(1, multiple=True) == []
  168. assert factorint(-1, multiple=True) == [-1]
  169. assert factorint(-2, multiple=True) == [-1, 2]
  170. assert factorint(-16, multiple=True) == [-1, 2, 2, 2, 2]
  171. assert factorint(2, multiple=True) == [2]
  172. assert factorint(24, multiple=True) == [2, 2, 2, 3]
  173. assert factorint(126, multiple=True) == [2, 3, 3, 7]
  174. assert factorint(123456, multiple=True) == [2, 2, 2, 2, 2, 2, 3, 643]
  175. assert factorint(5951757, multiple=True) == [3, 7, 29, 29, 337]
  176. assert factorint(64015937, multiple=True) == [7993, 8009]
  177. assert factorint(2**(2**6) + 1, multiple=True) == [274177, 67280421310721]
  178. assert factorint(fac(1, evaluate=False)) == {}
  179. assert factorint(fac(7, evaluate=False)) == {2: 4, 3: 2, 5: 1, 7: 1}
  180. assert factorint(fac(15, evaluate=False)) == \
  181. {2: 11, 3: 6, 5: 3, 7: 2, 11: 1, 13: 1}
  182. assert factorint(fac(20, evaluate=False)) == \
  183. {2: 18, 3: 8, 5: 4, 7: 2, 11: 1, 13: 1, 17: 1, 19: 1}
  184. assert factorint(fac(23, evaluate=False)) == \
  185. {2: 19, 3: 9, 5: 4, 7: 3, 11: 2, 13: 1, 17: 1, 19: 1, 23: 1}
  186. assert multiproduct(factorint(fac(200))) == fac(200)
  187. assert multiproduct(factorint(fac(200, evaluate=False))) == fac(200)
  188. for b, e in factorint(fac(150)).items():
  189. assert e == fac_multiplicity(150, b)
  190. for b, e in factorint(fac(150, evaluate=False)).items():
  191. assert e == fac_multiplicity(150, b)
  192. assert factorint(103005006059**7) == {103005006059: 7}
  193. assert factorint(31337**191) == {31337: 191}
  194. assert factorint(2**1000 * 3**500 * 257**127 * 383**60) == \
  195. {2: 1000, 3: 500, 257: 127, 383: 60}
  196. assert len(factorint(fac(10000))) == 1229
  197. assert len(factorint(fac(10000, evaluate=False))) == 1229
  198. assert factorint(12932983746293756928584532764589230) == \
  199. {2: 1, 5: 1, 73: 1, 727719592270351: 1, 63564265087747: 1, 383: 1}
  200. assert factorint(727719592270351) == {727719592270351: 1}
  201. assert factorint(2**64 + 1, use_trial=False) == factorint(2**64 + 1)
  202. for n in range(60000):
  203. assert multiproduct(factorint(n)) == n
  204. assert pollard_rho(2**64 + 1, seed=1) == 274177
  205. assert pollard_rho(19, seed=1) is None
  206. assert factorint(3, limit=2) == {3: 1}
  207. assert factorint(12345) == {3: 1, 5: 1, 823: 1}
  208. assert factorint(
  209. 12345, limit=3) == {4115: 1, 3: 1} # the 5 is greater than the limit
  210. assert factorint(1, limit=1) == {}
  211. assert factorint(0, 3) == {0: 1}
  212. assert factorint(12, limit=1) == {12: 1}
  213. assert factorint(30, limit=2) == {2: 1, 15: 1}
  214. assert factorint(16, limit=2) == {2: 4}
  215. assert factorint(124, limit=3) == {2: 2, 31: 1}
  216. assert factorint(4*31**2, limit=3) == {2: 2, 31: 2}
  217. p1 = nextprime(2**32)
  218. p2 = nextprime(2**16)
  219. p3 = nextprime(p2)
  220. assert factorint(p1*p2*p3) == {p1: 1, p2: 1, p3: 1}
  221. assert factorint(13*17*19, limit=15) == {13: 1, 17*19: 1}
  222. assert factorint(1951*15013*15053, limit=2000) == {225990689: 1, 1951: 1}
  223. assert factorint(primorial(17) + 1, use_pm1=0) == \
  224. {int(19026377261): 1, 3467: 1, 277: 1, 105229: 1}
  225. # when prime b is closer than approx sqrt(8*p) to prime p then they are
  226. # "close" and have a trivial factorization
  227. a = nextprime(2**2**8) # 78 digits
  228. b = nextprime(a + 2**2**4)
  229. assert 'Fermat' in capture(lambda: factorint(a*b, verbose=1))
  230. raises(ValueError, lambda: pollard_rho(4))
  231. raises(ValueError, lambda: pollard_pm1(3))
  232. raises(ValueError, lambda: pollard_pm1(10, B=2))
  233. # verbose coverage
  234. n = nextprime(2**16)*nextprime(2**17)*nextprime(1901)
  235. assert 'with primes' in capture(lambda: factorint(n, verbose=1))
  236. capture(lambda: factorint(nextprime(2**16)*1012, verbose=1))
  237. n = nextprime(2**17)
  238. capture(lambda: factorint(n**3, verbose=1)) # perfect power termination
  239. capture(lambda: factorint(2*n, verbose=1)) # factoring complete msg
  240. # exceed 1st
  241. n = nextprime(2**17)
  242. n *= nextprime(n)
  243. assert '1000' in capture(lambda: factorint(n, limit=1000, verbose=1))
  244. n *= nextprime(n)
  245. assert len(factorint(n)) == 3
  246. assert len(factorint(n, limit=p1)) == 3
  247. n *= nextprime(2*n)
  248. # exceed 2nd
  249. assert '2001' in capture(lambda: factorint(n, limit=2000, verbose=1))
  250. assert capture(
  251. lambda: factorint(n, limit=4000, verbose=1)).count('Pollard') == 2
  252. # non-prime pm1 result
  253. n = nextprime(8069)
  254. n *= nextprime(2*n)*nextprime(2*n, 2)
  255. capture(lambda: factorint(n, verbose=1)) # non-prime pm1 result
  256. # factor fermat composite
  257. p1 = nextprime(2**17)
  258. p2 = nextprime(2*p1)
  259. assert factorint((p1*p2**2)**3) == {p1: 3, p2: 6}
  260. # Test for non integer input
  261. raises(ValueError, lambda: factorint(4.5))
  262. # test dict/Dict input
  263. sans = '2**10*3**3'
  264. n = {4: 2, 12: 3}
  265. assert str(factorint(n)) == sans
  266. assert str(factorint(Dict(n))) == sans
  267. def test_divisors_and_divisor_count():
  268. assert divisors(-1) == [1]
  269. assert divisors(0) == []
  270. assert divisors(1) == [1]
  271. assert divisors(2) == [1, 2]
  272. assert divisors(3) == [1, 3]
  273. assert divisors(17) == [1, 17]
  274. assert divisors(10) == [1, 2, 5, 10]
  275. assert divisors(100) == [1, 2, 4, 5, 10, 20, 25, 50, 100]
  276. assert divisors(101) == [1, 101]
  277. assert divisor_count(0) == 0
  278. assert divisor_count(-1) == 1
  279. assert divisor_count(1) == 1
  280. assert divisor_count(6) == 4
  281. assert divisor_count(12) == 6
  282. assert divisor_count(180, 3) == divisor_count(180//3)
  283. assert divisor_count(2*3*5, 7) == 0
  284. def test_proper_divisors_and_proper_divisor_count():
  285. assert proper_divisors(-1) == []
  286. assert proper_divisors(0) == []
  287. assert proper_divisors(1) == []
  288. assert proper_divisors(2) == [1]
  289. assert proper_divisors(3) == [1]
  290. assert proper_divisors(17) == [1]
  291. assert proper_divisors(10) == [1, 2, 5]
  292. assert proper_divisors(100) == [1, 2, 4, 5, 10, 20, 25, 50]
  293. assert proper_divisors(1000000007) == [1]
  294. assert proper_divisor_count(0) == 0
  295. assert proper_divisor_count(-1) == 0
  296. assert proper_divisor_count(1) == 0
  297. assert proper_divisor_count(36) == 8
  298. assert proper_divisor_count(2*3*5) == 7
  299. def test_udivisors_and_udivisor_count():
  300. assert udivisors(-1) == [1]
  301. assert udivisors(0) == []
  302. assert udivisors(1) == [1]
  303. assert udivisors(2) == [1, 2]
  304. assert udivisors(3) == [1, 3]
  305. assert udivisors(17) == [1, 17]
  306. assert udivisors(10) == [1, 2, 5, 10]
  307. assert udivisors(100) == [1, 4, 25, 100]
  308. assert udivisors(101) == [1, 101]
  309. assert udivisors(1000) == [1, 8, 125, 1000]
  310. assert udivisor_count(0) == 0
  311. assert udivisor_count(-1) == 1
  312. assert udivisor_count(1) == 1
  313. assert udivisor_count(6) == 4
  314. assert udivisor_count(12) == 4
  315. assert udivisor_count(180) == 8
  316. assert udivisor_count(2*3*5*7) == 16
  317. def test_issue_6981():
  318. S = set(divisors(4)).union(set(divisors(Integer(2))))
  319. assert S == {1,2,4}
  320. def test_totient():
  321. assert [totient(k) for k in range(1, 12)] == \
  322. [1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10]
  323. assert totient(5005) == 2880
  324. assert totient(5006) == 2502
  325. assert totient(5009) == 5008
  326. assert totient(2**100) == 2**99
  327. raises(ValueError, lambda: totient(30.1))
  328. raises(ValueError, lambda: totient(20.001))
  329. m = Symbol("m", integer=True)
  330. assert totient(m)
  331. assert totient(m).subs(m, 3**10) == 3**10 - 3**9
  332. assert summation(totient(m), (m, 1, 11)) == 42
  333. n = Symbol("n", integer=True, positive=True)
  334. assert totient(n).is_integer
  335. x=Symbol("x", integer=False)
  336. raises(ValueError, lambda: totient(x))
  337. y=Symbol("y", positive=False)
  338. raises(ValueError, lambda: totient(y))
  339. z=Symbol("z", positive=True, integer=True)
  340. raises(ValueError, lambda: totient(2**(-z)))
  341. def test_reduced_totient():
  342. assert [reduced_totient(k) for k in range(1, 16)] == \
  343. [1, 1, 2, 2, 4, 2, 6, 2, 6, 4, 10, 2, 12, 6, 4]
  344. assert reduced_totient(5005) == 60
  345. assert reduced_totient(5006) == 2502
  346. assert reduced_totient(5009) == 5008
  347. assert reduced_totient(2**100) == 2**98
  348. m = Symbol("m", integer=True)
  349. assert reduced_totient(m)
  350. assert reduced_totient(m).subs(m, 2**3*3**10) == 3**10 - 3**9
  351. assert summation(reduced_totient(m), (m, 1, 16)) == 68
  352. n = Symbol("n", integer=True, positive=True)
  353. assert reduced_totient(n).is_integer
  354. def test_divisor_sigma():
  355. assert [divisor_sigma(k) for k in range(1, 12)] == \
  356. [1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12]
  357. assert [divisor_sigma(k, 2) for k in range(1, 12)] == \
  358. [1, 5, 10, 21, 26, 50, 50, 85, 91, 130, 122]
  359. assert divisor_sigma(23450) == 50592
  360. assert divisor_sigma(23450, 0) == 24
  361. assert divisor_sigma(23450, 1) == 50592
  362. assert divisor_sigma(23450, 2) == 730747500
  363. assert divisor_sigma(23450, 3) == 14666785333344
  364. a = Symbol("a", prime=True)
  365. b = Symbol("b", prime=True)
  366. j = Symbol("j", integer=True, positive=True)
  367. k = Symbol("k", integer=True, positive=True)
  368. assert divisor_sigma(a**j*b**k) == (a**(j + 1) - 1)*(b**(k + 1) - 1)/((a - 1)*(b - 1))
  369. assert divisor_sigma(a**j*b**k, 2) == (a**(2*j + 2) - 1)*(b**(2*k + 2) - 1)/((a**2 - 1)*(b**2 - 1))
  370. assert divisor_sigma(a**j*b**k, 0) == (j + 1)*(k + 1)
  371. m = Symbol("m", integer=True)
  372. k = Symbol("k", integer=True)
  373. assert divisor_sigma(m)
  374. assert divisor_sigma(m, k)
  375. assert divisor_sigma(m).subs(m, 3**10) == 88573
  376. assert divisor_sigma(m, k).subs([(m, 3**10), (k, 3)]) == 213810021790597
  377. assert summation(divisor_sigma(m), (m, 1, 11)) == 99
  378. def test_udivisor_sigma():
  379. assert [udivisor_sigma(k) for k in range(1, 12)] == \
  380. [1, 3, 4, 5, 6, 12, 8, 9, 10, 18, 12]
  381. assert [udivisor_sigma(k, 3) for k in range(1, 12)] == \
  382. [1, 9, 28, 65, 126, 252, 344, 513, 730, 1134, 1332]
  383. assert udivisor_sigma(23450) == 42432
  384. assert udivisor_sigma(23450, 0) == 16
  385. assert udivisor_sigma(23450, 1) == 42432
  386. assert udivisor_sigma(23450, 2) == 702685000
  387. assert udivisor_sigma(23450, 4) == 321426961814978248
  388. m = Symbol("m", integer=True)
  389. k = Symbol("k", integer=True)
  390. assert udivisor_sigma(m)
  391. assert udivisor_sigma(m, k)
  392. assert udivisor_sigma(m).subs(m, 4**9) == 262145
  393. assert udivisor_sigma(m, k).subs([(m, 4**9), (k, 2)]) == 68719476737
  394. assert summation(udivisor_sigma(m), (m, 2, 15)) == 169
  395. def test_issue_4356():
  396. assert factorint(1030903) == {53: 2, 367: 1}
  397. def test_divisors():
  398. assert divisors(28) == [1, 2, 4, 7, 14, 28]
  399. assert list(divisors(3*5*7, 1)) == [1, 3, 5, 15, 7, 21, 35, 105]
  400. assert divisors(0) == []
  401. def test_divisor_count():
  402. assert divisor_count(0) == 0
  403. assert divisor_count(6) == 4
  404. def test_proper_divisors():
  405. assert proper_divisors(-1) == []
  406. assert proper_divisors(28) == [1, 2, 4, 7, 14]
  407. assert list(proper_divisors(3*5*7, True)) == [1, 3, 5, 15, 7, 21, 35]
  408. def test_proper_divisor_count():
  409. assert proper_divisor_count(6) == 3
  410. assert proper_divisor_count(108) == 11
  411. def test_antidivisors():
  412. assert antidivisors(-1) == []
  413. assert antidivisors(-3) == [2]
  414. assert antidivisors(14) == [3, 4, 9]
  415. assert antidivisors(237) == [2, 5, 6, 11, 19, 25, 43, 95, 158]
  416. assert antidivisors(12345) == [2, 6, 7, 10, 30, 1646, 3527, 4938, 8230]
  417. assert antidivisors(393216) == [262144]
  418. assert sorted(x for x in antidivisors(3*5*7, 1)) == \
  419. [2, 6, 10, 11, 14, 19, 30, 42, 70]
  420. assert antidivisors(1) == []
  421. def test_antidivisor_count():
  422. assert antidivisor_count(0) == 0
  423. assert antidivisor_count(-1) == 0
  424. assert antidivisor_count(-4) == 1
  425. assert antidivisor_count(20) == 3
  426. assert antidivisor_count(25) == 5
  427. assert antidivisor_count(38) == 7
  428. assert antidivisor_count(180) == 6
  429. assert antidivisor_count(2*3*5) == 3
  430. def test_smoothness_and_smoothness_p():
  431. assert smoothness(1) == (1, 1)
  432. assert smoothness(2**4*3**2) == (3, 16)
  433. assert smoothness_p(10431, m=1) == \
  434. (1, [(3, (2, 2, 4)), (19, (1, 5, 5)), (61, (1, 31, 31))])
  435. assert smoothness_p(10431) == \
  436. (-1, [(3, (2, 2, 2)), (19, (1, 3, 9)), (61, (1, 5, 5))])
  437. assert smoothness_p(10431, power=1) == \
  438. (-1, [(3, (2, 2, 2)), (61, (1, 5, 5)), (19, (1, 3, 9))])
  439. assert smoothness_p(21477639576571, visual=1) == \
  440. 'p**i=4410317**1 has p-1 B=1787, B-pow=1787\n' + \
  441. 'p**i=4869863**1 has p-1 B=2434931, B-pow=2434931'
  442. def test_visual_factorint():
  443. assert factorint(1, visual=1) == 1
  444. forty2 = factorint(42, visual=True)
  445. assert type(forty2) == Mul
  446. assert str(forty2) == '2**1*3**1*7**1'
  447. assert factorint(1, visual=True) is S.One
  448. no = {"evaluate": False}
  449. assert factorint(42**2, visual=True) == Mul(Pow(2, 2, **no),
  450. Pow(3, 2, **no),
  451. Pow(7, 2, **no), **no)
  452. assert -1 in factorint(-42, visual=True).args
  453. def test_factorrat():
  454. assert str(factorrat(S(12)/1, visual=True)) == '2**2*3**1'
  455. assert str(factorrat(Rational(1, 1), visual=True)) == '1'
  456. assert str(factorrat(S(25)/14, visual=True)) == '5**2/(2*7)'
  457. assert str(factorrat(Rational(25, 14), visual=True)) == '5**2/(2*7)'
  458. assert str(factorrat(S(-25)/14/9, visual=True)) == '-1*5**2/(2*3**2*7)'
  459. assert factorrat(S(12)/1, multiple=True) == [2, 2, 3]
  460. assert factorrat(Rational(1, 1), multiple=True) == []
  461. assert factorrat(S(25)/14, multiple=True) == [Rational(1, 7), S.Half, 5, 5]
  462. assert factorrat(Rational(25, 14), multiple=True) == [Rational(1, 7), S.Half, 5, 5]
  463. assert factorrat(Rational(12, 1), multiple=True) == [2, 2, 3]
  464. assert factorrat(S(-25)/14/9, multiple=True) == \
  465. [-1, Rational(1, 7), Rational(1, 3), Rational(1, 3), S.Half, 5, 5]
  466. def test_visual_io():
  467. sm = smoothness_p
  468. fi = factorint
  469. # with smoothness_p
  470. n = 124
  471. d = fi(n)
  472. m = fi(d, visual=True)
  473. t = sm(n)
  474. s = sm(t)
  475. for th in [d, s, t, n, m]:
  476. assert sm(th, visual=True) == s
  477. assert sm(th, visual=1) == s
  478. for th in [d, s, t, n, m]:
  479. assert sm(th, visual=False) == t
  480. assert [sm(th, visual=None) for th in [d, s, t, n, m]] == [s, d, s, t, t]
  481. assert [sm(th, visual=2) for th in [d, s, t, n, m]] == [s, d, s, t, t]
  482. # with factorint
  483. for th in [d, m, n]:
  484. assert fi(th, visual=True) == m
  485. assert fi(th, visual=1) == m
  486. for th in [d, m, n]:
  487. assert fi(th, visual=False) == d
  488. assert [fi(th, visual=None) for th in [d, m, n]] == [m, d, d]
  489. assert [fi(th, visual=0) for th in [d, m, n]] == [m, d, d]
  490. # test reevaluation
  491. no = {"evaluate": False}
  492. assert sm({4: 2}, visual=False) == sm(16)
  493. assert sm(Mul(*[Pow(k, v, **no) for k, v in {4: 2, 2: 6}.items()], **no),
  494. visual=False) == sm(2**10)
  495. assert fi({4: 2}, visual=False) == fi(16)
  496. assert fi(Mul(*[Pow(k, v, **no) for k, v in {4: 2, 2: 6}.items()], **no),
  497. visual=False) == fi(2**10)
  498. def test_core():
  499. assert core(35**13, 10) == 42875
  500. assert core(210**2) == 1
  501. assert core(7776, 3) == 36
  502. assert core(10**27, 22) == 10**5
  503. assert core(537824) == 14
  504. assert core(1, 6) == 1
  505. def test_primenu():
  506. assert primenu(2) == 1
  507. assert primenu(2 * 3) == 2
  508. assert primenu(2 * 3 * 5) == 3
  509. assert primenu(3 * 25) == primenu(3) + primenu(25)
  510. assert [primenu(p) for p in primerange(1, 10)] == [1, 1, 1, 1]
  511. assert primenu(fac(50)) == 15
  512. assert primenu(2 ** 9941 - 1) == 1
  513. n = Symbol('n', integer=True)
  514. assert primenu(n)
  515. assert primenu(n).subs(n, 2 ** 31 - 1) == 1
  516. assert summation(primenu(n), (n, 2, 30)) == 43
  517. def test_primeomega():
  518. assert primeomega(2) == 1
  519. assert primeomega(2 * 2) == 2
  520. assert primeomega(2 * 2 * 3) == 3
  521. assert primeomega(3 * 25) == primeomega(3) + primeomega(25)
  522. assert [primeomega(p) for p in primerange(1, 10)] == [1, 1, 1, 1]
  523. assert primeomega(fac(50)) == 108
  524. assert primeomega(2 ** 9941 - 1) == 1
  525. n = Symbol('n', integer=True)
  526. assert primeomega(n)
  527. assert primeomega(n).subs(n, 2 ** 31 - 1) == 1
  528. assert summation(primeomega(n), (n, 2, 30)) == 59
  529. def test_mersenne_prime_exponent():
  530. assert mersenne_prime_exponent(1) == 2
  531. assert mersenne_prime_exponent(4) == 7
  532. assert mersenne_prime_exponent(10) == 89
  533. assert mersenne_prime_exponent(25) == 21701
  534. raises(ValueError, lambda: mersenne_prime_exponent(52))
  535. raises(ValueError, lambda: mersenne_prime_exponent(0))
  536. def test_is_perfect():
  537. assert is_perfect(6) is True
  538. assert is_perfect(15) is False
  539. assert is_perfect(28) is True
  540. assert is_perfect(400) is False
  541. assert is_perfect(496) is True
  542. assert is_perfect(8128) is True
  543. assert is_perfect(10000) is False
  544. def test_is_mersenne_prime():
  545. assert is_mersenne_prime(10) is False
  546. assert is_mersenne_prime(127) is True
  547. assert is_mersenne_prime(511) is False
  548. assert is_mersenne_prime(131071) is True
  549. assert is_mersenne_prime(2147483647) is True
  550. def test_is_abundant():
  551. assert is_abundant(10) is False
  552. assert is_abundant(12) is True
  553. assert is_abundant(18) is True
  554. assert is_abundant(21) is False
  555. assert is_abundant(945) is True
  556. def test_is_deficient():
  557. assert is_deficient(10) is True
  558. assert is_deficient(22) is True
  559. assert is_deficient(56) is False
  560. assert is_deficient(20) is False
  561. assert is_deficient(36) is False
  562. def test_is_amicable():
  563. assert is_amicable(173, 129) is False
  564. assert is_amicable(220, 284) is True
  565. assert is_amicable(8756, 8756) is False
  566. def test_dra():
  567. assert dra(19, 12) == 8
  568. assert dra(2718, 10) == 9
  569. assert dra(0, 22) == 0
  570. assert dra(23456789, 10) == 8
  571. raises(ValueError, lambda: dra(24, -2))
  572. raises(ValueError, lambda: dra(24.2, 5))
  573. def test_drm():
  574. assert drm(19, 12) == 7
  575. assert drm(2718, 10) == 2
  576. assert drm(0, 15) == 0
  577. assert drm(234161, 10) == 6
  578. raises(ValueError, lambda: drm(24, -2))
  579. raises(ValueError, lambda: drm(11.6, 9))