Algoritmo di fattorizzazione degli interi crivello quadratico

913 views

Published on

fattorizzazione degli interi con algoritmo quadratico

Published in: Travel, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
913
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Algoritmo di fattorizzazione degli interi crivello quadratico

  1. 1. Algoritmo di fattorizzazione degli interi: somme e sottrazioni di quadrati Di Cristiano Armellini (cristiano.armellini@alice.it)Sia il numero da fattorizzare. Consideriamo . AlloraOvvero si arriva facilmente all’equazione biquadratica 0 le cui soluzioni sono √ 4 2E per l’esistenza del radicale dovrò avere v > 2 n. A questo punto mi basterà far variare v negli interi finchénon otterrò un valore intero per q ovvero la decomposizione in fattori di n. Nell’ipotesi che p, q siano primisaranno certamente dispari quindi V dovrà essere pari e questo fatto velocizza ulteriormente la ricerca deifattori.In modo del tutto analogo , , . Dato che 2√ allorarisulterà che 2 √ .Ora ci porta all’equazione biquadratica 0, le cui soluzioni sono:
  2. 2. V > 0: √ 4 2Anche in questo caso se p, q sono numeri primi V deve essere pari.Ora testiamo i due algoritmi implementandoli con semplici programmi in C++Primo caso:#include <iostream>#include <stdlib.h>#include <math.h>using namespace std;int main(int argc, char *argv[]){double n;float p, q, v;cout << "inserisci numero da fattorizzare" << "n";cin >> n;v = 2*n;p = sqrt((v+sqrt(pow(v,2)-4*pow(n,2)))/2);q = sqrt((v-sqrt(pow(v,2)-4*pow(n,2)))/2);while (n/p != floor(n/p) or n/q != floor(n/q)){v = v+2;p = sqrt((v+sqrt(pow(v,2)-4*pow(n,2)))/2);q = sqrt((v-sqrt(pow(v,2)-4*pow(n,2)))/2);}cout << q << "n";cout << p << "n"; system("PAUSE"); return 0;}
  3. 3. Secondo caso#include <iostream>#include <stdlib.h>#include <math.h>using namespace std;int main(int argc, char *argv[]){double n;float p, q, v;cout << "inserisci numero da fattorizzare" << "n";cin >> n;v = 2*floor(sqrt(n));p = sqrt((-v+sqrt(pow(v,2)+4*pow(n,2)))/2);while (n/p != floor(n/p)){v = v+2;p = sqrt((-v+sqrt(pow(v,2)+4*pow(n,2)))/2);}cout << p << "n";cout << n/p << "n"; system("PAUSE"); return 0;}Normalmente dove è più veloce il primo algoritmo è più lento il secondo e viceversaOsservazione importante (varianti).Avremo anche potuto considerare , 1Ottenendo l’equazione 8ancora biquadratica: 0E ponendo per la soluzioneOppure
  4. 4. , 1, 0E ponendo per la soluzioneSia ora , , 2 allora: 2 quindi 2 0 2 2 4 2Con V > 4nAnalogamente , , 2 2Ovvero: 2 0 2 √ 4 2e V>0.Se invece consideriamo , procedendo come prima otteniamo: 0 √ 4 2Con √4 2√
  5. 5. Mentre se , ottengo dopo semplici passaggi: 0 √ 4 2E V >0.Ora cerchiamo di generalizzare i risultati precedenti: , , k m interi positivi,otteniamo l’equazione: 0 √ 4 2Con √4 2√Se invece , ho che 0 √ 4 2

×