# HG changeset patch
# User Paul Zimmermann <zimmerma@loria.fr>
# Date 1306092209 -7200
# Node ID 6c8fd09f277917182759e682a17b9357d68c9d95
# Parent 361a4ad7d52c69b64ae2e658ffd0820af0d87e93
#10951: added optional input of sigma, and return lucky sigma
diff -r 361a4ad7d52c -r 6c8fd09f2779 sage/libs/libecm.pyx
a
|
b
|
|
8 | 8 | |
9 | 9 | AUTHOR: |
10 | 10 | Robert L Miller (2008-01-21) -- library interface (clone of ecmfactor.c) |
| 11 | Paul Zimmermann (2011-05-22) -- added input/output of sigma |
11 | 12 | |
12 | 13 | EXAMPLE: |
13 | 14 | |
14 | 15 | sage: import sage.libs.libecm |
15 | 16 | sage: from sage.libs.libecm import ecmfactor |
16 | 17 | sage: result = ecmfactor(999, 0.00) |
17 | | sage: result in [(True, 27), (True, 37), (True, 999)] |
| 18 | sage: result[0] == True and result[1] in [27, 37, 999] |
18 | 19 | True |
19 | 20 | sage: result = ecmfactor(999, 0.00, verbose=True) |
20 | 21 | Performing one curve with B1=0 |
21 | 22 | Found factor in step 1: ... |
22 | | sage: result in [(True, 27), (True, 37), (True, 999)] |
| 23 | sage: result[0] == True and result[1] in [27, 37, 999] |
23 | 24 | True |
| 25 | sage: ecmfactor(2^128+1,1000,sigma=227140902) |
| 26 | (True, 5704689200685129054721, 227140902) |
24 | 27 | |
25 | 28 | """ |
26 | 29 | |
… |
… |
|
30 | 33 | |
31 | 34 | cdef extern from "ecm.h": |
32 | 35 | ctypedef struct __ecm_param_struct: |
33 | | pass |
| 36 | int method |
| 37 | mpz_t x |
| 38 | mpz_t sigma |
34 | 39 | ctypedef __ecm_param_struct ecm_params[1] |
35 | 40 | int ecm_factor (mpz_t, mpz_t, double, ecm_params) |
| 41 | void ecm_init (ecm_params) |
| 42 | void ecm_clear (ecm_params) |
36 | 43 | int ECM_NO_FACTOR_FOUND |
37 | 44 | |
38 | | def ecmfactor(number, py_B1, verbose=False): |
| 45 | def ecmfactor(number, py_B1, verbose=False, sigma=0): |
39 | 46 | cdef mpz_t n, f |
40 | 47 | cdef int res |
41 | 48 | cdef double B1 |
42 | | cdef Integer sage_int_f, sage_int_number |
| 49 | cdef Integer sage_int_f, sage_int_number, sage_int_sigma |
| 50 | cdef ecm_params q |
43 | 51 | |
44 | 52 | sage_int_f = Integer(0) |
45 | 53 | sage_int_number = Integer(number) |
| 54 | sage_int_sigma = Integer(sigma) |
46 | 55 | B1 = py_B1 |
47 | 56 | |
48 | 57 | mpz_init(n) |
49 | 58 | mpz_set(n, sage_int_number.value) |
50 | 59 | mpz_init(f) # For potential factor |
| 60 | ecm_init(q) |
| 61 | mpz_set(q.sigma,sage_int_sigma.value) |
51 | 62 | |
52 | 63 | if verbose: |
53 | 64 | print "Performing one curve with B1=%1.0f"%B1 |
54 | 65 | |
55 | | res = ecm_factor(f, n, B1, NULL) |
| 66 | res = ecm_factor(f, n, B1, q) |
56 | 67 | |
57 | 68 | if res > 0: |
58 | 69 | mpz_set(sage_int_f.value, f) |
| 70 | mpz_set(sage_int_sigma.value, q.sigma) |
59 | 71 | |
60 | 72 | mpz_clear(f) |
61 | 73 | mpz_clear(n) |
| 74 | ecm_clear(q) |
62 | 75 | |
63 | 76 | if res > 0: |
64 | 77 | if verbose: |
65 | 78 | print "Found factor in step %d: %d"%(res,sage_int_f) |
66 | | return (True, sage_int_f) |
| 79 | return (True, sage_int_f, sage_int_sigma) |
67 | 80 | elif res == ECM_NO_FACTOR_FOUND: |
68 | 81 | if verbose: |
69 | 82 | print "Found no factor." |