Factorisation Binaire

Cette idée met en oeuvre la multiplication écrite (comme en primaire) mais en binaire, un peut de logique (logique du premier ordre entre autres) et les parcours d'arbres. rassurez-vous, aucune connaissance spécifique n'est nécessaire pour comprendre la suite.

Idée de base

L'idée part donc du calcul écrit en binaire. En fait, la forme de caclul écrit est une manière plus concrète et visuelle pour voire l'algorithme implanté pour les multiplications. Mais pour mieux comprendre le chmilblick, voici un petit exemple. Multiplions 6 ( 110 ) par 3 ( 11 ) qui donne 18 ( 10010 ).

     110
   x  11
  ------
     110
  + 110
  ------
   10010

D'une manière plus générale, on peut remplacer les chiffres des opérande de la multiplication par des variables et on obtien une version plus générale de la méthode:

                   a[2]      a[1]      a[0]
          x                  b[1]      b[0]
          -----------------------------------------
              a[2]*b[0] a[1]*b[0] a[0]*b[0]
+  a[2]*b[1]  a[1]*b[1] a[0]*b[1]
---------------------------------------------------
   r[4]       r[3]      r[2]      r[1]      r[0]

Et plus formellement, on aurait les formules du genre:

  1. Pour les sommes de colones :
    somme[i] = somme(k=0..i) { a[k] * b[i-k] }
  2. Pour la propagation de la retenue :
    retenue[0] = 0
    retenue[i] = ( somme[i] + retenue[i-1] ) / 2
  3. Pour la valeur des chiffres du résultat :
    r[i] = ( somme[i] + retenue[i-1] ) modulo 2

Pour factoriser un nombre, la première approche consiste à écrire ces équations pour chaque i en remplacant les r[i] par le bon chiffre de notre nombre à factoriser et de générer un système (qui les regroupe). On peut remarquer qu'on va devoir considérer des r[i] pour i supérieur à l longueur du nombre... on les posent comme étant à '0', un nombre à donc une écriture infinie, du fait qu'on complète l'écriture par des 0.

Mais pour ça, on peut simplifier certaines choses. Les facteurs auront une écriture forcément plus courte que le nombre à factoriser (sinon, il y a un ch'ti problème). Et en les multipliants, on peut pas dépasser une certaine longueur. Donc, on a pas besoin de considérer une suite infinie de '0' mais on peut tronquer pour une certaine longueur.

J'introduis ici la notion de poid d'un chiffre, c'est en fait son numéro de place dans l'écriture du nombre. Et le poid d'un nombre, c'est le maximum des poids des '1' du nombre... ou encore, le poid du '1' le plus à gauche.

De cette manière, on peut introduire la contrainte suivante : la somme des poids des facteurs ne peut pas exéder le poid du nombre. Cette contrainte est facile à comprendre... les poids des facteurs déterminent une minoration de la taille de leur produit.

On pourrait s'atarder à montrer que ce problème est décidable. Et qu'il existe un algorithme pour le résoudre. Cette démonstration se base sur le fait que les variables en présence on un espace de valeur finis ('0' ou '1'). Mais je ne m'y attarderai pas car cela n'apporte rien au raisonement.

Nous nous retrouvons donc avec un système d'équations à résoudre. La première approche est celle du 'brute-force', on essaie toutes les possibilités. Mais c'est équivalent à essayer tous les nombres et voire si ils divisent le notre. Autant garder les algorithmes classiques dans ce cas.

La deuxième, c'est d'utiliser un solver. Comme je l'ai dit, le problème est décidable, on peut donc faire confiance au algorithmes disponibles pour résoudres des systèmes de ce genre, ils termineront. Un première version du programme (que je fournis pas car elle inutile) pourrait se faire en Maple. On crée le système d'équation, on appelle la fonction solve() de Maple et il nous trouve les solutions. Après l'interpretation des résultats, on obtien les facteurs du nombre.

Comme on s'en doute, ce genre de programme ne sera pas efficace. La raison est simple, la résolution de systèmes d'équation (sans considération de la forme du système, du type de données,...) met en oeuvre beaucoup de calcul. C'est donc là que réside notre point faible. Et c'est ce que nous allons améliorer...

L'algorithme

Une technique empreintée à la logique consiste à développer un arbre à partir du système d'équations. En logique, on développerait l'arbre en tirant des conclusions d'après les équations... ei on a par exemple: "a et b = vrai" on en déduit que a doit être vrai et que b aussi. On ajoute deux "équations": l'équation "a = vrai" et l'équation "b = vrai". Quand on tombe sur une équation du genre "a ou b = vrai", on ajoute deux successeurs, l'un pour l'équation "a = vrai", l'autre pour "b = vrai". Si on obtient des contradiction dans une branche, on l'élimine (par exemple, un "a = vrai" puir, autre part dans la branche, "a = faux"). On arrète de développer l'arbre quand il n'y a plus d'équation à développer.

Mais dans notre cas, nous devons prendre en compte des entiers (pour la retenue). Cette technique n'est donc pas appliquable directement. Mais c'est sur cette base que je suis parti pour élaborer mon algorithme. Dans notre cas, au lieu de stocker des équations, nous allons retenir les valeur des chiffres que nous devinons et le poids des nombres que nous sommes en train de construire. Pour faciliter encore les calculs, nous déterminerons les chiffres dans l'ordre de poids croissants. On construit donc les facteurs en les écrivant petit à petit. La recherche de facteur correspond donc à creer l'arbre de dérivation du système d'équations de départ. Vu qu'on ajoute les chiffres dans l'ordre, à chaque "étape", on peut connaître la retenue correspondante. Pour ensuite, faciliter les déductions.

L'algorithme de recherche de facteurs est donc un parcours d'arbre. Ce parcours sera fait en profondeur-d'abord pour éviter de surcharger la mémoire. En gros, je vais utiliser uen fonction récursive pour elaborer l'arbre. Les adeptes de languages récursif ne seront donc pas dépaysé.

À une étape, nous connaissons donc le début de deux facteurs, la retenue qu'il faudra prendre en compte et le chiffre du nombre correspondant à notre étape. Avec cela, nous avons largement assez. Tout d'abord, il faut calculer la somme (comme dans les équations au début). Mais attention, il ne faut pas prendre en compte le premier chiffre de chaqu'un des facteurs (puisqu'il devrait être multiplié par des inconnues). On y ajoute la retenue. À ce stade, il faut séparer le blanc du jaune. D'un coté, la partie de cette somme vraiment utile pour déterminer les chiffres à ajouter, de l'autre, la future retenue (modulo 2 pour le premier, / 2 pour le second).

En fonction du premier chiffre de chaque facteur et de la différence entre le chiffre du nombre à obtenir et notre somme, nous pouvons déterminer facilement les possibilités qui s'ouvrent à nous. Voici quelques exemple pour éclairer dans ce brouilard (je note entre parenthèses, le premier chiffre de a, celui de b et la différence entre la somme et le chiffre désiré) :

  • ( 0, 0, 0) : on peut ajouter n'importe quelle compinaisons devant nosµ facteurs, la somme étant bonne, aucun problème.
  • ( 1, 0, 0) : cette fois, on ne peut ajouter qu'un '0' au deuxième facteur (pour le premier facteur, aucune restriction). Car sinon, notre somme augmenterais de 1 et on ne tomberai pas sur le nombre désiré.
  • (1, 0, 1) : là, c'est presque l'inverse: on doit mettre un 1 en tête du deuxième facteur mais ce qu'on veux pour le premier.
  • (0, 0, 1) : là, c'est inutile de continuer car il n'y a pas de solution.
  • (1, 1, 0) : Soit on et un 0 devant chaque facteur, soit un 1 devant qhaqu'un des deux. Dans ce dernier cas, il faut mettre à jour la retenue car celle-ci doit augmenter de 1.

L'ajout des chiffres peut se faire dans une fonction à part qui ferait les vérification de poids (pour éviter d'avoir des nombres trops grands).

Le programme s'exécute donc par l'initialisation : on établis les premiers chiffres en les ajoutant à des facteurs vides. L'ajout fait ensuite appelle à une une autre fonction faisant les calculs pour déterminer les chiffres à ajouter. Pour chaque possibilité, cette fonction rappelle la fonction d'ajout, d'où le mécanisme récursif. Quand aucune solution ne peut être trouvée, les fonctions se terminent tout simplement, et si on est arrivé à la fin du nombre, c'est qu'on a trouvé une factorisation possible et on l'affiche (par exemple).

Conclusion et complexité :

Pour la complexité, en posant n, le nombre à factoriser, et sans vouloir être précis, on peut voire que chaque noeud requière un parcours de tableau proportionnel à sa profondeur dans l'arbre. La complexité de l'algorithme est donc (après calcu) de l'ordre de n * log(n). Une amélioration qui consisterai à implémenter le calcul de la somme en hardware réduirait la complexité vers n. Qui deviendrait une majoration. Ce qui est important si on sait que les algorithmes naifs de factorisation sont de l'ordre de racine carrée de n.

Cette estimation n'atant que théorique, nous avons fait quelques tests pratiques. Lors de ces tests, nous avons remarqué que la complexité en fonction du nombre lui-même était assez "fractale". Elle serait plutôt de l'ordre de racine carrée de n (c'est à dire dans la même classe que l'algorithme naif).

En guise de conclusion, si on peut améliorer le calcul de la somme, et paralléliser tout l'arbre de recherche on disposera d'un algorithme de complexité plus faible encore que ceux disponibles. La factorisation devenant plus simple, les algorithmes de cryptographie pourront alors être mis à mal plus facilement. Mais pour ça, il faudrait tellement de processeurs que ça parait impossible.

Exemple d'implémentation en C

begin 664 facto_binaire.zip
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
MEZSZ]++R+Z\R/9)_*W0OJV@?7JX8=*/X419IY7\E^$\J06TU3J)03+$"AQTQ
MQB(CN^D5K:[MTKVC3&^#^JQ>K5YH*5RF$69C*4489)?>:1@$/[E\LF+@W@$"
M]*&Q7.K;H'47M&Z"LKY;[;?8L)BV(E>J4BB70Z0*";Q"\03P]L3PNLHXR##(
M+^[(8)#P-,8;#\>_/G,:I5TKEBI_JJ'AU#6#F\6<6^64ZA:IM6B]GHMYDL8!
MC%"(&_H74$L!`A0`%`````@`Q&1'-2_9>F65````(0$```D``````````0`@
M`````````&)O;VQE86XN:%!+`0(4`!0````(`,1D1S42P6&.1`,``*,(```,
M``````````$`(````+P```!C;VUP;&5X:71E+F-02P$"%``4````"`#$9$<U
M/Y!GL1L#``#S#@``"0`````````!`"`````J!```96)A=6-H92YC4$L!`A0`
M%`````@`Q&1'-2_AVKE>`0``T@,```D``````````0`@````;`<``&5B875C
M:&4N:%!+`0(4`!0````(`,1D1S5U-]T.N08``$\:```/``````````$`(```
M`/$(``!F86-T;W)I<V%T:6]N+F-02P$"%``4````"`#$9$<U!KH>0H$!```]
M!```#P`````````!`"````#7#P``9F%C=&]R:7-A=&EO;BYH4$L!`A0`%```
M``@`Q&1'-5D$8\"Z"```5B````<``````````0`@````A1$``&=R87!H+F-0
M2P$"%``4````"`#$9$<U=&>3SB0%```W$P``!P`````````!`"````!D&@``
M9W)A<&@N:%!+`0(4`!0````(`,1D1S6X9H)V-@0``((3```.``````````$`
M(````*T?``!L:7-T7V5B875C:&4N8U!+`0(4`!0````(`,1D1S4(O79O<@$`
M``0%```.``````````$`(`````\D``!L:7-T7V5B875C:&4N:%!+`0(4`!0`
M```(`,1D1S5P\S,U60$``"L&```(``````````$`(````*TE``!M86ME9FEL
M95!+`0(4`!0````(`,1D1S5T'84#T`$``%X$```(``````````$`(````"PG
M``!M96UO<GDN8U!+`0(4`!0````(`,1D1S6/C'JH>P```+,````(````````
M``$`(````"(I``!M96UO<GDN:%!+`0(4`!0````(`,1D1S7CX[M=>0D``&4E
M```(``````````$`(````,,I``!N;VUB<F4N8U!+`0(4`!0````(`,1D1S4N
M<J9FK`(``$H(```(``````````$`(````&(S``!N;VUB<F4N:%!+`0(4`!0`
M```(`,1D1S5-@?XY3@$``)P$```-``````````$`(````#0V``!S=&%T:7-T
M:7%U92YC4$L!`A0`%`````@`Q&1'-3+&2H?Q````:0(```T``````````0`@
M````K3<``'-T871I<W1I<75E+FA02P$"%``4````"`#$9$<UN^>`".\#``!I
M#0``!@`````````!`"````#).```=&5S="YC4$L!`A0`%`````@`Q&1'-=>G
M*\3P`@``$0<```T``````````0`@````W#P``'1E<W1?9F%C=&]R+F-02P$"
M%``4````"`#$9$<U9J=;*60#``![$```#0`````````!`"````#W/P``=&5S
@=%]N;VUB<F4N8U!+!08`````%``4`&D$``"&0P``````
`
end