• Non ci sono risultati.

Teoria dei numeri e Crittografia: lezione del 19 maggio 2011

N/A
N/A
Protected

Academic year: 2021

Condividi "Teoria dei numeri e Crittografia: lezione del 19 maggio 2011"

Copied!
1
0
0

Testo completo

(1)

Teoria dei numeri e Crittografia: lezione del 19 maggio 2011

Facciamo delle ultime considerazioni sull’algoritmo (p-1) di Pollard, illustrato nella lezione precedente.

1) L’algoritmo è efficiente soprattutto per input n che abbiano almeno un divisore primo p tale che nella fattorizzazione di (p-1) di in prodotto di potenze di primi distinti p- 1 = p p

1k1 2k2

.... p

rkr

le potenze p

iki

siano relativamente “piccole” (così è più probabile che p

iki

 B per ogni i=1,….,r).

2) Il valore di B nel passo 2) deve essere “abbastanza grande” ma non può essere “troppo grande”, perché il numero k calcolato nel passo 3) potrebbe diventare enorme, e calcolare d nel passo 6) potrebbe essere troppo oneroso in termini di potenza e lunghezza di calcolo

3) Nel passo 6) potrebbe essere oneroso calcolare d=mcd(a

k

-1,n), perché l’esponente k spesso è molto grande. Si può però risolvere tale problema nel modo seguente: si calcola (in modo efficiente con l’esponenziazione modulare) la riduzione b=a

k

modn (che è un numero <n) e si possono presentare 2 casi: se b>1, si ha d=mcd(a

k

- 1,n)=mcd(b-1,n) (come si dimostra facilmente da a

k

b (mod n) ; se invece b=1, allora na

k

-1, dunque d=mcd(a

k

-1,n)=n.

4) Infine notiamo che, oltre alla scelta di k=B! nel passo 3), si possono effettuare scelte più convenienti. Se per esempio è noto l’insieme di tutti i numeri primi  B:

{p

1

, p

2

,……., p

r

}

ed è quindi possibile ricavare l’insieme delle massime potenze di tali primi che siano  B : { p

1k1

, p

2k2

,...., p

rkr

}

è possibile allora assumere k = p p

1k1 2k2

.... p

rkr

ottenendo tra l’altro un valore in genere molto minore di B!.

Basta infatti osservare che tale k è in effetti multiplo di ogni naturale x B: infatti ogni tale x nella sua fattorizzazione in prodotto di potenze di primi distinti coinvolge alcuni dei p

i

, ognuno con esponente k

i

, quindi p p

1k1 2k2

.... p

rkr

è certamente multiplo di x.

Per esempio se B=10, allora B!=3628800, mentre il prodotto delle massime potenze di primi che siano  10 é 2

3

3

2

57=2520 (valore molto minore), ed è egualmente un numero multiplo di tutti i naturali  10.

Esempio.

Input n=2047: scegliamo B=10, k=2520 (vedere sopra), e fissiamo per esempio a=2: ovviamente 2, 2047 sono coprimi.

Calcolando con l’esponenziazione modulare, si ha b=a

k

modn=2, dunque, per quanto detto sopra, d=mcd(2

2520

-1,2047)=mcd(b-1,2047)=mcd(1,2047)=1, quindi l’algoritmo non ha successo (il fatto che d=1 implica che il valore B fissato non è abbastanza alto: quando B è un valore “buono” sappiamo che l’algoritmo può fallire solo se mcd(a

k

-1,n)=n).

Se (sempre con a=2) scegliamo un valore più alto di B, per esempio B=11, il valore di k è k=2

3

3

2

5711=27720, e in questo caso b=2

27720

mod2047=1, dunque, per quanto detto sopra, d=mcd(2

27720

-1,2047)=2047=n, e di nuovo l’algoritmo non ha successo (ma stavolta per la scelta di a).

Se invece manteniamo la scelta precedente B=10, k=2520 e modifichiamo il valore ponendo a=12 si ha:

b=12

2520

mod2047=357, d=mcd(b-1,2047)=mcd(356,2047)=89

e l’algoritmo trova un divisore non banale 89 di n=2047 (in effetti 2047=8923).

(2)

L’algoritmo del crivello quadratico di Pomerance.

Il maggior successo di questo algoritmo è stato, nel 1994, la fattorizzazione del numero RSA-129, un numero di 129 cifre (in base 10), la cui fattorizzazione nel 1977 era stato proposta come sfida dagli ideatori del sistema crittografico RSA: utilizzando per 8 mesi il lavoro in parallelo dei computers di circa 600 utenti di Internet, nell’aprile 1994 si è pervenuti alla fattorizzazione di RSA- 129 nel prodotto di 2 primi di 64 e 65 cifre.

L’algoritmo del crivello quadratico si ispira all’algoritmo di Fermat: dato un input n>1 dispari, l’algoritmo di Fermat fa variare r=  n ,  n +1,  n +2,….., e verifica se r

2

-n è un quadrato perfetto s

2

, in modo da scrivere n come differenza di quadrati n=r

2

-s

2

e trovare poi un divisore non banale di n.

L’algoritmo del crivello quadratico, invece, dato un input n>1 dispari da fattorizzare, cerca di trovare r, s naturali, tali che r

2

s

2

(mod n): l’esistenza di r,s non garantisce però sempre l’esistenza di un divisore proprio di n (come invece avveniva nell’algoritmo di Fermat).

Se però r non é congruo s modulo n, e poniamo d=mcd(r-s,n) (supponendo r>s), si ha che d è un divisore non banale di n: infatti se per assurdo fosse d=1 (quindi n, r-s coprimi) da n(r-s)(r+s) seguirebbe n(r+s), r -s (mod n), contraddizione; se invece fosse d=n, sarebbe d=n(r-s), da cui rs (mod n), contraddizione.

Quindi lo schema dell’algoritmo è il seguente: trovare una coppia di numeri naturali r,s (con r>s) tali che r

2

s

2

(mod n), verificare se r s (mod n), e in caso ciò non sia vero uscire con il valore d=mcd(r-s,n) come divisore non banale di n; se invece r s (mod n) ricercare una nuova coppia r,s.

Come però trovare r,s tali che r

2

s

2

(mod n) ?

Fissiamo un naturale K e calcoliamo l’insieme di tutti i numeri primi che siano K:

B={p

1

, p

2

, ………, p

t

} (B è detta una “base di fattori”).

Facciamo variare r=  n ,  n +1,  n +2,…. e calcoliamo in corrispondenza il numero naturale y=r

2

-n (nel caso banale in cui tale numero è 0, si ha n=r

2

e si è trovato un divisore non banale r di n) : si ha yr

2

(mod n): se r è “vicino” a n , il valore di y è relativamente “piccolo”, quindi è probabile che i suoi fattori primi siano tutti nella base di fattori B (se K è scelto

“abbastanza grande”).

Supponiamo di avere costruito un certo numero di valori y=y

1

, y

2

, ….., y

m

(in corrispondenza di valori r=r

1

, r

2

, ….., r

m

) tali che ogni y

i

abbia tutti i suoi fattori primi in B: questa fase è quella cosiddetta del “crivello” (vedremo in seguito una scelta opportuna per il numero m degli elementi y

i

da costruire).

Per ogni i=1,….,m determiniamo la fattorizzazione in prodotto di potenze di primi distinti di ogni y

i

(facile da calcolare perché conosciamo i primi p

1

, p

2

, ………, p

t

tra i quali vi sono i fattori primi di y

i

):

y

i

= p

1k1,i

p

2k2,i

... p

tkt i,

i=1,2,…..,m

(con esponenti k

j,i

0: in particolare k

j,i

=0 se il primo p

j

non è presente nella fattorizzazione di y

i

).

Per costruzione si ha r

i2

y

i

(mod n) per ogni i=1,2,…..,m (essendo y

i

= r

i2

– n).

Dunque si ottengono m congruenze modulo n:

r

12

y

1

(mod n)

r

22

y

2

(mod n)

……

(3)

……

r

m2

y

m

(mod n)

Se riuscissimo a determinare alcuni dei valori y

i

tali che il loro prodotto sia un quadrato perfetto s

2

, moltiplicando membro a membro le corrispondenti congruenze, alla fine otterremmo una congruenza della forma voluta r

2

s

2

(mod n) (dove r é il prodotto dei corrispondenti r

i

,) e potremmo (se r non é congruo s modulo n) trovare un divisore non banale di n.

Ma nel moltiplicare valori y

i

fra loro, i corrispondenti esponenti k

j,i

delle fattorizzazioni si sommano, e poiché un naturale è un quadrato perfetto se e solo se tutti gli esponenti della sua fattorizzazione sono multipli di 2, dobbiamo cercare alcuni valori y

i

tali che, per ogni primo p

j

,la somma dei corrispondenti esponenti k

j,i

sia un multiplo di 2: ma come essere certi che esistano, fra y

1

, y

2

, ….., y

m

, alcuni y

i

con tale proprietà e inoltre, se esistono, come determinarli ?

Per risolvere tale problema, possiamo appunto usare la teoria degli spazi vettoriali.

Supponiamo che il numero m degli elementi y

i

che abbiamo trovato sia maggiore del numero t di primi nella “base di fattori” B , per es. m=t+1 (questa è la scelta “opportuna” per m).

Associamo ad ogni y

i

la t-upla di interi non negativi formata ordinatamente dagli esponenti k

j,i

che compaiono nella fattorizzazione di y

i

:

y

i

 v(y

i

) = (k

1,i

, k

2,i

,…….., k

t,i

)

Se poi riduciamo tutti gli esponenti modulo 2, otteniamo una t-upla di termini 0 o 1:

y

i

 v

2

(y

i

) = (k

1,i

mod2, k

2,i

mod2 ,…….., k

t,i

mod2)

Possiamo trattare v

2

(y

i

) come vettore dello spazio vettoriale Z

2t

sul campo Z

2

= {0,1} (dove identifichiamo [0] con 0, [1] con 1 e nel fare i calcoli sulle classi utilizziamo le riduzioni modulo 2).

Cercare (fra y

1

,….., y

m

) alcuni y

i

il cui prodotto sia un quadrato perfetto, equivale, per le considerazioni precedenti, a cercare (fra i vettori v

2

(y

1

),….., v

2

(y

m

)) una somma di alcuni dei vettori che dia il vettore nullo in Z

2t

.

Poiché m>t, e poiché t è la dimensione dello spazio Z

2t

, i vettori v

2

(y

i

) (con i=1,2,…,m) sono linearmente dipendenti, dunque esiste una loro combinazione lineare a coefficienti 0,1 non tutti nulli che dà il vettore nullo e se consideriamo solo i vettori di tale combinazione che hanno coefficiente non nullo (quindi coefficiente =1), otteniamo una somma di alcuni dei vettori v

2

(y

1

),

…..,v

2

(y

m

) che dia il vettore nullo, e raggiungiamo il nostro obiettivo.

Dopo avere trovato questi vettori, se consideriamo i corrispondenti elementi (fra y

1

,…..,y

m

) siamo certi che il loro prodotto è un quadrato perfetto s

2

(dove la base s si ottiene facilmente dividendo per 2 tutte le componenti della t-upla ottenuta sommando le t-uple relative v(y

i

), e attribuendo i risultati come esponenti dei numeri primi p

1

, p

2

, ………, p

t

); si avrà inoltre r

2

s

2

(mod n) dove r è il prodotto dei valori r

i

corrispondenti agli elementi y

i

trovati.

Per trovare le somme di alcuni fra i vettori v

2

(y

i

) che danno come risultato il vettore nullo si può utilizzare il cosiddetto “metodo di eliminazione di Gauss” (che poi illustreremo): per ognuna di tali somme si trova la congruenza relativa r

2

s

2

(mod n), e se r non è congruo s modulo n, si è trovato un divisore non banale di n.

Nel ragionamento precedente è essenziale la scelta strategica della base di fattori B: se essa contiene molti primi, vi sono più probabilità di trovare “molti” valori y

i

che abbiano tutti i loro fattori primi in B, ma può diventare più complesso l’uso del metodo di eliminazione di Gauss, perché aumenta il numero m di vettori v

2

(y

i

) da manipolare (ricordiamo che deve essere m>B).

Possiamo però osservare che ogni primo pB che non sia “superfluo” (cioè che sia effettivamente divisore di qualcuno dei valori y

i

) deve essere tale che n sia un resto quadratico modulo p : infatti essendo y

i

=r

i2

-n si ha nr

2

(mod p), se p è divisore di y

i

.

Per la teoria dei resti quadratici, sappiamo che, essendo l’input n dispari, n è sempre resto

quadratico modulo 2 (quindi il primo 2 non è mai “superfluo” in B); invece per un primo dispari p si

ha che n è resto quadratico modulo p se e solo se (n/p)=1 (simbolo di Legendre), almeno se n non è

multiplo di p (ma se n è multiplo di p, abbiamo già un divisore non banale di n).

(4)

Dunque, nel costruire la base di fattori B, possiamo fissare una grandezza massima K, calcolare tutti i primi pK, ed escludere da B tutti i primi p>2 tali che (n/p)1 : il calcolo di (n/p) si fa con i soliti algoritmi, coinvolgendo numeri non molto grandi, anche se n è grande, in quanto sappiamo che (n/p)=(nmodp/p).

L’algoritmo del crivello quadratico di Pomerance si può allora implementare nel modo seguente:

1) input n dispari >1 2) si sceglie un intero K>0

3) si esaminano tutti i primi pK e si eliminano tutti i primi p>2 tali che (n/p)1, costituendo la base di fattori B={p

1

, p

2

, ………, p

t

}

4) facendo assumere ad r valori interi successivi  n , si trovano t+1 valori y=r

2

-n che abbiano tutti i loro fattori primi in B (per evitare che tale ricerca non abbia successo e si entri in un loop senza fine, si può porre un limite superiore ai valori assunti da r, e una volta raggiunto tale limite si ritorna al passo 2) con una scelta di K più grande)

5) per ognuno dei valori y

1

, y

2

, ….., y

t+1

si calcola la fattorizzazione in primi ed il vettore in Z

2t

: v

2

(y

i

) = (e

1

, e

2

, ……, e

t

)

dove e

i

è la riduzione modulo 2 dell’esponente di p

i

nella fattorizzazione di y

i

6) con il metodo di eliminazione di Gauss si determinano alcuni dei vettori v

2

(y

i

) che danno somma uguale al vettore nullo

7) si pone r uguale al prodotto degli r

i

corrispondenti agli y

i

trovati nel passo 6) e si pone s uguale al prodotto delle potenze di p

1

, p

2

,…, p

t

ognuna con esponente uguale alla semisomma degli esponenti presenti nella fattorizzazione degli stessi y

i

8) si calcola d=mcd(x-y,n) e se 1<d<n si esce con “d è divisore non banale di n ed n=d(n/d)”

altrimenti si torna al passo 2) con una scelta di K più grande (si è verificato evidentemente il caso x y (mod n) e l’algoritmo non ha avuto successo).

Prima di dare un esempio di fattorizzazione mediante l’algoritmo del crivelo quadratico, diamo alcuni cenni del metodo di eliminazione di Gauss, applicato in particolare sul campo Z

2

= {0,1} . Data una matrice con n righe ed m colonne (supponendo n<m), il metodo cerca di costruire una matrice “ridotta” con le seguenti proprietà:

- in ogni riga non identicamente nulla, la colonna che contiene il primo valore =1 (pivot) non contiene altri valori non nulli oltre il pivot

- in ogni riga non identicamente nulla, il pivot si trova a destra rispetto a tutti gli eventuali pivot delle righe precedenti

Per ottenere la matrice ridotta, i passi sono i seguenti:

1) porre i=1 (indice di riga), j=1 (indice di colonna)

2) se esiste nella colonna j e in una delle righe k con ki un valore =1, allora scambiare la riga i con la riga k (in modo che tale valore =1 si porti nella colonna j, riga i, costituendo il pivot);

se tale valore =1 non esiste allora andare al passo 5) (per incrementare l’indice j di colonna) 3) annullare tutti i valori =1 nella colonna j, tranne il pivot della riga i: per fare ciò basta

sostituire ogni riga ki (che contenga un valore 1 nella colonna j) con la somma di tale riga k e della riga i (ricordando che 1+1=0 in Z

2

)

4) incrementare l’indice di riga i ponendo i=i+1, e se i>n uscire; altrimenti proseguire con il passo 5)

5) incrementare l’indice di colonna j ponendo j=j+1, e se j>m uscire; altrimenti tornare al passo 2)

Se sono dati m vettori in Z

2t

con m>t:

v

1

= (a

11

, a

21

, …….., a

t1

) v

2

= (a

12

, a

22

, …….., a

t2

)

…..

(5)

…..

v

m

= (a

1m

, a

2m

, …….., a

tm

)

per determinare quali somme di alcuni dei v

i

danno il vettore nullo si procede nel modo seguente.

A partire dalla matrice txm che ha come colonne le coordinate dei vettori v

i

: M = (a

ij

) i=1,….,t, j=1,…..,m

si costruisce, con il metodo di Gauss, la matrice ridotta M

r

e si individuano le colonne di M

r

che non contengono nessun pivot, siano esse le colonne j

1

, j

2

, …., j

k

(con 1 j

1

, j

2

, …., j

k

m).

Per ognuno degli indici di colonna j

h

(con h=1,…,k) si costruisce una somma di vettori scelti fra i v

i

con il seguente criterio: uno degli addendi è il vettore v

jh

e gli altri addendi sono i vettori v

j

con indice j diverso da j

1

, j

2

, …., j

k

e tali che vi sia valore =1 nella riga j, colonna j

h

.

Le somme di alcuni dei v

1

, v

2

, …., v

m

che danno il vettore nullo sono appunto le k somme costruite in tal modo e anche tutte le possibili combinazioni lineari di tali somme con coefficienti 0,1.

Esempio.

Sia m=6, t=5, e siano dati i seguenti 6 vettori in Z

25

: v

1

= (0,0,1,1,0)

v

2

= (1,1,0,1,0) v

3

= (1,1,1,0,1) v

4

= (1,0,0,0,0) v

5

= (1,0,0,0,0) v

6

= (1,1,1,0,1)

La matrice originaria delle colonne di coordinate dei vettori é la seguente:

0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1

Procedendo con il metodo di Gauss, costruiamo la matrice ridotta.

Scambio delle righe 1 e 3 : 1 0 1 0 0 1

0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1

Azzeramento dei valori in colonna 1 : 1 0 1 0 0 1

0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 0 1

Azzeramento dei valori in colonna 2 : 1 0 1 0 0 1

0 1 1 0 0 1

0 0 0 1 1 0

0 0 0 0 0 0

0 0 1 0 0 1

(6)

Scambio delle righe 3 e 5 : 1 0 1 0 0 1

0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0

Azzeramento dei valori in colonna 3 : 1 0 0 0 0 0

0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0

Scambio delle righe 4 e 5 : 1 0 0 0 0 0

0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0

Azzeramento dei valori in colonna 4 : 1 0 0 0 0 0

0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0

La matrice ottenuta è la matrice ridotta, in cui le colonne 5 e 6 non contengono nessun pivot, quindi dobbiamo costruire 2 somme:

la prima è la somma v

4

+v

5

(l’indice 4 è l’unico 5,6 tale che vi sia valore =1 nella riga 4, colonna 5), mentre la seconda è la somma v

3

+v

6

(l’indice 3 è l’unico 5,6 tale che vi sia valore =1 nella riga 3, colonna 5).

Le 2 somme precedenti v

4

+v

5

, v

3

+v

6

e la loro (unica) combinazione lineare a coefficienti 0,1:

(v

4

+v

5

)+(v

3

+v

6

)

sono tutte le possibili somme di alcuni dei v

i

che danno il vettore nullo.

Esempio di fattorizzazione con il crivello quadratico.

Input n=16843009, con  n =4104.

Fissiamo K=13: i numeri primi pK sono 2,3,5,7,11,13.

Calcoliamo per ognuno il simbolo di Legendre (n/p).

Si ha per esempio, essendo nmod3=1: (n/3)=(1/3)=1.

Analogamente:

nmod5=4, (n/5)=(4/5)=(2

2

/5)=1; nmod7=1, (n/7)=(1/7)=1, nmod13=1, (n/13)=(1/13)=1.

Ma, applicando anche la legge di reciprocità quadratica:

nmod11=7, (n/11)=(7/11)=(11/7)(-1)

60/4

= -(11/7)=-(11mod7/7)= -(4/7)= -(2

2

/7)= -1.

Dunque dobbiamo escludere il primo 11, e la base di fattori è B={2,3,5,7,13}, di cardinalità t=5.

(7)

Facendo assumere ad r i valori 4104,4105,4106,….. e per ognuno calcolando y=r

2

-n, si cercano t+1=6 valori y che abbiano tutti i loro fattori primi in B, e si trovano:

r

1

= 4122 ; y

1

= 2

0

3

0

5

3

7

1

13

2

; v(y

1

)=(0,0,3,1,2), v

2

(y

1

)=(0,0,1,1,0) r

2

= 4159 ; y

2

= 2

7

3

1

5

0

7

1

13

2

; v(y

2

)=(7,1,0,1,2), v

2

(y

2

)=(1,1,0,1,0) r

3

= 4187 ; y

3

= 2

3

3

3

5

1

7

2

13

1

; v(y

3

)=(3,3,1,2,1), v

2

(y

3

)=(1,1,1,0,1) r

4

= 4241 ; y

4

= 2

5

3

6

5

0

7

2

13

0

; v(y

4

)=(5,6,0,2,0), v

2

(y

4

)=(1,0,0,0,0) r

5

= 4497; y

5

= 2

5

3

0

5

4

7

0

13

2

; v(y

5

)=(5,0,4,0,2), v

2

(y

5

)=(1,0,0,0,0) r

6

= 4993 ; y

6

= 2

9

3

5

5

1

7

0

13

1

; v(y

6

)=(9,5,1,0,1), v

2

(y

6

)=(1,1,1,0,1)

Cerchiamo alcuni degli v

2

(y

i

) che diano come somma il vettore nullo con il metodo di eliminazione di Gauss: i vettori sono esattamente quelli dell’esempio precedente.

Quindi le somme da esaminare sono v

2

(y

3

)+ v

2

(y

6

)=(0,0,0,0,0)

v

2

(y

4

)+ v

2

(y

5

)=(0,0,0,0,0)

v

2

(y

3

)+ v

2

(y

6

)+ v

2

(y

4

)+ v

2

(y

5

)=(0,0,0,0,0)

In corrispondenza della prima somma si trovano per esempio i valori r=r

3

r

6

=20905691, s=2

6

3

4

5

1

7

1

13

1

=2358720, r-s=18546971,d=mcd(r-s,n)=65537 e abbiamo trovato un divisore d=65537 non banale di n: in effetti n=65537257.

Possiamo migliorare l’efficienza dell’algoritmo del crivello quadratico.

Invece di procedere nel passo 4) con valori crescenti di r a partire da  n , possiamo scegliere un

“intorno” di  n  e considerare anche i valori r <  n  : quindi il passo 4) nell’algoritmo del crivello quadratico viene sostituito dalla variabilità di r nell’intervallo [ n -c ,  n +c] con c>0 naturale fissato.

Questo ci permette di avere valori mediamente più “vicini” a  n .

Ma se r è un valore <  n , il valore corrispondente y=r

2

-n è <0, dunque possiamo rappresentare y come y= -z, con z>0, e verificare se z abbia tutti i suoi fattori primi in B, e in caso positivo prendere y fra i valori “utili” y

i

.

Il problema è che, nel calcolare un prodotto degli y

i

che sia un quadrato perfetto (con la regola dei vettori di esponenti) l’eventuale segno negativo di alcuni y

i

potrebbe portare ad un segno negativo nel prodotto, e quindi ottenere invece l’opposto di un quadrato perfetto.

Ma si può ovviare a ciò introducendo nella base dei fattori B anche la base convenzionale p= -1 (come se fosse un ulteriore ”primo”): tale base ha esponente dipendente solo dal segno del numero, nel senso che se y>0, allora la fattorizzazione di y comprende anche un fattore (-1)

0

, mentre se y<0 la fattorizzazione di y comprende anche un fattore (-1)

1

(oltre che tutti gli altri fattori derivanti dalla fattorizzazione di –y>0).

In questo modo, applicando sempre la regola dei vettori di esponenti ridotti modulo 2, essendo anche la somma degli esponenti della base –1 multipla di 2, questo garantisce che il prodotto è positivo, dunque è esattamente un quadrato perfetto, e non l’opposto di un quadrato perfetto.

Esempio.

Input n = 1100017, con  n =1048.

Fissiamo K=17: i numeri primi p K sono 2,3,5,7,11,13,17.

Calcolando per ognuno il simbolo di Legendre (n/p), si verifica che (n/p)=-1 solo per p=5,11, dunque la base di fattori è B={-1,2,3,7,13,17} (notare l’aggiunta di -1), di cardinalità 6.

Facendo variare r da 1048-25=1023 a 1048+25=1073, e per ogni r calcolando y=r

2

-n, si cercano t+1=7 valori y che abbiano tutti i loro fattori primi in B (a meno del segno), e si trovano:

r

1

= 1025 ; y

1

= -49392=(-1)

1

2

4

3

2

7

3

13

0

17

0

; v(y

1

)=(1,4,2,3,0,0), v

2

(y

1

)=(1,0,0,1,0,0)

(8)

r

2

= 1033 ; y

2

= -32928=(-1)

1

2

5

3

1

7

3

13

0

17

0

; v(y

2

)=(1,5,1,3,0,0), v

2

(y

2

)=(1,1,1,1,0,0) r

3

= 1043 ; y

3

=-12168=(-1)

1

2

3

3

2

7

0

13

2

17

0

; v(y

3

)=(1,3,2,0,2,0), v

2

(y

3

)=(1,1,0,0,0,0) r

4

= 1047 ; y

4

=-3808=(-1)

1

2

5

3

0

7

1

13

0

17

1

; v(y

4

)=(1,5,0,1,0,1), v

2

(y

4

)=(1,1,0,1,0,1) r

5

= 1049; y

5

=384=(-1)

0

2

7

3

1

7

0

13

0

17

0

; v(y

5

)=(0,7,1,0,0,0), v

2

(y

5

)=(0,1,1,0,0,0) r

6

= 1061 ; y

6

=25704=(-1)

0

2

3

3

3

7

1

13

0

17

1

; v(y

6

)=(0,3,3,1,0,1), v

2

(y

6

)=(0,1,1,1,0,1) r

7

= 1063 ; y

7

=29952=(-1)

0

2

8

3

2

7

0

13

1

17

0

; v(y

7

)=(0,8,2,0,1,0), v

2

(y

7

)=(0,0,0,0,1,0).

Utilizzando il metodo di eliminazione di Gauss, troviamo le somme di alcuni di tali vettori che danno il vettore nullo.

Una di queste è per esempio v

2

(y

1

)+ v

2

(y

2

)+ v

2

(y

5

)=(0,0,0,0,0,0), e se si pone

r=r

1

r

2

r

5

=1110707425, s=2

8

3

2

5

0

7

3

13

0

17

0

=790272, r-s=1109917153, d=mcd(r-s, n)=n.

Questa somma che dà il vettore nullo non fornisce un divisore non banale di n.

Ma un’altra somma è anche v

2

(y

1

)+ v

2

(y

2

)+ v

2

(y

3

)+v

2

(y

4

)+v

2

(y

6

)=(0,0,0,0,0,0), e se si pone

r=r

1

r

2

r

3

r

4

r

6

, s=2

20

3

8

5

0

7

8

13

2

17

2

questa volta si ottiene, d=mcd(r-s,n)=547, divisore non banale di n.

Osservazione: nell’algoritmo si può anche decidere di costruire un numero m di y

i

che sia >t+1

(dove t è il numero di primi nella base di fattori), perché in tal modo il numero dei vettori è più

grande, e possono essere più numerose le somme di alcuni di essi che danno il vettore nullo, con

una maggiore possibilità che una di tali somme fornisca un divisore non banale di n .

Riferimenti

Documenti correlati

La dimostrazione precedente fornisce anche un algoritmo per il calcolo di una soluzione x (se essa esiste cioè se db): basta moltiplicare t (ottenuto dividendo b per d) per

Dimostriamo la (*): se ks allora è banale (in quanto ks&lt;rm dunque basta

Ricordiamo che un test di primalità probabilistico è un algoritmo tale che, dato in input un numero naturale n&gt;1, dopo una serie di calcoli che coinvolgono anche alcuni

Il numero dei valori possibili per la scelta dell’elemento casuale a nel test è (n-1); vediamo come possiamo valutare il numero dei valori a per i quali il test è superato, cioè

In un campo A vale la legge di annullamento del prodotto: comunque dati a,bA, se ab=0 A si ha a=0 A oppure b=0 A (equivalentemente se a,b0 A allora ab0 A

Siamo ora in grado di dimostrare il:. Teorema

Infatti basta per esempio scegliere m=minimo naturale ³j che sia multiplo di k-j : per tale scelta di m si ha allora b m =b 2m (perché m,2m³j, e perché 2mm (mod k-j),

Anche tale sistema crittografico, come quello di Cesare, è un sistema a sostituzione monoalfabetica (ogni lettera dell’alfabeto viene cifrata con