test_qs.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from __future__ import annotations
  2. from sympy.ntheory import qs
  3. from sympy.ntheory.qs import SievePolynomial, _generate_factor_base, \
  4. _initialize_first_polynomial, _initialize_ith_poly, \
  5. _gen_sieve_array, _check_smoothness, _trial_division_stage, _gauss_mod_2, \
  6. _build_matrix, _find_factor
  7. from sympy.testing.pytest import slow
  8. @slow
  9. def test_qs_1():
  10. assert qs(10009202107, 100, 10000) == {100043, 100049}
  11. assert qs(211107295182713951054568361, 1000, 10000) == \
  12. {13791315212531, 15307263442931}
  13. assert qs(980835832582657*990377764891511, 3000, 50000) == \
  14. {980835832582657, 990377764891511}
  15. assert qs(18640889198609*20991129234731, 1000, 50000) == \
  16. {18640889198609, 20991129234731}
  17. def test_qs_2() -> None:
  18. n = 10009202107
  19. M = 50
  20. # a = 10, b = 15, modified_coeff = [a**2, 2*a*b, b**2 - N]
  21. sieve_poly = SievePolynomial([100, 1600, -10009195707], 10, 80)
  22. assert sieve_poly.eval(10) == -10009169707
  23. assert sieve_poly.eval(5) == -10009185207
  24. idx_1000, idx_5000, factor_base = _generate_factor_base(2000, n)
  25. assert idx_1000 == 82
  26. assert [factor_base[i].prime for i in range(15)] == \
  27. [2, 3, 7, 11, 17, 19, 29, 31, 43, 59, 61, 67, 71, 73, 79]
  28. assert [factor_base[i].tmem_p for i in range(15)] == \
  29. [1, 1, 3, 5, 3, 6, 6, 14, 1, 16, 24, 22, 18, 22, 15]
  30. assert [factor_base[i].log_p for i in range(5)] == \
  31. [710, 1125, 1993, 2455, 2901]
  32. g, B = _initialize_first_polynomial(
  33. n, M, factor_base, idx_1000, idx_5000, seed=0)
  34. assert g.a == 1133107
  35. assert g.b == 682543
  36. assert B == [272889, 409654]
  37. assert [factor_base[i].soln1 for i in range(15)] == \
  38. [0, 0, 3, 7, 13, 0, 8, 19, 9, 43, 27, 25, 63, 29, 19]
  39. assert [factor_base[i].soln2 for i in range(15)] == \
  40. [0, 1, 1, 3, 12, 16, 15, 6, 15, 1, 56, 55, 61, 58, 16]
  41. assert [factor_base[i].a_inv for i in range(15)] == \
  42. [1, 1, 5, 7, 3, 5, 26, 6, 40, 5, 21, 45, 4, 1, 8]
  43. assert [factor_base[i].b_ainv for i in range(5)] == \
  44. [[0, 0], [0, 2], [3, 0], [3, 9], [13, 13]]
  45. g_1 = _initialize_ith_poly(n, factor_base, 1, g, B)
  46. assert g_1.a == 1133107
  47. assert g_1.b == 136765
  48. sieve_array = _gen_sieve_array(M, factor_base)
  49. assert sieve_array[0:5] == [8424, 13603, 1835, 5335, 710]
  50. assert _check_smoothness(9645, factor_base) == (5, False)
  51. assert _check_smoothness(210313, factor_base)[0][0:15] == \
  52. [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1]
  53. assert _check_smoothness(210313, factor_base)[1]
  54. partial_relations: dict[int, tuple[int, int]] = {}
  55. smooth_relation, partial_relation = _trial_division_stage(
  56. n, M, factor_base, sieve_array, sieve_poly, partial_relations,
  57. ERROR_TERM=25*2**10)
  58. assert partial_relations == {
  59. 8699: (440, -10009008507),
  60. 166741: (490, -10008962007),
  61. 131449: (530, -10008921207),
  62. 6653: (550, -10008899607)
  63. }
  64. assert [smooth_relation[i][0] for i in range(5)] == [
  65. -250, -670615476700, -45211565844500, -231723037747200, -1811665537200]
  66. assert [smooth_relation[i][1] for i in range(5)] == [
  67. -10009139607, 1133094251961, 5302606761, 53804049849, 1950723889]
  68. assert smooth_relation[0][2][0:15] == [
  69. 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  70. assert _gauss_mod_2(
  71. [[0, 0, 1], [1, 0, 1], [0, 1, 0], [0, 1, 1], [0, 1, 1]]
  72. ) == (
  73. [[[0, 1, 1], 3], [[0, 1, 1], 4]],
  74. [True, True, True, False, False],
  75. [[0, 0, 1], [1, 0, 0], [0, 1, 0], [0, 1, 1], [0, 1, 1]]
  76. )
  77. def test_qs_3():
  78. N = 1817
  79. smooth_relations = [
  80. (2455024, 637, [0, 0, 0, 1]),
  81. (-27993000, 81536, [0, 1, 0, 1]),
  82. (11461840, 12544, [0, 0, 0, 0]),
  83. (149, 20384, [0, 1, 0, 1]),
  84. (-31138074, 19208, [0, 1, 0, 0])
  85. ]
  86. matrix = _build_matrix(smooth_relations)
  87. assert matrix == [
  88. [0, 0, 0, 1],
  89. [0, 1, 0, 1],
  90. [0, 0, 0, 0],
  91. [0, 1, 0, 1],
  92. [0, 1, 0, 0]
  93. ]
  94. dependent_row, mark, gauss_matrix = _gauss_mod_2(matrix)
  95. assert dependent_row == [[[0, 0, 0, 0], 2], [[0, 1, 0, 0], 3]]
  96. assert mark == [True, True, False, False, True]
  97. assert gauss_matrix == [
  98. [0, 0, 0, 1],
  99. [0, 1, 0, 0],
  100. [0, 0, 0, 0],
  101. [0, 1, 0, 0],
  102. [0, 1, 0, 1]
  103. ]
  104. factor = _find_factor(
  105. dependent_row, mark, gauss_matrix, 0, smooth_relations, N)
  106. assert factor == 23