Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/libs/libecm.pyx
4048 views
1
r"""
2
The Elliptic Curve Method for Integer Factorization (ECM)
3
4
Sage includes GMP-ECM, which is a highly optimized implementation of
5
Lenstra's elliptic curve factorization method.
6
See http://ecm.gforge.inria.fr/ for more about GMP-ECM.
7
This file provides a Cython interface to the GMP-ECM library.
8
9
AUTHORS:
10
11
- Robert L Miller (2008-01-21): library interface (clone of ecmfactor.c)
12
13
- Jeroen Demeyer (2012-03-29): signal handling, documentation
14
15
EXAMPLES::
16
17
sage: from sage.libs.libecm import ecmfactor
18
sage: result = ecmfactor(999, 0.00)
19
sage: result in [(True, 27), (True, 37), (True, 999)]
20
True
21
sage: result = ecmfactor(999, 0.00, verbose=True)
22
Performing one curve with B1=0
23
Found factor in step 1: ...
24
sage: result in [(True, 27), (True, 37), (True, 999)]
25
True
26
"""
27
#*****************************************************************************
28
# Copyright (C) 2008 Robert Miller
29
# Copyright (C) 2012 Jeroen Demeyer <[email protected]>
30
#
31
# Distributed under the terms of the GNU General Public License (GPL)
32
# as published by the Free Software Foundation; either version 2 of
33
# the License, or (at your option) any later version.
34
# http://www.gnu.org/licenses/
35
#*****************************************************************************
36
37
include '../ext/cdefs.pxi'
38
include '../ext/interrupt.pxi'
39
40
from sage.rings.integer cimport Integer
41
42
cdef extern from "ecm.h":
43
ctypedef struct __ecm_param_struct:
44
pass
45
ctypedef __ecm_param_struct ecm_params[1]
46
int ecm_factor (mpz_t, mpz_t, double, ecm_params)
47
int ECM_NO_FACTOR_FOUND
48
49
def ecmfactor(number, double B1, verbose=False):
50
"""
51
Try to find a factor of a positive integer using ECM (Elliptic Curve Method).
52
This function tries one elliptic curve.
53
54
INPUT:
55
56
- ``number`` -- positive integer to be factored
57
58
- ``B1`` -- bound for step 1 of ECM
59
60
- ``verbose`` (default: False) -- print some debugging information
61
62
OUTPUT:
63
64
Either ``(False, None)`` if no factor was found, or ``(True, f)``
65
if the factor ``f`` was found.
66
67
EXAMPLES::
68
69
sage: from sage.libs.libecm import ecmfactor
70
71
This number has a small factor which is easy to find for ECM::
72
73
sage: N = 2^167 - 1
74
sage: factor(N)
75
2349023 * 79638304766856507377778616296087448490695649
76
sage: ecmfactor(N, 2e5)
77
(True, 2349023)
78
79
With a smaller B1 bound, we may or may not succeed::
80
81
sage: ecmfactor(N, 1e2) # random
82
(False, None)
83
84
The following number is a Mersenne prime, so we don't expect to
85
find any factors (there is an extremely small chance that we get
86
the input number back as factorization)::
87
88
sage: N = 2^127 - 1
89
sage: N.is_prime()
90
True
91
sage: ecmfactor(N, 1e3)
92
(False, None)
93
94
If we have several small prime factors, it is possible to find a
95
product of primes as factor::
96
97
sage: N = 2^179 - 1
98
sage: factor(N)
99
359 * 1433 * 1489459109360039866456940197095433721664951999121
100
sage: ecmfactor(N, 1e3) # random
101
(True, 514447)
102
103
We can ask for verbose output::
104
105
sage: N = 12^97 - 1
106
sage: factor(N)
107
11 * 43570062353753446053455610056679740005056966111842089407838902783209959981593077811330507328327968191581
108
sage: ecmfactor(N, 100, verbose=True)
109
Performing one curve with B1=100
110
Found factor in step 1: 11
111
(True, 11)
112
sage: ecmfactor(N/11, 100, verbose=True)
113
Performing one curve with B1=100
114
Found no factor.
115
(False, None)
116
117
TESTS:
118
119
Check that ``ecmfactor`` can be interrupted (factoring a large
120
prime number)::
121
122
sage: import sage.tests.interrupt
123
sage: try:
124
... sage.tests.interrupt.interrupt_after_delay()
125
... ecmfactor(2^521-1, 1e7)
126
... except KeyboardInterrupt:
127
... print "Caught KeyboardInterrupt"
128
Caught KeyboardInterrupt
129
130
Some special cases::
131
132
sage: ecmfactor(1, 100)
133
(True, 1)
134
sage: ecmfactor(0, 100)
135
Traceback (most recent call last):
136
...
137
ValueError: Input number (0) must be positive
138
"""
139
cdef mpz_t n, f
140
cdef int res
141
cdef Integer sage_int_f, sage_int_number
142
143
sage_int_f = Integer(0)
144
sage_int_number = Integer(number)
145
146
if number <= 0:
147
raise ValueError("Input number (%s) must be positive"%number)
148
149
if verbose:
150
print "Performing one curve with B1=%1.0f"%B1
151
152
sig_on()
153
mpz_init(n)
154
mpz_set(n, sage_int_number.value)
155
mpz_init(f) # For potential factor
156
157
res = ecm_factor(f, n, B1, NULL)
158
159
if res > 0:
160
mpz_set(sage_int_f.value, f)
161
162
mpz_clear(f)
163
mpz_clear(n)
164
sig_off()
165
166
if res > 0:
167
if verbose:
168
print "Found factor in step %d: %d"%(res,sage_int_f)
169
return (True, sage_int_f)
170
elif res == ECM_NO_FACTOR_FOUND:
171
if verbose:
172
print "Found no factor."
173
return (False, None)
174
else:
175
raise RuntimeError( "ECM lib error" )
176
177