图片解析应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
4.0 KiB

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