GCD d'une paire de produits

8

J'ai deux nombres, qui sont chacun le produit d'un grand nombre de petits nombres que je connais. Je veux trouver le GCD (le plus grand commun diviseur) de ces deux nombres. Existe-t-il un moyen d'utiliser la factorisation partielle dont je dispose pour accélérer le processus?

En particulier, chaque nombre plus grand est le produit de nombres plus petits, chacun étant de l'ordre de . Je ne sais rien de la factorisation des petits nombres.21524000

Edit: Alors que les nombres d'entrée sont d'environ 120 000 000 bits, le GCD est d'environ 500 000 bits. Les facteurs des nombres sont notamment en séquence. Ce sont tous des entiers dans une plage consécutive.

Tous les algorithmes GCD que j'ai vus utilisent directement les nombres, pas sous une forme partiellement factorisée ou quoi que ce soit. Existe-t-il des algorithmes qui pourraient intégrer ces informations pour accélérer les choses?

isaacg
la source
Donc, pour être clair, vos produits ont quelque chose comme 130 000 000 bits? Je suis un peu curieux de savoir pourquoi vous voulez trouver des GCD de nombres de cette ampleur.
David Richerby
@DavidRicherby C'est vrai. J'essaie des moyens de résoudre le problème GCD approximatif, qui est un problème cryptographique sur lequel les gens ont construit des cryptosystèmes. Résoudre des problèmes GCD vraiment énormes est un moyen de résoudre des problèmes GCD approximatifs de taille raisonnable.
isaacg
1
Peut-être lié: cs.stackexchange.com/q/75387/755 , cs.stackexchange.com/q/28044/755 , factorable.net/weakkeys12.extended.pdf , cr.yp.to/factorization/smoothparts-20040510.pdf , cr.yp.to/smallfactors.html , cr.yp.to/lineartime/dcba-20040404.pdf . Asymptotiquement, vous pouvez calculer les gcd en temps quasi linéaire, donc il n'y a pas beaucoup de place pour l'accélération si nous nous soucions uniquement des asymptotiques, bien qu'il puisse y en avoir en pratique, car les asymptotiques peuvent être trompeuses en raison des constantes impliquées.
DW
@DW J'utilise actuellement l'algorithme GCD presque linéaire de GMP.
isaacg

Réponses:

1

Vous pouvez calculer les GCD par paire des facteurs. Vous devez diviser les GCD des facteurs pour éviter de trouver deux fois le même facteur GCD:

a[1...m] = [given factors of A]
b[1...n] = [given factors of B]
g = 1
for i from 1 to m do
    c = a[i]
    for j from 1 to n do
        d = gcd(c, b[j])
        g = g * d
        c = a[i] / d
        b[j] = b[j] / d
return g

Malheureusement, je ne pense pas que ce ne soit pas notablement plus rapide que le calcul du GCD des deux nombres A et B.

Clemens
la source
0

Un problème similaire a été résolu de manière raisonnablement efficace: supposons que vous utilisez RSA, qui est entièrement construit sur des produits de deux grands nombres premiers, où les produits ne peuvent pas être pris en compte dans un délai raisonnable. Mais si vous avez deux produits pq et p'q 'et soit p = p' ou q = q ', alors vous pouvez calculer leur pgc et obtenir p = p' ou q = q 'et l'autre facteur est trivial. Bien sûr, si p = p 'et aussi q = q', cela ne sert à rien.

N'imaginez pas que quelqu'un génère un milliard de ces produits et est un peu négligent. Un pirate trouve que plusieurs nombres sont identiques, donc p = p 'et q = q', donc c'est une bonne supposition que plusieurs paires ont un gcd d 1. Et cela s'est produit dans la vie réelle avec des routeurs dont le cryptage pourrait être fissuré en conséquence.

Désolé, je n'ai aucune référence et l'histoire est un peu ancienne, mais vous devriez pouvoir la trouver. C'était il y a quelques années, peut-être six environ.

gnasher729
la source
Malheureusement, aucun des facteurs des deux nombres n'est égal, donc je ne peux pas les éliminer de cette façon.
isaacg