test_ecm.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from sympy.ntheory.ecm import ecm, Point
  2. from sympy.testing.pytest import slow
  3. @slow
  4. def test_ecm():
  5. assert ecm(3146531246531241245132451321) == {3, 100327907731, 10454157497791297}
  6. assert ecm(46167045131415113) == {43, 2634823, 407485517}
  7. assert ecm(631211032315670776841) == {9312934919, 67777885039}
  8. assert ecm(398883434337287) == {99476569, 4009823}
  9. assert ecm(64211816600515193) == {281719, 359641, 633767}
  10. assert ecm(4269021180054189416198169786894227) == {184039, 241603, 333331, 477973, 618619, 974123}
  11. assert ecm(4516511326451341281684513) == {3, 39869, 131743543, 95542348571}
  12. assert ecm(4132846513818654136451) == {47, 160343, 2802377, 195692803}
  13. assert ecm(168541512131094651323) == {79, 113, 11011069, 1714635721}
  14. #This takes ~10secs while factorint is not able to factorize this even in ~10mins
  15. assert ecm(7060005655815754299976961394452809, B1=100000, B2=1000000) == {6988699669998001, 1010203040506070809}
  16. def test_Point():
  17. from sympy.core.numbers import mod_inverse
  18. #The curve is of the form y**2 = x**3 + a*x**2 + x
  19. mod = 101
  20. a = 10
  21. a_24 = (a + 2)*mod_inverse(4, mod)
  22. p1 = Point(10, 17, a_24, mod)
  23. p2 = p1.double()
  24. assert p2 == Point(68, 56, a_24, mod)
  25. p4 = p2.double()
  26. assert p4 == Point(22, 64, a_24, mod)
  27. p8 = p4.double()
  28. assert p8 == Point(71, 95, a_24, mod)
  29. p16 = p8.double()
  30. assert p16 == Point(5, 16, a_24, mod)
  31. p32 = p16.double()
  32. assert p32 == Point(33, 96, a_24, mod)
  33. # p3 = p2 + p1
  34. p3 = p2.add(p1, p1)
  35. assert p3 == Point(1, 61, a_24, mod)
  36. # p5 = p3 + p2 or p4 + p1
  37. p5 = p3.add(p2, p1)
  38. assert p5 == Point(49, 90, a_24, mod)
  39. assert p5 == p4.add(p1, p3)
  40. # p6 = 2*p3
  41. p6 = p3.double()
  42. assert p6 == Point(87, 43, a_24, mod)
  43. assert p6 == p4.add(p2, p2)
  44. # p7 = p5 + p2
  45. p7 = p5.add(p2, p3)
  46. assert p7 == Point(69, 23, a_24, mod)
  47. assert p7 == p4.add(p3, p1)
  48. assert p7 == p6.add(p1, p5)
  49. # p9 = p5 + p4
  50. p9 = p5.add(p4, p1)
  51. assert p9 == Point(56, 99, a_24, mod)
  52. assert p9 == p6.add(p3, p3)
  53. assert p9 == p7.add(p2, p5)
  54. assert p9 == p8.add(p1, p7)
  55. assert p5 == p1.mont_ladder(5)
  56. assert p9 == p1.mont_ladder(9)
  57. assert p16 == p1.mont_ladder(16)
  58. assert p9 == p3.mont_ladder(3)