GCD di una coppia di prodotti


8

Ho due numeri, che sono ciascuno il prodotto di un gran numero di numeri più piccoli che conosco. Voglio trovare il GCD (il massimo comune divisore) di questi due numeri. Esiste un modo per sfruttare la fattorizzazione parziale che devo accelerare il processo?

In particolare, ogni numero più grande è il prodotto di numeri più piccoli, ognuno dei quali è nell'ordine di . Non so nulla sulla fattorizzazione dei numeri più piccoli.21524000

Modifica: mentre i numeri di input sono circa 120.000.000 di bit, il GCD è di circa 500.000 bit. I fattori dei numeri sono in particolare in sequenza. Sono tutti numeri interi in un intervallo consecutivo.

Tutti gli algoritmi GCD che ho visto utilizzano direttamente i numeri, non in una forma parzialmente fattorizzata o altro. Esistono algoritmi che potrebbero incorporare queste informazioni per velocizzare le cose?


Quindi, per essere chiari, i tuoi prodotti hanno qualcosa come 130.000.000 di bit? Sono un po 'curioso del perché tu voglia trovare GCD di numeri di quella portata.
David Richerby,

@DavidRicherby Esatto. Sto provando modi per risolvere il problema GCD approssimativo, che è un problema crittografico su cui le persone hanno costruito sistemi crittografici. La soluzione di problemi GCD davvero enormi è un modo per risolvere problemi GCD approssimativi di dimensioni ragionevoli.
isaacg,

1
Possibilmente correlati: 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-200404044pp . Asintoticamente, puoi calcolare i gcd in un tempo quasi lineare, quindi non c'è un sacco di spazio per accelerare se ci preoccupiamo solo degli asintotici, anche se potrebbe esserci nella pratica, poiché gli asintotici potrebbero essere fuorvianti a causa delle costanti coinvolte.
DW

@DW Attualmente sto usando l'algoritmo GCD quasi lineare di GMP.
isaacg,

Risposte:


1

È possibile calcolare i GCD a coppie dei fattori. Devi dividere i GCD dai fattori per evitare di trovare lo stesso fattore GCD due volte:

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

Sfortunatamente, non penso che questo non sia notevolmente più veloce del calcolo del GCD dei due numeri A e B.


0

Si è verificato un problema simile che è stato risolto in modo abbastanza efficiente: supponiamo che si stia utilizzando RSA, che è tutto basato su prodotti di due numeri primi di grandi dimensioni, in cui i prodotti non possono essere presi in considerazione in tempi ragionevoli. Ma se hai due prodotti pq e p'q 'e p = p' o q = q ', puoi calcolare il loro gcd e ottenere p = p' o q = q 'e l'altro fattore è banale. Naturalmente se p = p 'e anche q = q', questo non è di aiuto.

Non immagina che qualcuno generi un miliardo di tali prodotti ed è un po 'distratto. Un hacker scopre che alcuni numeri sono identici, quindi p = p 'e q = q', quindi è una buona ipotesi che un paio di coppie abbiano un gcd ≠ 1. E questo è successo nella vita reale con router la cui crittografia potrebbe essere incrinato di conseguenza.

Spiacente, non ho alcun riferimento e la storia è un po 'vecchia, ma dovresti riuscire a trovarla. È stato qualche anno fa, forse sei o giù di lì.


Sfortunatamente, nessuno dei fattori dei due numeri è uguale, quindi non posso eliminarli in quel modo.
isaacg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.