martedì 20 gennaio 2009

Fattorizzazione e algoritmo di Shor

Fattorizzazione e algortimo di Shor

Scomporre in fattori un numero composto sembra banale, un esercizio da scuole medie inferiori eppure è uno dei problemi maggiori dell'era moderna per ambiti come la crittografia. La sfida tra cifratori e crittoanalisti è basata essenzialmente sul tempo necessario a decrittare un messaggio. Maggiore è il tempo necessario più diventa obsoleto o inutile il messaggio stesso.

In passato alcuni algoritmi come quello di Shor non venivano tanto presi in considerazione, ma oggi con l'avvento e le prime sperimentazioni dei computer quantistici l'algoritmo ritorna di interesse perchè i "moderni computer" sono capaci di velocità e parallelizzazioni molto spinte.

Questo vuol dire che sarà possibile istanziare N processi paralleli, partendo magari da valori diversi, e il primo che troverà il risultato farà terminare l'eleaborazione degli altri processi.

Un esempio didattico ci viene fornito dal sito www.geocities.com/SiliconValley/Port/3264

L'esempio è utilizzabile con PARI/GP ma dovendo girare su computer convenzionali non aspettatevi miracoli in fatto di tempi. L'algoritmo è una variante di Shor e semplificato per far comprendere l'idea su cui è basato.

/*********************************************************
* Shor Factoring
*
* n
* f(x) = a^x mod n
*
* Variant of "Shor's algorithm"
*
* Rosario Turco
*
* RSA
* 0 0 5
* 39460021111111111107165109=2207*55234 r=
* 1178888888888888888771=1439*39095 r=
* 11788888811= r=
* 2467757=2417*1021 r=
* 691217=1021*677 r=57460
* 99097=41*2417 r=12080
* 4171=43*97 r=336
*********************************************************/
{shorRSA(n, flag) = local (a, vecOut, i, r, j, initseq, val1, val2, repeat);

if( n<2>1"));

if( bigomega(n) == 1, print1("shorRSA: It's a prime number: ", n); return(););
if( bigomega(n) > 2, print1("shorRSA: You must insert a RSA number!"); return(););

vecOut=vector(2);

/* trivial case */
if( Mod(n,2)==0, vecOut[1]=2; vecOut[2]=floor(n/2); return(vecOut););
if( Mod(n,3)==0, vecOut[1]=3; vecOut[2]=floor(n/3); return(vecOut););
if( ispower(n,2)==1, vecOut[1]=floor(sqrt(n)); vecOut[2]=vecOut[1];return(vecOut); );

/* Strategy to choose the value a */
repeat = 1;
a=2;

while( repeat == 1 & a
/* if r odd then repeat = 1 */
while( repeat == 1,

repeat = 0;
r = 0;

/* We find a
while((gcd(a,n)!=1), a++;);


/* The first of the sequence */
initseq = a%n; /* a^1 mod n */

i=2;


/* We search the lenght of sequence jstep from the second element i=2 */
while( initseq != (a^i)%n, r++; if(flag==1, print1("."); i++; ));

r++;

if(r%2 != 0, repeat=1; print1("d", r););


);

j=r/2;

val1=(a^j)-1;
val2=(a^j)+1;

if(flag == 1, print1("\n\nr: ", r); print1("\nj: ", j););

vecOut[1]=gcd(val1,n);
vecOut[2]=gcd(val2,n);
if( vecOut[1]==1 | vecOut[2] == 1, repeat=1;);
a++;

);
return(vecOut);

}