Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/doc/en/bordeaux_2008/integer_factorization.rst
4058 views
Integer Factorization
=====================


Quadratic Sieve
---------------

Bill Hart's quadratic sieve is included with Sage. The quadratic sieve
is the best algorithm for factoring numbers of the form :math:`pq` up
to around 100 digits. It involves searching for relations, solving a
linear algebra problem modulo :math:`2`, then factoring :math:`n`
using a relation :math:`x^2 \equiv y^2 \mod n`.

::

    sage: qsieve(next_prime(2^90)*next_prime(2^91), time=True)   # not tested
    ([1237940039285380274899124357, 2475880078570760549798248507],
     '14.94user 0.53system 0:15.72elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k')

Using qsieve is twice as fast as Sage's general factor command in
this example. Note that Sage's general factor command does nothing
but call Pari's factor C library function.

::

    sage: time factor(next_prime(2^90)*next_prime(2^91))     # not tested
    CPU times: user 28.71 s, sys: 0.28 s, total: 28.98 s
    Wall time: 29.38 s
    1237940039285380274899124357 * 2475880078570760549798248507

Obviously, Sage's factor command should not just call Pari, but
nobody has gotten around to rewriting it yet.

GMP-ECM
-------

Paul Zimmerman's GMP-ECM is included in Sage. The elliptic curve
factorization (ECM) algorithm is the best algorithm for factoring
numbers of the form :math:`n=pm`, where :math:`p` is not "too
big". ECM is an algorithm due to Hendrik Lenstra, which works by
"pretending" that :math:`n` is prime, choosing a random elliptic curve
over :math:`\ZZ/n\ZZ`, and doing arithmetic on that
curve--if something goes wrong when doing arithmetic, we factor
:math:`n`.

In the following example, GMP-ECM is over 10 times faster than
Sage's generic factor function. Again, this emphasizes that Sage's
generic factor command would benefit from a rewrite that uses
GMP-ECM and qsieve.

::

    sage: time ecm.factor(next_prime(2^40) * next_prime(2^300))    # not tested
    CPU times: user 0.85 s, sys: 0.01 s, total: 0.86 s
    Wall time: 1.73 s
    [1099511627791,
     2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397533]
    sage: time factor(next_prime(2^40) * next_prime(2^300))        # not tested
    CPU times: user 23.82 s, sys: 0.04 s, total: 23.86 s
    Wall time: 24.35 s
    1099511627791 * 2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397533