Factorisation d’entiers II

On a déjà étudié les méthodes de factorisation naïves et de Pollard (rho et p-1). On s’intéresse aux techniques de factorisation quadratiques.

Factorisation et racines carrées

  1. Soit \(n=pq\) un produit de deux nombres premiers impairs. Quelles sont les racines carrées de \(1\) ? Quel est le nombre de racines carrées d’un résidu quadratique ?
  2. On suppose que \(a^2\equiv b^2\bmod n\), montrer que \(n=\pgcd(a-b,n)\pgcd(a+b,n)\). Si de plus \(a\neq\pm b\bmod n\), montrer que cette factorisation est non triviale.
  3. Plus généralement, si \(n\) est impair et possède \(\ell\) facteurs premiers distincts, quel est le nombre de racines carrées d’un résidu quadratique ?

Méthode de Fermat

  1. La méthode de Fermat consiste à parcourir les valeurs \(x=\floor{\sqrt{an}}+b\) pour \(a,b\geq 1\) à la recherche d’une égalité \(x^2 = an + y^2\), ce qui fournit un facteur \(\pgcd(x-y,n)\) de \(n\).

Exemple : factoriser \(8051\) de cette manière.

En pratique, on peut effectuer deux améliorations :

  • fixer \(b=1\) et ne faire varier que \(1\leq a< n\)
  • prendre des \(a\) divisibles par de petits facteurs premiers, par exemple la famille des multiples de \(480=2^5\times3\times5\) fonctionne bien.

Méthode de Dixon

Exemple: \(n=3239\), avec \(m=\floor{\sqrt{n}}=56\). On calcule les premières valeurs

\[\begin{split}\begin{array}{cccccl} (m+1)^2 &= &2&\times 5&&\bmod n \\ (m+2)^2 &= &&5^3&&\bmod n \\ (m+3)^2 &= 2&&\times 11^2&\bmod n \end{array}\end{split}\]

À ce stade, on n’a pas encore trouvé de carré. Toutefois, les trois relations multipliées entre elles forment la relation

\[((m+1)(m+2)(m+3))^2 = (2\times 5^2\times 11)^2 \bmod n\]

qui permet de factoriser \(n\).

  1. Faire de même avec \(n=896641\) (factoriser les 15 premières valeurs).

    solution ⇲ ⇱ solution

    On regarde les premières factorisations

    n := 896641;
    m := floor(sqrt(n));
    for(x:=1;x<=15;x++) { print(ifactors(irem((m+x)^2,n)));}
    

    On jette a priori toutes les relations qui ont des facteurs premiers \(>11\), il en reste \(6\).

    En prenant les lignes \(3\), \(8\) et \(13\) on obtient une combinaison paire.

On généralise la technique de la manière suivante :

  • on considère une base de \(k\) facteurs premiers (auxquels on peut ajoute \(-1\)), \(B=\set{-1,2,3,5,7,\dots P}\) ;

  • on parcourt les valeurs \((\floor{\sqrt{n}}+b)^2\bmod n\) à la recherche de relations \(B\)-friables

    \[(x_i)^2 \equiv \prod_{j=1}^k p_j^{e_{i,j}} \bmod n\]

    que l’on mémorise

  • quand on a obtenu \(k+1\) telles relations, construire la matrice de parité des exposants du membre de droite

    \[E = (e_{i,j})_{i,j} \bmod 2\]

    et déterminer un vecteur du noyau

    \[\lambda \in \F_2^{k+1}, \lambda E=0.\]
  • Ce vecteur indique quelles lignes selectionner de sorte que les exposants de la relation produit soient tous pairs, c’est-à-dire que l’on ait un carré à droite.

  1. Ecrire une fonction premiers(k) qui renvoie la liste des \(k\) premiers nombres premiers. Calculer P:=premiers(10).

    solution xcas ⇲ ⇱ solution xcas
    premiers(k) := {
      local j, P, p;
      P := []; p := 1;
      for(j:=1; j<=k; j++) {
        p := nextprime(p);
        P := append(P, p);
      }
      P;
    }
    
  2. Écrire une fonction friable(r,P) qui renvoie 0 si \(r\) n’est pas produit des nombres de \(P\), et renvoie le vecteur des exposants sinon.

    solution xcas ⇲ ⇱ solution xcas
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    friable(r, P) := {
      local k,j,E,ej,p;
      k := length(P);
      E := [];
      for(j:=0; j<k; j++) {
        p := P[j]; ej:=0;
        while(irem(r,p)==0) {r := iquo(r,p); ej++;}
        E := append(E, ej);
        }
      if(r==1) { return(E); } else {return(0);}
      }
    
  3. Ecrire une fonction dixon(n,k,xmax) qui détermine une liste de \(k+1\) valeurs \(x_i\) telles que les \(x_i^2\bmod n\) soient friables et la matrice \(E\) des exposants \(e_{i,j}\) correspondants. La fonction pourra renvoyer une matrice incomplète si moins de \(k+1\) valeurs friables ont été trouvées.

    solution xcas ⇲ ⇱ solution xcas

    Plutôt que faire des appels à la fonction friable, on remplit à chaque fois la matrice, en écrasant la ligne tant que la relation n’est pas friable.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    dixon(n, k, xmax) := {
      local E, m, r, P, j, l, x, X, p;
      P := premiers(k);
      E := newMat(k+1,k);
      X := newList(k+1);
      m := floor(sqrt(n));
      l := 0;
      for(x:=1; x<=xmax && l<=k; x++){
        r := irem((m+x)^2 , n);
        for(j:=0; j<k; j++) {
          p := P[j]; E[l,j]:=0;
          while(irem(r,p)==0) {r := iquo(r,p); E[l,j]:=E[l,j]+1;}
          if(r==1) { X[l] := m+x; l++; break;}
          }
      }
      return([E,X]);
    }
    
  4. Essayer la fonction avec \(n=557929\), et en déduire la factorisation de \(n\).

    solution xcas ⇲ ⇱ solution xcas
    EX := dixon(557929,10,100):;
    E:=EX[0]; X:=EX[1];
    

    On trouve une factorisation via un vecteur du noyau modulo 2

    K := ker(tran(E%2))%0
    
  5. Examiner les matrices d’exposants obtenues. Que remarque-t-on ?

    solution ⇲ ⇱ solution

    Deux choses principales :

    • que la densité diminue vers la droite
    • qu’il y a des colonnes de zéros
  6. Démontrer qu’une colonne correspondant à un nombre premier \(p\) ne peut avoir des coefficients non nuls que si \(n\) est un carré modulo \(p\).

    solution ⇲ ⇱ solution

    on a un coefficient non nul en \(p\) si et seulement si \(p\) divise une valeur \((m+x)^2-n\), ce qui ne peut se produire que si \(n\equiv(x+m)^2\) est un carré modulo \(p\).

  7. En déduire une modification de la fonction premiers qui améliore la recherche de matrices de Dixon.

  8. Ecrire une fonction factor_dixon(n,k,xmax) qui effectue la factorisation avec la méthode de Dixon.

Méthode p-1 de Pollard

Note

On rappelle la méthode : si \(n\) possède un facteur premier \(p\) tel que \(p-1\) n’a que de petits facteurs premiers inférieurs à une borne \(B\) (on dit que \(p-1\) est \(B\)-friable), alors puisque \(a^{p-1}=1\bmod p\) on a également \(a^M=1\bmod p\) pour tout multiple \(M\) de \(p-1\), en particulier si l’on prend \(M\) égal à un produit de puissances de tous les petits nombres premiers inférieurs à \(B\).

Concrètement, on part d’un résidu \(a\) premier à \(n\), et pour chaque premier \(p_i\leq B\) on calcule un exposant \(b_i\) tel que \(p_i^{b_i}<n<p_i^{b_i+1}\). On pose \(M_i = M_{i-1}\times p_i^{b_i}\), et on calcule \(pgcd(a^{M_i}-1,n)\). Dès que l’on atteint la borne de friabilité d’un diviseur premier \(p\) de \(n\), \(p\) divise le pgcd.

  1. Implanter la méthode \(p-1\) de Pollard. L’utiliser pour factoriser les premiers nombres de Mersenne \(M_{p}=2^p-1\) composés.
  2. Expliquer ce qui se passe lorsque l’on essaie de factoriser \(M_{29}\).
  3. Trouver une technique pour adapter la méthode \(p-1\) aux nombres semblables à \(M_{29}\).